Android Intent和Intent过滤器
这一系列文章记载自己从新在Google官网学习Android的记录,从前一直看各种书籍总觉得并不是看的很清楚有些书还彼此写的很矛盾。听了公司师兄的建议在google上看教程。
1.Intent介绍
Google上介绍
Intent 是一个消息传递对象,您可以使用它从其他应用组件请求操作。尽管 Intent 可以通过多
个人理解
Intent就是一个信使,负责在组件(Activity,Service,Broadcast)之间通信。
启动 Activity
startActivity(),startActivityForResult()
启动服务
bindService(),startService()
传递广播
sendBroadcast()、sendOrderedBroadcast() 或 sendStickyBroadcast()
2.Intent类型
看过很多书大家都喜欢像google的介绍文档上一样,将他分成显式和隐式两种
Intent显式:访问指定的类名的组件
Intent隐式:访问符合条件的组件
简单理解就跟找对象一样,加入张三(高富帅),李四(高富帅),王五(矮穷挫)
Intent显式:我想找叫做张三的人
Intent隐式:我想找 高,富,帅 那么张三,李四都符合你的条件。
3.Intent使用
一:如何区分显式和隐式呢?
显示:调用intent.setComponent()、intent.setClassName()或者intent.setClass()方法去具体到想要访问组件的类名。
我们在写代码的时候经常会这么写
Intent intent=new Intent(MainActivity.this,TestIntent.class);
startActivity(intent);
这个时候就会疑问 为什么这里也没有调用intent.setComponent()、intent.setClassName()或者intent.setClass()为什么这个就是显示的Intent呢?其实上面的代码等同于
ComponentName componentName=new ComponentName(this,TestIntent.class);
Intent intent=new Intent();
intent.setComponent(componentName);
startActivity(intent);
隐式:没有明确要去送信的组件,只是说了组件具有哪些属性特征
例如 setAction(“”); addCategory(“”); setData(Uri.parse(“”));setType(“”);通过明确属性去启动符合这些属性特征的组件
Intent intent=new Intent();
intent.setAction("android.intent.action.WHB");
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
上面的代码等同于
Intent intent=new Intent("android.intent.action.WHB");
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
看下Intent的构造函数就会明白了。
public Intent(String action) {
throw new RuntimeException("Stub!");
}
加上if判断是因为:如果找不到对应属性的组件会使程序崩溃,所以在写程序的时候最好加上保险。
填坑
很多人在第一次用intent隐式的时候会发现报一种异常android.content.ActivityNotFoundException:No Activity found to handle Intent
这是因为没有在AndroidManifest中定义
<category android:name="android.intent.category.DEFAULT" />
在我使用隐式Intent的时候,只指定了一个Intent的Action,而没有指定一个Category。这样会导致在调用startActivity()这个方法和startActivityForResult()的时候会自动添加一个Category(android.intent.category.DEFAULT)
为了确保应用的安全性,启动 Service 时,请始终使用显式 Intent,且不要为服务声明 Intent 过滤器。使用隐式 Intent 启动服务存在安全隐患,因为您无法确定哪些服务将响应 Intent,且用户无法看到哪些服务已启动。从 Android 5.0(API 级别 21)开始,如果使用隐式 Intent 调用 bindService(),系统会引发异常。
二:Intent主要信息
1.要启动的组件名称
2.操作(Action)
3.数据(若要同时设置 URI 和 MIME 类型,请勿调用 setData() 和 setType(),因为它们会互相抵消彼此的值。请始终使用 setDataAndType() 同时设置 URI 和 MIME 类型。)
4.类别(一个包含应处理 Intent 组件类型的附加信息的字符串。 您可以将任意数量的类别描述放入一个 Intent 中,但大多数 Intent 均不需要类别)
5.Extra(使用 putExtras() 将Bundle 插入 Intent)
6.标志(setFlags())