史上全Intent详解 intently

博客 常识 2023-05-13 05:22:18 17 1

intent,0.Intent介绍 Intent中文翻译:意图。描述组件想要别的Activity或service做的事情(Action)或本组件已经完成的事情(广播)。 用于传递给系统,让...

详情


史上全Intent详解 intently

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