安卓应用总结

时间:2024.4.13

安卓应用总结

一、Activity类

1、生命周期

Android 定义了一系列与生命周期相关的方法,在我们自己的 Activity 中,只是根据需要复写需要的方法,Java 的多态性会保证我们自己的方法被虚拟机调用(即回调方法)。 public class OurActivity extends Activity {

protected void onCreate(Bundle savedInstanceState);

setContentView(R.layout.main); //设置界面布局

protected void onStart(); //启动

protected void onResume(); //进入界面之前

protected void onPause();

protected void onStop();

protected void onDestroy();

}

onCreate==> onStart() ==> onResume() ==> running ==> onPause() ==> onStop() ==> onDestroy()

注 :在这些生命周期方法中 必须调用父类的该方法

2、 启动另外一个 Activity

Activity.startActivity()方法可以根据传入的参数启动另外一个 Activity:

Intent intent =new Intent(CurrentActivity.this,OtherActivity.class); startActivity(intent);

注:OtherActivity同样需要在AndroidManifest.xml中定义

3、Activity之间通信

在 Android 中,不同的 Activity 实例可能运行在一个进程中,也可能运行在不同的进程中。因此我们需要一种特别的机制帮助我们在 Activity 之间传递消息。Android 中通过 Intent 对象来表示一条消息,一个 Intent 对象不仅包含有这个消息的目的地,还可以包含消息的内容,这好比一封 Email,其中不仅应该包含收件地址,还可以包含具体的内容。对于一个 Intent 对象,消息“目的地”是必须的,而内容则是可选项。

?Intent的中文意思是目的。在Android中也是"目的"的意思。就是我们要去哪里,从这个activity要前往另一个Activity就需要用到Intent。 发件人:(CurrentActivity类中)

Intent intent =new Intent(CurrentActivity.this,OtherActivity.class); // 创建一个带“收件人地址”的 email

Bundle bundle =new Bundle();// 创建 email 内容

bundle.putBoolean("boolean_key", true);// 编写内容

bundle.putString("string_key", "string_value");

intent.putExtra("key", bundle);// 封装 email

startActivity(intent);// 启动新的 Activity

收件人:( OtherActivity类中)

Intent intent =getIntent();// 收取 email

Bundle bundle =intent.getBundleExtra("key");// 打开 email

bundle.getBoolean("boolean_key");// 读取内容

bundle.getString("string_key");

?使用 SharedPreferences

SharedPreferences 使用 xml 格式为 Android 应用提供一种永久的数据存贮方式。对于一个 Android 应用,它存贮在文件系统的 /data/ data/your_app_package_name/shared_prefs/目录下,可以被处在同一个应用中的所有 Activity 访问。Android 提供了相关的 API 来处理这些数据而不需要程序员直接操作这些文件或者考虑数据同步问题。 // 写入 SharedPreferences

SharedPreferences preferences = getSharedPreferences("name", MODE_PRIVATE); Editor editor = preferences.edit();

editor.putBoolean("boolean_key", true);

editor.putString("string_key", "string_value");

editor.commit();

// 读取 SharedPreferences

SharedPreferences preferences = getSharedPreferences("name", MODE_PRIVATE); preferences.getBoolean("boolean_key", false);

preferences.getString("string_key", "default_value");

4、Activity 的 Intent Filter

Intent Filter 描述了一个组件愿意接收什么样的 Intent 对象,Android 将其抽象为 android.content.IntentFilter 类。在 Android 的 AndroidManifest.xml 配置文件中可以通过 <intent-filter >节点为一个 Activity 指定其 Intent Filter,以便告诉系统该 Activity 可以响应什么类型的 Intent。

当程序员使用 startActivity(intent) 来启动另外一个 Activity 时,如果直接指定 intent 了对象的 Component 属性,那么 Activity Manager 将试图启动其 Component 属性指定的 Activity。否则 Android 将通过 Intent 的其它属性从安装在系统中的所有 Activity 中查找与之最匹配的一个启动,如果没有找到合适的 Activity,应用程序会得到一个系统抛出的异常。

?Action 匹配

Action 是一个用户定义的字符串,用于描述一个 Android 应用程序组件,一个 Intent Filter 可以包含多个 Action。在 AndroidManifest.xml 的 Activity 定义时可以在其 <intent-filter >节点指定一个 Action

安卓应用总结

