Android界月老Intent详解

1.什么是Intent?

  • Intent中文意思是 “意图、目标”,它是Android为应用间和应用内提供的交互与通讯的“信使”,你也可以称它为Android界月老。
  • Intent是一种运行时绑定(runtime binding)机制,在程序运行的过程中,它可以连接多个不同的组件。通过Intent,你的程序可以向Android表达某种意图,Android会根据请求的内容筛选出符合要求的组件来响应。

2.Intent的使用场景:

   a.在Activity之间:

  • 使用Activity.startActivity() 或 Activity.startActivityForResult(),传入一个intent来启动一个activity。

       

  • Activity.startActivityForResult()是用于回传数据的,第一个参数是intent,第二个参数是请求码(请求码用于之后在onActivityResult回调中判断数据的来源),我们在SecondActivity中通过Activity.setResult()向MainActivity返回数据,第一个参数是向上一个活动(MainActivity)返回的处理结果,一般使用RESULT_OK或RESULT_CANCELED,第二个参数是携带了要传输的数据的intent。

      

b.在广播中的使用:

  • 创建intent对象,设置广播的action,设置组件,最后通过sendBroadcast()发送一个普通广播。P个S:sendBroadcast实际调用的是ContextImpl的sendBroadcast。ContextImpl这个文件是保护文件,就是注解了是内部保护文件,所以在eclipse,Androidstudio中都是不显示的。所以可以去SDk的安装目录中的sources文件夹中直接找那个Java文件,/android-sdk/sources/android-28/android/app/ContextImpl.java。

     

  • 容我再P个S:我的手机是9.0系统,刚开始写上面的demo时,没有加setComponent这一行,怎么整都接受不到广播,后来查看谷歌官网对于8.0的变更有这么一条:

     

  • 也就是说,我们也可以通过对广播接受器进行动态注册解决这个问题。貌似扯远了。。。

c.在service中的使用:

   

3.Intent的属性:

  • component(组件):要跳转到的目标组件
  • action(动作):用来指定意图的行为
  • category(类别):用来指定动作的类别
  • data(数据):表示与动作要操纵的数据
  • type(数据类型):对于data范例的描写
  • extras(扩展信息):扩展信息
  • Flags(标志位):期望这个意图的运行模式

下面逐个学习这些属性:

a.component(组件)

在介绍Component之前,我们首先来了解ComponentName这个类;ComponentName与Intent同位于android.content包下,这个类主要用来定义可见一个应用程序组件,通过查看源码,我们了解到他有五个构造方法:

案例:新建两个应用:TaobaoApp、BaiduApp,在“淘宝”界面拉起“百度”界面:

在TaobaoApp主界面中,我们通过ComponentName(String pkg,String cls)构造方法(第一个参数是目标组件的包名,第二个参数是目标组件具体的类名:)实例化ComponentName对象,并将它传入intent:

在BaiduApp主界面只做简单的展示:

b.action(动作)

此标签用于指定当前组件可以执行哪些操作,可以指定多个action,比如当前组件启动的intent指定的action与其他组件在<intent-filter>所列出的任意一个匹配的话,当前组件就可以完成这个action:

常用的Action如下所示:

  • ACTION_CALL activity 启动一个电话.  
  • ACTION_EDIT activity 显示用户编辑的数据.  
  • ACTION_MAIN activity 作为Task中第一个Activity启动  
  • ACTION_SYNC activity 同步手机与数据服务器上的数据.  
  • ACTION_BATTERY_LOW broadcast receiver 电池电量过低警告.  
  • ACTION_HEADSET_PLUG broadcast receiver 插拔耳机警告  
  • ACTION_SCREEN_ON broadcast receiver 屏幕变亮警告.  
  • ACTION_TIMEZONE_CHANGED broadcast receiver 改变时区警告. 

两条原则:
(1)一条<intent-filter>元素至少应该包含一个<action>,否则任何Intent请求都不能和该<intent-filter>匹配。
(2)如果Intent请求的action和<intent-filter>中个任意一条<action>匹配,那么该Intent就可以启动该activity(前提是除了action的其它项也要匹配通过)。
两条注意:
如果Intent请求或<intent-filter>中没有说明具体的action类型,那么会出现下面两种情况:
(1)如果<intent-filter>中没有包含任何action类型,那么无论什么Intent请求都无法和这条<intent-filter>匹配。
(2)如果Intent请求中没有设定action类型,那么只要<intent-filter>中包含有action类型,这个Intent请求就将顺利地通过<intent-filter>的行为测试。

c.category(类别)

Category用来指定当前动作(action)被执行的环境,也就是说组件在哪种环境中才能被激活。
常用的Category属性如下所示:

  • CATEGORY_DEFAULT:Android系统中默认的执行方式,按照普通Activity的执行方式执行。表示所有intent都可以激活它   
  • CATEGORY_HOME:设置该组件为Home Activity 
  • CATEGORY_PREFERENCE:设置该组件为Preference   
  • CATEGORY_LAUNCHER:设置该组件为在当前应用程序启动器中优先级最高的Activity,通常与入口ACTION_MAIN属性配合使用
  • CATEGORY_BROWSABLE:设置该组件可以使用浏览器启动,表示该activity只能用来浏览网页。   
  • CATEGORY_GADGET:设置该组件可以内嵌到另外的Activity中

注意:如果该组件想要通过隐式intent方式激活,那么不能没有任何category设置,至少包含一个android.intent.category.DEFAULT

持续更新。。。

猜你喜欢

转载自blog.csdn.net/qq_35101450/article/details/88313682