Intent
一.Intent的介绍 Intent的中文意思是“意图,意向” 在Android中提供了Intent机制来协助应用间的交互与通讯 Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给 调用的组件,并完成组件的调用 Intent不仅可用于应用程序之间,也可用于应用程序内部的 Activity/Service之间的交互 可以将Intent理解为不同组件之间通信的“媒介”专门提供组件互相调用的 相关信息。
二.Inten启动组件的方法 Activity startActvity( ) startActivityForResult( ) Service startService( ) bindService( ) Broadcasts sendBroadcasts( )
三.Intent的属性 Intent有以下几个属性: 动作(Action), 数据(Data), 分类(Category), 类型(Type), 组件(Compent) 以及扩展信(Extra)。
private static final String ATTR_ACTION = "action"; private static final String TAG_CATEGORIES = "categories"; private static final String ATTR_CATEGORY = "category"; private static final String TAG_EXTRA = "extra"; private static final String ATTR_TYPE = "type"; private static final String ATTR_COMPONENT = "component"; private static final String ATTR_DATA = "data"; private static final String ATTR_FLAGS = “flags"; 其中最常用的是Action属性和Data属性。
1.Intent的Action属性 Action是指Intent要完成的动作,是一个字符串常量。SDK中定义了一些标准的Action常量如下表所示。 ACTION_CALL activity:Initiate a phone call. ACTION_EDIT activity:Display data for the user to edit. ACTION_MAIN activity:Start up as the initial activity of a task, with no data input and no returned output. ACTION_SYNC activity:Synchronize data on a server with data on the mobile device. ACTION_BATTERY_LOW broadcast receiver:A warning that the battery is low. ACTION_HEADSET_PLUG broadcast receiver:A headset has been plugged into the device, or unplugged from it. ACTION_SCREEN_ON broadcast receiver The screen has been turned on. ACTION_TIMEZONE_CHANGED The setting for the time zone has changed.
Intent intent = new Intent(); // 设置Intent Action属性 intent.setAction(Intent.ACTION_GET_CONTENT); // 设置Intent Type 属性 主要是获取通讯录的内容 intent.setType("vnd.android.cursor.item/phone"); startActivity(intent);
2.Intent的Data属性 Intent的Data属性是执行动作的URI和MIME类型 ,不同的Action有不同的Data数据指定。比如: ACTION_EDIT Action应该和要编辑的文档URI Data匹配,ACTION_VIEW应用应该和要显示的 URI匹配。
3.Intent的Category属性 Intent中的Category属性是一个执行动作Action的附加信 息 比如: CATEGORY_HOME则表示放回到Home界面, ALTERNATIVE_CATEGORY表示当前的Intent是一系列 的可选动作中的一个 下表是SDK文档中关于Category的信息。
CATEGORY_BROWSABLE The target activity can be safely invoked by the browser to display data referenced by a link — for example, an image or an e-mail message. CATEGORY_GADGET The activity can be embedded inside of another activity that hosts gadgets. CATEGORY_HOME The activity displays the home screen, the first screen the user sees when the device is turned on or when the HOME key is pressed. CATEGORY_LAUNCHER The activity can be the initial activity of a task and is listed in the top-level application launcher. CATEGORY_PREFERENCE The target activity is a preference panel.
Intent intent = new Intent(); intent.setAction(Intent.ACTION_MAIN);// 添加 Action属性 intent.addCategory(Intent.CATEGORY_HOME);// 添加Category属性 startActivity(intent);// 启动Activity
三、Activity的启动模式: Activity有四种启动模式:standard、singleTop、 singleTask、singleInstance。 可以在AndroidManifest.xml中activity标签的属性 android:launchMode中设置该activity的加载模式 。
standard模式:默认的模式,以这种模式加载时,每当启动一个新的活动,必定会构造一个新的Activity实例放到返回栈(目标 task)的栈顶,不管这个Activity是否已经存在于返回栈中; singleTop模式:如果一个以singleTop模式启动的activity的实例已经存在于返回桟的桟顶,那么再启动这个Activity时,不会 创建新的实例,而是重用位于栈顶的那个实例,并且会调用该实例的onNewIntent()方法将Intent对象传递到这个实例中; 注:如果以singleTop模式启动的activity的一个实例已经存在于返回桟中,但是不在桟顶,那么它的行为和standard模式相同 ,也会创建多个实例; singleTask模式:这种模式下,每次启动一个activity时,系统首先会在返回栈中检查是否存在该活动的实例,如果存在,则直 接使用该实例,并把这个活动之上的所有活动统统清除;如果没有发现就会创建一个新的活动实例; singleInstance模式:总是在新的任务中开启,并且这个新的任务中有且只有这一个实例,也就是说被该实例启动的其他 activity会自动运行于另一个任务中。当再次启动该activity的实例时,会重新调用已存在的任务和实例。并且会调用这个实例 的onNewIntent() 方法,将Intent实例传递到该实例中。和singleTask相同,同一时刻在系统中只会存在一个这样的Activity实例。 (singleInstance即单实例) 注:前面三种模式中,每个应用程序都有自己的返回栈,同一个活动在不同的返回栈中入栈时,必然是创建了新的实例。而使 用singleInstance模式可以解决这个问题,在这种模式下会有一个单独的返回栈来管理这个活动,不管是哪一个应用程序来访 问这个活动,都公用同一个返回栈,也就解决了共享活动实例的问题。(此时可以实现任务之间的切换,而不是单独某个栈中 的实例切换)