那么所有的 Action 列表中包含了“com.zy.myaction”的 Activity 都将会匹配成功。

Android 预定义了一系列的 Action 分别表示特定的系统动作。这些 Action 通过常量的方式定义在 android.content. Intent中,以“ACTION_”开头。我们可以在 Android 提供的文档中找到它们的详细说明。

?URI 数据匹配

一个 Intent 可以通过 URI 携带外部数据给目标组件。在 <intent-filter >节点中,通过 <data/>节点匹配外部数据。

mimeType 属性指定携带外部数据的数据类型,scheme 指定协议,host、port、path 指定数据的位置、端口、和路径。如下: <data android:mimeType="mimeType" android:scheme="scheme"

android:host="host" android:port="port" android:path="path"/>

如果在 Intent Filter 中指定了这些属性,那么只有所有的属性都匹配成功时 URI 数据匹配才会成功。

?Category 类别匹配 <intent-filter >节点中可以为组件定义一个 Category 类别列表,当 Intent 中包含这个列表的所有项目时 Category 类别匹配才会成功。 5、一些关于 Activity 的技巧 ?锁定 Activity 运行时的屏幕方向

Android 内置了方向感应器的支持。在 G1 中,Android 会根据 G1 所处的方向自动在竖屏和横屏间切换。但是有时我们的应用程序仅能在横屏 / 竖屏时运行,比如某些游戏,此时我们需要锁定该 Activity 运行时的屏幕方向,<activity >节点的android:screenOrientation属性可以完成该项任务,示例代码如下: <activity android:name=".EX01"

android:label="@string/app_name"

android:screenOrientation="portrait">// 竖屏 , 值为 landscape 时为横屏

????

</activity>

?全屏的 Activity 要使一个 Activity 全屏运行,可以在其 onCreate()方法中添加如下代码实现:

// 设置全屏模式

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,

WindowManager.LayoutParams.FLAG_FULLSCREEN);

// 去除标题栏

requestWindowFeature(Window.FEATURE_NO_TITLE);

?在 Activity 的 Title 中加入进度条

为了更友好的用户体验,在处理一些需要花费较长时间的任务时可以使用一个进度条来提示用户“不要着急,我们正在努力的完成你交给的任务”。如下图:

在 Activity 的标题栏中显示进度条不失为一个好办法,下面是实现代码:

// 不明确进度条

requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

setContentView(R.layout.main);

setProgressBarIndeterminateVisibility(true);

// 明确进度条

requestWindowFeature(Window.FEATURE_PROGRESS);

setContentView(R.layout.main);

setProgress(5000);

二、布局

几种布局方式: View的布局显示方式有下面几种:线性布局(Linear Layout)、相对布局(Relative Layout)、表格布局(Table Layout)、网格视图(Grid View)、标签布局(Tab Layout)、列表视图(List View)、绝对布局(AbsoluteLayout)帧布局(Frame Layout)。

语:布局相对比较简单,这里不再详细介绍。

三、控件的使用

1、ListView、Spinner、GridView与Gallery

? ListView和Gallery ,Spinner有一个共同点:它们都是AdapterView的子类。AdapterView的显示可以通过数据绑定来实现,数据源可以是数组或是数据库记录,数据源和AdapterView是通过Adapter作为桥梁。通过Adapter,AdatperView可以显示数据源或处理用户选取事件

适配器有:BaseAdapter(较常用)、ArrayAdapter、SimpleAdapter

?加载数据的步骤

1) activity的layout中声明控件

2) 在layout/创建ListView的一个item所需要的layout文件 3) 初始化数据源 4) 初始化适配器 5) setAdapter

?各自实现的监听

ListView:onItemClickedListener onItemLongClickedListener Spinner:(只显示一项数据,通过弹出式Dialog从其他数据中选择一项) onItemSelectedListener GridView: android:columnWidth

android:numColumn android:strechMode android:horizontalSpacing android:verticalSpacing OnItemClickListener / OnItemLongClickListener

2、ImageSwitcher

为图片切换提供了简单动画效果,使用该控件时必须调用 setFactory()方法来构造一个ImageView控件 setImageResource()

3、AlertDialog

DialogInterface.OnClickListener

创建 :

new AlertDialog.Builder(context).setTitle().setMessage() / .setView(View

view).setPositiveButton()

.setNegitiveButton().create().show()

4、Menu的创建

