Android 之 Intent 和 IntentFilter

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讲义》 电子工业出版社


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值