intent,0.Intent介绍 Intent中文翻译:意图。描述组件想要别的Activity或service做的事情(Action)或本组件已经完成的事情(广播)。 用于传递给系统,让...
详情
0.Intent介绍
- Intent中文翻译:意图。描述组件想要别的Activity或service做的事情(Action)或本组件已经完成的事情(广播)。
- 用于传递给系统,让系统启动Activity、service或广播。
- 也可以组件间互相通信的信息对象。主要是附加的Extra等。
- 用Intent启动组件分为显示Intent和隐式Intent,指定了目标组件就是显式,没有指定,由操作系统弹出组件选择对话框的就是隐式。
- android5.0之后不允许使用隐式Intent启动Service
- 发送广播,将发送给所有broadcast receiver
- intent是发送给安卓系统的。特别是flags是给系统看的。告诉系统一些启动方式。详细见后面。
1.启动组件示例
1.1 显式启动Activity示例
//同一个包里Intent i = new Intent(MainActivity.this,PhotoShowActivity.class);startActivity(i);//不同包。packagename和classname的获得后面详细说明。如下例子用来启动微信。Intent startwx = new Intent().setClassName("com.tencent.mm","com.tencent.mm.ui.LauncherUI");startActivity(startwx);
1.2隐式启动Activ示例
Intent startupIntent = new Intent(Intent.ACTION_MAIN) .addCategory(Intent.CATEGORY_LAUNCHER);startActivity(startupIntent);
1.3 显式启动Service示例
//同一个包里Intent i = new Intent(MainActivity.this,UpdateIntentService.class);startService(i);
1.4 发送广播
//发送广播,用于启动接收器。public static final String ACTION_SHOW_MYACTION = "str"sendBroadcast(new Intent(ACTION_SHOW_MYACTION))
2.Intent的组成
- Action: 描述本Intent(意图)的动作。如查看图片,打电话,电量不足(广播)等。实际上是一个String,Intent类自带了很多常量,当然可以自己定义。
- Category:可选类别。描述如何做这个事情。当然也可以自己定义。
- Data:包含数据定位,用Uri表示。可以是一个文件或url或数据库的一条记录指针
- type:MIME Type。
- Flag:如何启动一个组件,如,文档多开,新增加任务等。
- Extra:附加数据,可以putExtra String、int等数据或对象(Parcelable、Serializable)
- 目标组件:目标Activity。
- 显示Intent和隐式Intent、广播等所必须包含的组成不一样
- 事实上这些组成在Intent中是用实例变量来实现的
3.Intent使用详解
3.1常用方法
主要是设置Intent的组成变量
//setter有相对的getter。hasExtra("keyName")//判断是否有这个Extra,返回booleansetAction(String action)setClass(Context packageContext, Class> cls)setClassName(String packageName,className)setData(Uri data)setType(String type)setDataAndType(Uri data, String type)addCategory(String category)addFlags(int flags)putExtra()//或指定数据类型,如putBooleanExtraputStringArrayExtra()//数组getExtra()//或指定数据类型,如getBooleanExtrasetComponent()setClass()setClassName()
3.2.常用构造函数
Intent()Intent(String action)Intent(String action,Uri uri)Intent(Context packageContext,Class> cls)
3.3.发送Intent的方法(如何发送意图)
startActivity()startActivityForResult()//该 Activity 销毁后会回调到上个Activity的 onActivityResult()startService()bindService()sendBroadcast() //标准广播sendOrderedBroadcast()//有序广播
4.Intent过滤器
- Intent过滤器主要是给Activity和Broadcastreceiver使用
- 主要目的是过滤Intent,符合过滤器条件的Intent才能保留并发给组件
- 组件利用Intent过滤器声明自己能接收的Intent的种类。等于是声明组件能做什么。比如声明这个组件能打电话或查看图片或查看联系人等。
- 主要是声明自己能响应的action,category,data,type等
5.Intent过滤器过滤细节
- path 和 mimeType 允许使用*通配符,实现部分匹配。
- Activity,必须在Mainifest.xml文件中声明 Intent 过滤器。
- 广播接收器可以动态声明
- 一个组件可以有多个 Intent 过滤器,某个 Intent 只需与其中任何一个匹配即可启动组件。
- 比配顺序:先匹配action,然后category,然后是data
5.1 Action匹配规则
- Intent 只能包含一项 action,而 Intent 过滤器可以包含多项 action,只要 Intent 的 action 可以在 Intent 过滤器中找到对应项即可通过测试。
- 当 Intent 过滤器未声明任何 action 时,任何 Intent 都不能通过匹配。
- 当 Intent 未指定 Action 时,无法通过匹配。
5.2category 的匹配规则
- Intent 可以包含多项 category,Intent 过滤器也可以包含多项 category。Intent 中的每项 category 必须在Intent过滤器中都有对应项,才能通过匹配。
- 当目标组件为 Activity 时,如需相应隐式 Intent,必须添加 "android.intent.category.DEFAULT" 到 Intent 过滤器中。因为启动Activity的方法都会默认为Intent添加该 category。
- 目标组件为广播时,Intent 和 Intent 过滤器都不设置 category,可通过匹配。
5.3data的匹配规则
- 将 Intent 中的 URI 与过滤器中的 URI 规范进行比较时,它仅与过滤器中包含的部分 URI 进行比较。 例如:
如果过滤器仅指定 scheme,则具有该 scheme 的所有 URI 均与该过滤器匹配。
如果过滤器指定 scheme 和 host,但未指定 path,则具有相同 scheme 和 host 的所有 URI 都会通过过滤器,无论其 path 如何均是如此。
如果过滤器指定 scheme、host和path,则仅具有相同 scheme、host 和 path 的 URI 才会通过过滤器。
path 部分可以使用通配符,仅需部分匹配路径名即可。
-mimeType 可以部分使用通配符,如:image/(表示匹配所有格式图像数据),也可以全部使用/ 表示匹配所有类型数据。 - 当Intent同时不指定 uri 与 mimeType 时,只有同样未声明 uri 与 mimeType 的 Intent 过滤器可以通过匹配。
- 当 Intent 只含有 uri 时,只有声明 uri 相互匹配,且未声明 mimeType 的 Intent 过滤器可以通过匹配。
- 当 Intent 只含有 mimeType 时,只有 mimeType 相互匹配,且未声明 uri 的 Intent 过滤器可以通过匹配。
- 当 Intent 同时含有 uri 和 mimeType 时,只有两部分均匹配的 Intent 过滤器可以通过匹配。
- Intent过滤器只声明mimeType时,默认支持scheme为content: 和 file: 的uri
- 当 Intent 传入的 uri 为 content: URI 时,表明数据位于设备中,且由 ContentProvider 控制,此时即使不设置 mimeType,mimeType 也对系统可见。
6.隐式Intent的细节
6.1非空判断
用隐式Intent启动Activity的时候要进行非空判断。如果没有Activity能响应Intent,而又进行了startActivity操作,就会造成程序崩溃。
PackageManager pm = getActivity().getPackageManager();if (pm.resolveActivity(intent,Flag常量) != null){}//或者if(intent.resolveActivity(pm) != null){}//或者if(pm.queryIntentActivities(intent,0).size() != 0)
6.2强制显示Activity选择器
有时候用户在Activity选择界面中勾选了默认启动的Activity。这种情况下,可以强制显示Activity选择器。当然,如果只有一个Activity响应。就不会弹出这个界面。
Intent.createChooser(intent,"title");//类静态方法。当然也可以如下使用:intent.createChooser(intent,"title");//这个方法返回的intent不是本身!!!所以如果用链式调用,要嘛放在最后面,要嘛不要放进链式调用。
6.3隐式Intent的显式调用
如下代码可以获得packageName和className,用于启动不同app的Activity。比如说启动微信。
当然也可以查阅对应app的文档说明
查询广播接收器也有类似方法。
PackageManager pm = getActivity().getPackageManager();List infos = pm.queryIntentActivities(intent,0);for (ResolveInfo resolveInfo : infos) { String strPackageName = resolveInfo.activityInfo.applicationInfo.packageName; String strClassName= resolveInfo.activityInfo.name; intent = new Intent().setClassName(strPackagename,strClassname); startActivity(intent)}CharSequence resolveInfo.loadLabel(pm)//返回程序的标签名称Drawable resolveInfo.loadIcon(pm)//返回程序的icon
附件1.启动Activity流程(显式 Intent 和隐式 Intent)
7 常用Intent
有一些功能是调用其它组件来实现,本应用也要申请对应的权限
7.1打开浏览器
Uri uri = Uri.parse("");Intent intent = new Intent(Intent.ACTION_VIEW, uri);
7.2浏览图片
Intent intent = new Intent(Intent.ACTION_VIEW) .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) .setDataAndType(imgFileUri,"image/*");
7.3打开拨号界面
Intent intent = new Intent(Intent.ACTION_DIAL) .setData(Uri.parse("tel:15907870569"));
7.4直接拨打电话
Intent intent = new Intent(Intent.ACTION_CALL) .setData(Uri.parse("tel:15907870569"));
7.5发送短信(无联系人)
Intent startIntent = new Intent() .setAction(Intent.ACTION_VIEW) .putExtra("sms_body", "SMS text")// 这里有点奇怪。按道理应该是一个常量才对 .setType("vnd.android-dir/mms-sms");
7.6回退到桌面
Intent startIntent = new Intent() .setAction(Intent.ACTION_MAIN) .addCategory(Intent.CATEGORY_HOME) .addCategory(Intent.CATEGORY_DEFAULT);
7.7ACION_SEND
7.8ACION_VIEW
8 常用Flag介绍
注意Flag是发送给系统的,让系统根据这些flag来启动组件
Flag | 含义 |
---|---|
FLAG_ACTIVITY_NEW_TASK | 新任务打开Activity |
FLAG_ACTIVITY_NEW_DOCUMENT Intent.FLAG_ACTIVITY_MULTIPLE_TASK | 启动并发文档 |
FLAG_GRANT_READ_URI_PERMISSION | 授权访问file |
附件2.广播流程
参考文章
1.
2.
3.
您还可以搜索:intention,intentionally,intently,intentional,intent的作用,intensive,intent翻译,intent和intention的区别,intention翻译,intentions歌词④
intent
版权声明:如发现本站有涉嫌抄袭的内容请联系客服!
推荐 : #tag #tag #tag
湖南方言土话大全(湖南常德各地方方言)
浮舟沧海立马昆仑意思,浮舟沧海立马昆仑怎么解释啊