Android 的应用程序包含三种重要组件: Activity, Service, BroadcastRecevier, 它们都是通过 Intent来进行启动的,同时Intent还可以用于被启动组件交换信息。
Intent对象大致包含Component, Action, Category, Data, Type, Extra和Flag七种属性。属性决定了Intent具体启动什么组件。
Component属性
Component属性需要接受一个ComponentName对象
ComponentName comp = new ComponentName(String pkg, String cls); // 创建pkg所在包下的cls类所对应的组件
Intent intent = new Intent();
intent.setComponent(comp);
// <==>等价于
Intent intent = new Intent(String pkg, String cls);
当程序通过Intent的Component属性(明确指定了启动哪个组件)启动特定组件时,被启动组件几乎不需要使用<intent-filter...>元素进行配置
Action, Category属性与intent-filter配置
Action代表Intent所要完成的一个抽象“动作”,而Category则用于为Action增加额外的附加类别信息。通常Action属性会与Category属性结合起来使用
Action要完成的只是一个抽象的动作,这个动作具体由哪个组件来完成取决于<intent-filter.../>配置,简单说来就是一个activity设置自己的action后,可以通过intent来启动,但具体谁会被启动,就要看谁的<intent-filter>配置中设置了这个action,而如果有多个或者没有,则会由package 进行处理,弹出选择窗口或出错窗口。
如在一个Activity里面存在如下代码:
Intent intent = new Intent();
intent.setAction (String actionStr);
intent.addCategory (String categoryStr);
startActivity(intent);
若要能正确启动该Intent,需要有一个组件的AndroidManifest.xml具有如下配置:
<intent-filter>
<action android:name="actionStr"/>
<category android:name="categoryStr"/>
<catetory android:name="android.intent.category.DEFAULT"/>
</intent-filter>
注: 一个Intent对象最多只能包括一个Action属性,程序可以调用Intent的setAction方法来设置Action属性值; 但一个Intent对象可以包含多个Category属性,程序可调用Intent的addCategory(String str) 方法来Intent添加Category属性。当程序创建Intent时,该Intent默认启动Category属性值为 Intent.
android内部本身提供了大量标准Action, Category常量, 可以参考Android Intent Refer
Data, Type属性与intent-filter配置
Data属性用于向Action属性提供操作的数据。其接收一个Uri对象。
Type属性用于明确指定Data属性所指定了数据的类型或MIME类型。通常来说,当Intent不指定Data属性时Type属性才会起作用,否则Android系统将会根据Data属性值来分析数据的类型,因此无须指定Type属性。
浏览特定网页:
String data = "http://www.google.com.hk";
Uri uri = Uri.parse(data); // 根据指定字符串解析出Uri对象
intent.setAction(Intent.ACTION_VIEW); // 为Intent设置Action属性
intent.setData(uri);
startActivity(intent);
编辑联系人:
Intent (Action = Intent.ACTION_EDIT, Data = content://com.android.contacts/contacts/1);
进行拨号:
Intent (Action = Intent.ACTION_DIAL, Data = tel:10086);
Extra属性
Extra属性通常应用在多个Action之间进行数据交换,为一个Bundle对象(类似一个Map对象,可以存入多组key-value对)
intent.putExtras(Bundle data): 向Intent中放入需要“携带”的数据
而Bundle存入数据的方法有:
bundle.putXxx(String key, Xxx data): 向Bundle放入Int, Long等各种类型的数据
bundle.putSerializable(String key, Serializable data): 向Bundle中放入一个可序列化的对象
取出数据的方法有:
bundle.getXxx(String key)
bundle.getSerializable(String key, Serializable data)
例如Activity 1放入如下数据中:
Person p = new Person(name, passwd, gender);
Bundle data = new Bundle();
data.putSerializable("person", p);
Intent intent = new Intent(pkg, cls);
intent.putExtras(data);
Activity 2被Intent调出后获取Activity 1中存入的数据:
Intent intent = getIntent();
Bundle data = intent.getExtras();
Person p = (Person)data.getSerializable("person");
使用Intent创建Tab页面
主要利用TabHost.TabSpec的方法:
setContent(int viewld): 直接将指定View组件设置成Tab页的Content
setContent(Intent intent): 直接将指定Intent对应的Activity设置成Tab页的Content
TabHost tabHost = getTabHost();
tabHost.addTab(tabHost.newTabSpec("tab1"))
.setIndicator("TabName")
.setContent(intent);
练习程序:
Refer: 李刚 《疯狂Android讲义》 电子工业出版社