? OptionsMenu 通过单击Menu按键出现

@Override

onCreateOptionsMenu() : 设置菜单项 menu.add() .setIcon() SubMenu subMenu = menu.addSubMenu() onOptionsItemSelected() : 处理菜单中某个子项被选中后的逻辑 int id = item.getItemId(); ? ContextMenu 通过在控件上长按出现 @Override

onCreateContextMenu() onContextItemSelected() 调用 registerForContextMenu(View view) 方法 ==> 为view设置ContextMenu

四、其他

1、数据存储

? Shared Preferences

项目内部/shared_prefs/*.xml 有格式的存储简单私有数据:long ,int , float , boolean , string 以key+value形式存储数据

SharedPreference get() // 读取数据 edit() //编辑 SharedPreference.Editor put() // 写入数据 commit() // 提交写入的数据 项目内部/files/*.* 项目内部存储私有数据 ?Internal Storage

FileInputStream fis = openFileInput(name) ; FileOutputStream fos = openFileOutput(name , mode); mode : Context.MODE_PRIVATE , Context.MODE_APPEND

?External Storage SD卡存储public数据 IO流常用class

File(文件,目录)

FileInputStream,FileOutputStream

FileReader, FileWriter

BufferedReader(readLine) / BufferedWriter

InputStreamReader / OutputStreamWriter (字节流==>字符流)

ByteArrayOutputStream(内存,toByteArray())

String (getBytes() , getBytes(String encode) , String(byte[]) , String(byte[] , encode))

External Storage

注意 :(Environment) 1) 先判断SD卡是否挂载(即sd卡是否可用) MOUNT if(! Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { // .......

return;

}

2) SD卡根位置不要去描述("/mnt/sdcard"),而是通过方法获取 String sdPath = Environment.getExternalStorageDirectory().getAbsolutePath() ; 3) 往SD卡写入数据时,需要给出写入权限(permission) android.permission.WRITE_EXTERNAL_STORAGE

④SQLite Database( SQLite数据库(适用于嵌入式开发的小规模数据库))

SQL : Structured Query Language 结构化的查询语言

表Table :存储数据,一行就是一条数据

基本SQL语句 :增,删,改,查

.sqlite3 进入数据库客户端 .tables 查看当前库下所有表 .schema 表名 查看表结构 .exit 退出SQLite客户端

1) 创建表

CREATE TABLE 表名(

列1定义 ,

列2定义, ...... ) 列定义 : 列名 数据类型 约束 数据类型 :integer,real,text,blob(大二进制) 其中text类型的值使用单引号'' 引起来 约束 : primary key 主键约束,要求该列值不能重复而且不能为null(一个表中只能有一个primary key约束)

not null 非空约束,要求该列必须有值

autoincrement 自增长标识列,该列不给出值时系统会自动赋值;要求该约束必须应用在 integer并且primary key列上

); check 条件表达式 ,要求该列的值必须满足条件表达式 default 值 默认约束,该列不给值,使用默认值 foreign key 外键约束,约束该列的值只能主表中关联列值,或者该列值为null _id integer primary key autoincrement, name text not null, tel text, score integer Eg: CREATE TABLE student(

2) 插入数据

INSERT INTO 表名 values(列1值, 列2值 , ...) // 每列都要给值,其中autoincrement列可以给值为null

INSERT INTO 表名(列1 , 列2 , ...) values(列1值, 列2值 , ...) // 按照表名后面的列给

3) 查看数据

SELECT 列1, 列2, ... // 其实可以使用 * 代表所有列

降序

字符)

select * from student where _id in(1,3); FROM 表名 [where 条件表达式] // 行过滤条件 [group by 分组表达式 [having 组条件表达式]] [order by 排序表达式 asc|desc] // 查询数据时,默认按照主键列升序 ,asc升序,desc特殊地:聚合函数 count(*) , count(表达式) count(*) 统计行数,count(表达式) 统计表达式的值不为null的行数 sum(表达式) , avg(表达式) max(表达式) , min(表达式) 条件描述 : 逻辑运算符 : and , or , not 关系运算符 : > , >= , < , <= , = , != , <> in(值1 , 值2 , ...) between ... and 字符列 like '值' :其中描述值时可以使用 _(匹配1个任意字符) 或者%(匹配任意个任意

select * from student where _id between 1 and 3; select name from student where name like '%a%'; select name from student where name like 'a%'; select name from student where name like 'a_'; select max(score),min(score) from student; select count(*) , count(tel) from student;

4) 更新数据 update

UPDATE 表名 SET 列名=值 , 列2名=值 , .... [WHERE 条件表达式]

update student set tel='65656512'; update student set tel='121212' where _id in(1,3,5,6); update student set score=60 where score<60 update student set score=score+10 where score<=90; 5) 删除数据 delete

DELETE FROM 表名 [WHERE 条件表达式] DELETE FROM student where score <= 75;

6) 删除表

DROP TABLE 表名

7)Android项目中操纵SQLite数据库

1) extends SQLiteOpenHelper {

@Override onCreate(SQLiteDatabase db) {

db.execSQL("建表语句") }

2) 调用 SQLiteOpenHelper的 getReadableDatabase() 或者 getWritableDatabase() 获取 SQLiteDatabase 对象 SQLiteDatabase insert() ==> long 刚插入的数据行id update() ==> int 更新的行数 delete() ==> int 删除的行数 query() ==> Cursor execSQL() ==> void

Cursor 游标

查询结果集的记录指针,Cursor起初位置在第一条记录之前

moveXXX() , 如 moveToNext() ==> boolean getXXX(int index) 如 getString(1) ==>String

2、ContentProvider(数据共享的唯一方式,数据存储在SQLiteDatabase里)

query(tableName , columns , where , where , group , having , order)

?访问ContentProvider数据 :

1) tableName ==> Uri ==> 类的常量 或者 一个字符串常量 2) columns ==> 类的常量 或者 字符串 3) ContentResolver : insert() , update() , delete() , query() getContentResolver()

?Uri 初始化 :Uri.parse(String uriStr) ==> Uri

Uri 字符串形式 :

1) 协议://资源唯一标识字符串/资源名

1) 协议://资源唯一标识字符串/资源名/id ?ContentUris ContentProvider 中的Uri都遵循"content"协议 ContentUris.withAppendedId(Uri , id) ==> Uri

3、Intent、Broadcast

?Intent

借助Intent可以startActvity() , startService() , sendBroadcast() Intent分为显式Intnet与隐式Intent : 显式Intent一般用于启动自定义的Activity; 隐式Intent需要借助Manifest文件中组件的<intent-filter>进行解析 Intent的组成部分 1) action ==> String setAction() 2) data ==> Uri (Uri.parse(String)) setData() 3) category ==> Activity 需要 Intent.CATEGORY_LAUNCHER Integer.CATEGORY_DEFAULT(默认) Intent.CATEGORY_HOME Intent.CATEGROY_BROWSABLE 4) extra putExtra() , getXXXExtra()

5) flag Intent.FLAG_ACTIVITY_NEW_TASK

如果在一个BroadcastReceiver中启动Activity,必须给Intent调用addFlag(),而且参数是Intent.FLAG_ACTIVITY_NEW_TASK

Intent 传参

1) Bundle 2) 传递参数是一个自定义class的object,要求该class必须implements接口Serializable或者 i. Serializable 接口是一个标识性接口,不含任何抽象方法 Parcelable

ii. Parcelabel 接口 : 要求实现所有抽象方法,而且必须含有一个Parcelable.Creator类型的静态域,而且名叫CREATOR】

? Broadcast 与 BroadcastReceiver

sendBroadcast(intent) 发送广播action ==> Receiver接收,action一致

BroadcastReceiver需要注册 i. manifest.xml中注册(常驻型广播Receiver)

<receiver>

<intent-filter> <action android:name="能收到的广播" /> ii. java代码注册(临时型广播Receiver)

IntentFilter addAction() registerReceiver(BroadcastReceiver , IntentFilter) unregisterReceiver(BroadcastReceiver);

BroadcastReceiver作用:

Broadcast 全局事件

BroadcastReceiver 全局事件监听器及逻辑处理

Broadcast 发送方

i. 自己 ii. 系统Broadcast的action

4、Service 服务

1) 运行在后台;启动可以通过startService(intent);Service并不单独开启线程

2) 使用 :i. 耗时任务;ii. Activity不在手机最前端,但是任务还要继续

3) onCreate() ==> 反复执行 onStartCommand() ==> onDestroy()

注:在Activity中启动Service,即便Activity退出,Service也可以不停止

5、AlarmManager、NotificationManager

AlarmManager,TelephonyManager,SmsManager,AssetManager,AppWidgetManager,AudioManager ?系统服务 Manager

AssetManager (getAssetManager) ==> 管理项目下 assets/ AlarmManager , NotificationManager SmsManager TelephonyManager

获取手机SIM卡相关信息,手机网络制式相关信息,手机呼叫状态等信息。

getLine1Number() // 本机号码 getSimSerialNumber() getCallState() // Idel , Ringing , OffHook(摘机)

案例 : BroadcastReceiver

<action android:name="android.intent.action.PHONE_STATE"/>

<action android:name="android.intent.action.NEW_OUTGOING_CALL"/> 先判断action是否是NEW_OUTGOING_CALL 获取打出号码

intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);

获取来电号码

intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);

?AlarmManager

行)

全局闹钟服务,安排某些任务在将来某一时刻执行(如果设置时间是过去时间,则任务马上执

i. set(int type , long timeMillions , PendingIntent pendingIntent) ii. setRepeat(int type , long timeMillions , long interval, PendingIntent pIntent) iii. cancel(PendingIntent pIntent)

注:cancel()时,PendingIntent的第四个参数flagId一样并且Intent的action一致。

?PendingIntent

包装了Intent,类似于Intent的送货员,包装了Intent的目标组件以及目标组件的位置 初始化 三个static方法选其一,选择依据是Intent要启动的组件类别

getActivity(Context , int , Intent , int) getService() getBoroadcast()

第二个参数int是PendingIntent的requestCode,目前使用0 第四个参数int是PendingIntent的flag标识id,自定义,建议>0 ④NotificationManager notify()[一般是在Receiver中设置] cancel() Notification 必须设置三个属性:icon , tickerText , when when属性的值一般是System.currentTimeMillions() 必须调用一个方法: setLatestEventInfo() 一般设置flags: Notification.FLAG_AUTO_CANCEL

时间相关class:

Date getTime() Calendar getTimeInMillions() System.currentTimeMillions()

⑤SmsManager 发送短信

权限 : SEND_SMS

static getDefault() divideMessage() sendTextMessage()

短息发送成功接收Receiver,判断

if(getResultCode() == Activity.RESULT_OK) {}

⑥AudioManager简介

安卓应用总结

在程序获取了AudioManager

安卓应用总结

对象之后,接下来就可调用AudioManager的如下常用方法: ⑦LocationManager

位置服务 LocationManager 与 Location,经纬度

1. LocationProvider

GPS : 精确度高,耗电量大,流量低

NETWORK : 精确度低,耗电量小,流量高

2. Location

getLongitude() 经度 getLatitude() 纬度

3. LocationListener

4. LocationManager

requestLocationUpdate(); 5. Baidu 控件MapView

1) 添加第三方包

2) 权限

3) <com.baidu.mapapi.MapView ... android:clickable="true" />

4) extends MapActivity {

private BMapManager bMapMan ;

private MapView mapView;

private MapViewController controller; @Override onCreate() { bMapMan = new BMapManager(this); } ..... bMapMan.start() bMapMan.init(mapKey, null); super.initMapActivity(bMapMan); bMapMan.stop() bMapMan.destroy() 5) GeoPoint 需要经纬度 * 1E6

6) MapViewController

setCenter() // 一次

animateTo() // 移动到新的定位位置

6. 在地图上增加标识

1) extends Overlay { @Override draw() } 2) mapView.getOverlays().add(YourOverlayObject)

6、多媒体技术 MediaPlay

i. static MediaPlayer create(int resId) // resId是音频资源的id ii. reset() , setDataSource() , prepare()

iii. start() , pause() , stop() , seekTo() , isPlaying() v. release()

vi. setLooping() , isLooping()

vii. setOnCompletionListener() 监听当前歌曲播放结束

注意 :MediaPlayer的以上方法中,部分方法的调用有先后顺序,不能跳跃

读取手机上的音频文件

Audio.Media

String albumUriStr = "content://media/external/audio/albumart"; Uri albumUri = Uri.parse(albumUriStr) ;

MediaRecorder 录音(参考api)

权限 RECORD_AUDIO

保存在sd卡上,文件扩展名是 amr

VideoView

<activity

android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" android:screenOrientation="landscape"

setMediaController(new MediaController(context)); setVideoPath() start() stopPlayBack()

7、Handler

android规定 :非主线程不允许更新主线程控件外观

可以通过给主线程Activity的Handler发消息,Handler收到消息后执行更新任务 Service中如果想更新控件外观,也通过Handler实现

Handler :

有两个对列:消息Message队列;任务Runnable队列

发送消息 sendXXXMessage() 收到消息后执行任务

@Override handlerMessage(Message msg) { // 判断消息的类别(来源),然后执行相应的任务 } Message : 初始化 : i. new ii. handler.obtainMessage() 四个public成员变量: int what : 设置/获取消息类别 int arg1 , arg2 : 设置/获取整数类型参数 Object obj : 设置/获取复杂类型参数

8、Internet网络访问

Browser,输入url ==> 发出请求Request ==> Server 查找资源 响应请求Response<== Request模式 :GET 与 POST

GET : 上传数据和url绑定在一个数据包中,格式为

url?参数名=值&参数2=值&...

POST : 上传的数据和url分别在不同的数据包,上传数据也是需要name/value 网络请求步骤

1) 2) 3) 网络访问权限 初始化连接对象 设置网络连接相关参数 连接时长、读取资源时长、请求方式 4) 连接到网络 5) 如果网络响应代码是200,获取网络数据(网络输入流)

Eg:

// 2)

// 3)

URL url = new URL(urlStr) ; HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(10 * 1000) ; conn.setReadTimeout(10 * 1000); conn.setRequestMethod("GET") ;

// 4)

conn.connect();

// 5)

if(200 == conn.getResponseCode()) {

InputStream is = conn.getInputStream();

// 如果请求的资源是文本,可以获取编码

String contentType = conn.getContentType();

String encode = null;

if(contentType.indexOf('=') >= 0) {

encode = contentType.substring(contentType.indexOf('=') + 1) ; }

}

网络上数据传输常用两种数据格式:xml与json

xml文本,在使用pull或者sax方式进行解析时,是基于事件驱动的。 五种事件 :文档开始/结束;标记开始/结束;文本

使用PULL方式解析xml数据

1) 观察xml文档,找出你要的数据;如果数据量小,直接将结果保存进变量;否则需要定义class,保存到对象或者集合

安卓应用总结

2) 开始解析 i. 初始化XMLPullParser ii. 设置解析源 iii. 获取第一个事件 ==> 文档开始事件 iv. 反复读取后面的每一个事件,找出你要的数据,直到读取到文档结束事件

可 while() SAX解析 SAX是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。而且相比于DOM,SAX以在解析文档的任意时刻停止解析,但任何事物都有其相反的一面,对于SAX来说就是操作复杂。

对于解析过程中的每一步都会有事件发生,都会触发相应接口中的事件处理程序。

编写程序的步骤为:

(1).创建事件处理程序(也就是编写ContentHandler的实现类,一般继承自DefaultHandler类,采用adapter模式)

(2).创建SAX解析器

(3).将事件处理程序分配到解析器

(4).对文档进行解析,将每个事件发送给事件处理程序

安卓应用总结

9、WebView 1. 加载数据

loadData(String , "text/html" , "utf-8");

loadUrl(url);

2. 设置支持JS,Zoom webView.getSettings().setSupportZoom(true) ;

webView.getSettings().setBuiltInZoomControls(true); webView.getSettings().setJavaScriptEnabled(true) ;

3. 设置进度条

4. 设置web内容在当前WebView中显示

5. 设置“返回”按键的动作是退回历史记录

6. 设置当前WebView所在的Activity是浏览器

manifest.xml

获取应用程序外部传递的url

getIntent().getData().toString()

TextView 内容设置为超级连接:

String url = "网址";

String show = "TextView所显示的文字" ;

tv.setText(Html.fromHtml("<a href=\""+url+"\">"+show+"</a>")) ; tv.setMovementMethod(LinkMovementMethod.getInstance()) ;

10、OnGestureListener 手势监听

1)extends Activity implements OnGestureListener {

private GestureDetector gesture;

@Override onTouchEvent(MotionEvent ev) { return gesture.onTouchEvent(ev); } // onGestureListener 应该实现的抽象方法 @Override onFling(MotionEvent e1 , MotionEvent e2 , ....) { 左右滑动的判定:e1和e2的x值之差 x1 - x2 > 距离 ==> 自右向左 x2 - x1 > 距离 ==> 自左向右 } 2) extends View implements OnGestureListener { private GestureDetector gesture; @Override onTouch(MotionEvent event) { return gesture.onTouchEvent(event); } @Override dispatchTouchEvent(MotionEvent ev) { if(gesture.onTouchEvent(ev)) { ev.setAction(MotionEvent.ACTION_CANCEL) ; } return super.dispatchTouchEvent(ev) ; }; // onGestureListener 应该实现的抽象方法 @Override onFling(MotionEvent e1 , MotionEvent e2 , ....) { 左右滑动的判定:e1和e2的x值之差 x1 - x2 > 距离 ==> 自右向左 x2 - x1 > 距离 ==> 自左向右 } }

11、项目中添加sdk以外的其他类库

i. 项目中创建一个文件夹,命名为libs

ii. 将第三方jar文件拷贝到libs中

iii. 选中该jar文件,右键 :Build Path ==> Add to build Path

然后该jar包中的class就可以在项目中被使用

12、ViewPager 内置有手势左右方向滑动的View切换处理 1) 需要 android-support-v4.jar

2) layout中声明控件

<android.support.v4.ViewPager ... />

3) 适配器 :

extends PageAdapter

* 成员变量 : Context , List<View>

* 还要重写两个方法 : instantiateItem() , destroyItem()

4) 准备数据源 List<View>

// 添加layout:控件不需要监听器;添加Activity

data.add(LayoutInflater.from(this).inflate(R.layout.page1, null)) ; LocalActivityManager activityMan = new LocalActivityManager(this, true);

activityMan.dispatchCreate(savedInstanceState) ;

View pageView2 = activityMan.startActivity("page2", new Intent(this , Page2.class)).getDecorView() ;

data.add(pageView2) ;

5) viewPager.setAdapter(adapter)

6) ViewPager 监听器 setOnPageChangeListener

13、AppWidget 1、创建步骤:

1) layout/*.xml

描述AppWidget外观

2) 定义一个class extends AppWidgetProvider

3) res/xml/*.xml ==> AppWidgetProviderInfo

描述AppWidget的元数据

4) manifest.xml 注册AppWidget

<receiver android:name="MyAppWidget" > <intent-filter>

<action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter>

<meta-data

android:name="android.appwidget.provider"

android:resource="@xml/providerinfo" />

</receiver>

2、AppWidget中控件所显示数据的更新,或者控件添加监听器的实现

RemoteViews

AppWidagetManager AppWidgetManager appMan = AppWidgetManager.getInstance(context); // 只更新一个AppWidget appMan.updateAppWidget(appId, views); // 更新所有AppWidget ComponentName comName = new ComponentName(context, MyAppWidget.class) ; appMan.updateAppWidget(comName, views) ;

3、AppWidget的配置信息Activity

1) 创建一个Activity,manifest.xml注册时

<intent-filter>

<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" /> </intent-filter>

2) AppWidget ProviderInfo 的xml文件中添加

android:configure="包名.Activity名字"

3)

i . 获取AppWidget的ID

// 获取要安装的AppWidget的Id

Bundle bundle = getIntent().getExtras();

if(bundle != null) {

appId = bundle.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID , -1) ; }

if(appId == -1) {

return;

}

ii . 执行逻辑处理

....

更新AppWidget

设置返回信息

Intent resultIntent = new Intent();

resultIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appId); setResult(RESULT_OK, resultIntent);

关闭当前Activity

finish();

五、动画部分

1. Android 中的Animation动画 :

1) tweened animation 渐变动画,对场景中图像等做不同的变化处理 2) frame-by-frame animation 逐帧动画,按照顺序播放预先做好的动画帧

1) 四种 :alpha,translate,scale,rotate

2) Animation类是四种动画class的基类,还有一个派生类是AnimationSet

3) 声明 :

i. java 代码 AlphaAnimation , TranslateAnimation , ScaleAnimation , RotateAnimation ii. xml 中声明 2. tweened animation

/res/anim/*.xml <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="/apk/res/android"> <alpha/> <scale/> <translate/> <rotate/> </set> 注意 : android:fillAfter="true" 写在set下面,其他属性写在动画自己内部 android:pivotX , android:pivotY 属性值 : 整数 ==> 绝对定位 ?% ==> 相对自身定位

?%p ==> 相对parent定位

translate动画: android:fromXDelta,android:toXDelta,android:fromYDelta,android:toYDelta属性值写法同上

4)

java代码加载动画 Animation animation = AnimationUtils.loadAnimation(Context , R.anim.?); 所有动画通用效果设置 setDuration() 时长 setFillAfter(true) 动画播放结束后停留在结束点 setFillBefore(true) 动画播放结束后停留在开始点 setRepeatCount() 动画重复播放的次数 setStartOffset() 动画播放时间的相对偏移量

setInterpolator()

5) 控件加载动画

setAnimation()

startAnimation()

6) AnimationSet

AnimationSet 可以包含多个Animation,但都是在同一个时间执行的,是并行,不是串行执行的。

如果AnimationSet中有一些设定,如duration,fillBefore等,它包含的子动作也设定了的话, 子动作中的设定将会给覆盖掉。

7) 动作特效:

Interpolator 定义了动画的变化速度,可以实现匀速、正加速、负加速、无规则变加速等

共5中,Interpolater是这些速度变化class的基类 AccelerateDecelerateInterpolator,延迟减速,在动作执行到中间的时候才执行该特效。 AccelerateInterpolator, 会使慢慢以(float)的参数降低速度。 LinearInterpolator,平稳不变的 DecelerateInterpolator,在中间加速,两头慢。 CycleInterpolator,曲线运动特效,要传递float型的参数。

更多相关推荐:
有用的安卓总结

一文字的滚动显示ltTextViewandroidlayoutwidthquot100dipquotandroidlayoutheightquotwrapcontentquotandroidellipsizeq...

安卓自学总结

Activity是安卓中视图的部分负责界面显示创建的类都是Activity的子类子类要重写onCreate方法SetContentViewRlayoutmain方法是给Activity设置可以显示的视图View...

安卓技术总结

安卓技术总结目录引言21用法22WebView返回键回退23WebView退出停止播放音频视频34FragmentStatePagerAdapter调用notifyDataSetChanged失效3引言忽然之间...

安卓实训的总结与体会

安卓实训的总结与体会不知不觉中为期三周的实训已经接近尾声。虽然时间很短,不过我确实学到了一些我觉得有用的东西,并且是平时上课学不到的东西。三周的实训,时间很短,确实很短。原本刚开始,乃至之前听说有为期三周的实训…

安卓面试基础知识总结

1Activity11Activity的概念是Android应用层开发的四大组件之一主要负责和用户交互部分有自己的生命周期在其上可以布置按钮文本框等各种控件简单来说就是Android的UI部分12Activit...

安卓handler总结

Android中的Handler总结一Handler的定义主要接受子线程发送的数据并用此数据配合主线程更新UI解释当应用程序启动时Android首先会开启一个主线程也就是UI线程主线程为管理界面中的UI控件进行...

安卓音乐播放器个人总结格式 (sya)

目录1项目总结..................................................................................................…

安卓专业技总结(一)

建议自己再做整理吸收最好自己简历的技能点要自己能hold住切勿贪多和撞车改吧改吧技能点的说辞大家可以用文档结构图格式查看排版很好JAVA技能有良好的JAVA基础熟练掌握面向对象思想理解面向对象面向对象是一种思想...

安卓锁屏密码忘了6种解决方法总结

安卓锁屏密码忘了6种解决方法总结第一种方法用别人的手机打你的电话然后手机就会进入系统再进设置里去掉自动锁屏当提示输入gmail密码的时候填写null补充说明适用部分机子跟ROM关系也很大成功率不保证第二种方法恢...

手机安卓系统测试经验总结

手机安卓系统简介及测试经验总结一Android简介Android安卓系统是手机或一些平板电脑等终端的操作系统可以说是现在最流行的系统之一是目前最流行的手机智能平台目前广泛的应用在智能手机上在智能手机领域掀起了A...

安卓实验总结

北京联合大学实训报告学院信息学院专业通信工程班级学号姓名实验内容1了解安装开发环境2建立项目3两个界面的跳转关系4建立主菜单及面实验总结为期两周的实训科结束了在此过程中我获益匪浅按照实验指导书一步步的做下来虽然...

安卓应用开发教程WebView总结

本文由麦可网收集整理转载请注明出处AndroidWebView总结1添加权限AndroidManifestxml中必须使用许可quotAndroidpermissionINTERNETquot否则会出webpa...

安卓总结(18篇)