Android Intent

  1.  Intent可以启动Activity,Service,Broadcast,Intent有以下几部分组成:动作,数据,分类,类型,组件,扩展信息,Intent在寻找目标组件时有两种方法:第一通过组件名称直接决定,第二通过Intent Filter过滤指定.

  2. Intent提供了多个重载的方法来携带额外的数据,最终数据都是放在Bundle中:
    • putExtras(Bundle data):向Intent中放入所需要携带的数据包
    • Bundle getExtras():获取Intent所携带的数据包
    • putExtras(String name, XXX value):向Intent中按key-value对的形式存入数据
    • getXxxExtra(String name):从Intent中按key取出指定类型的数据,Xxx:是不同的数据类型,如char,int等

  3. Bundle是一个简单的数据携带包,该对象中包含了多个方法来存入数据
    • putXxx(String key,Xxx data):向Bundle中放入Int,Long等各种类型的数据
    • putSerizlizable(String key,Serializable data):向Bundle中放入一个可序列化的对象
    • getXxx(String key):从Bundle中取出Int,Long等各种类型的数据
    • getSerializable(String key,Serializable data):从Bundle中取出一个可序列化的对象

  4. Intent中包含的信息主要有:
    • Action:是Intent要完成的动作,是个字符串常量,可以自定义,Intent.SetAction设置Action,系统有很多自定义Action,一个Intent只能包含一个Action
      Action常量 对应字符串 简单说明
      ACTION_MAIN android.intent.action.MAIN 应用程序入口
      ACTION_VIEW
      android.intent.action.VIEW
      显示指定数据
      ACTION_ATTACH_DATA
      android.intent.action.ATTACH_DATA
      指定某块数据将被附加到其他地方
      ACTION_EDIT
      android.intent.action.EDIT
      编辑指定数据
      ACTION_PICK
      android.intent.action.PICK
      从列表中选择某项并返回所选的数据
      ACTION_CHOOSER
      android.intent.action.CHOOSER
      显示一个Activity选择器
      ACTION_GET_CONTENT
      android.intent.action.GET_CONTENT
      让用户选择数据,并返回所选数据
      ACTION_DIAL
      android.intent.action.DIAL
      显示拨号面板
      ACTION_CALL android.intent.action.CALL
      直接向指定用户打电话
      ACTION_SEND
      android.intent.action.SEND
      向其他人发送数据
      ACTION_SENDTO
      android.intent.action.SENDTO
      向其他人发送消息
      ACTION_ANSWER
      android.intent.action.ANSWER
      应答电话
      ACTION_INSERT
      android.intent.action.INSERT
      插入数据
      ACTION_DELETE
      android.intent.action.DELETE
      删除数据
      ACTION_RUN
      android.intent.action.RUN
      运行数据
      ACTION_SYNC
      android.intent.action.SYNC
      执行数据同步
      ACTION_PICK_ACTIVITY
      android.intent.action.PICK_ACTIVITY
      用于选择Activity
      ACTION_SEARCH
      android.intent.action.SEARCH
      执行搜索
      ACTION_WEB_SEARCH
      android.intent.action.WEB_SEARCH
      执行Web搜索
      ACTION_FACTORY_TEST
      android.intent.action.FACTORY_TEST
      工厂测试的入口点

    • Data:是执行动作的URI和MIME类型,不同的Action有不同的Data数据指定,如在一个Intent中设置Action_View,Data设为www.baidu.com,StartActivity(intent)时就会打开baidu网站.MIME的格式为abc/xyz: 其中abc为数据的大类型,xyz为数据的具体类型,常一起使用的Action和data:
      • ACTION_VIEW content://contacts/people/1:显示identifier是1的person的信息
      • ACTION_DIAL content://contacts/people/1:显示电话拨号程序并填入该person的号码
      • ACTION_VIEW tel:123 :显示电话拨号程序并填入指定号码
      • ACTION_DIAL tel:123  :显示电话拨号程序并填入指定号码
      • ACTION_EDIT content://contacts/people/1:编辑指定person的信息
      • ACTION_VIEW content://contacts/people:显示people列表
    • Category:一个执行Action的附加信息,标准category有:
      Category常量 对应字符串 简单说明
      CATEGORY_DEFAULT android.intent.category.DEFAULT 默认的Category
      CATEGORY_BROWSABLE
      android.intent.category.BROWSABLE
      指定该Activity能被浏览器安全调用
      CATEGORY_TAB
      android.intent.category.TAB
      指定该Activity作为TabActivity的Tab页
      CATEGORY_LAUNCHER
      android.intent.category.LAUNCHER
      Activity显示顶级程序列表中
      CATEGORY_INFO
      android.intent.category.INFO
      用于提供包信息
      CATEGORY_HOME
      android.intent.category.HOME
      设置该Activity随系统启动而运行
      CATEGORY_PREFERENCE
      android.intent.category.PREFERENCE
      该Activity是参数面板
      CATEGORY_TEST
      android.intent.category.TEST
      该Activity是一个测试
      CATEGORY_CAR_DOCK
      android.intent.category.CAR_DOCK
      指定手机被插入汽车底座(硬件)时运行该Activity
      CATEGORY_DESK_DOCK
      android.intent.category.DESK_DOCK
      指定手机被插入桌面底座(硬件)时运行该Activity
      CATEGORY_CAR_MODE            
      android.intent.category.CAR_MODE
      设置该Activity可在车载环境下使用
    • Extras:添加一些组件的附加信息
    • Type:表示Data所指定Uri对应的MIME类型,type类型通常是从Data的Uri中隐式推导的,如果显示指定了type,隐式推导就不会进行。type与Data可能会相互覆盖,除非调用Intent的setDataAndType方法.在AndroidManifest.xml中为组件声明data,type属性都通过<data>元素,如下所示,mimeType表示该组件所匹配的intent的type属性
      <Activity>
      <intent-filter>
                       <action android:name="android.intent.action.GET_CONTENT" />
                       <category android:name="android.intent.category.DEFAULT" />
                       <data android:mimeType="vnd.android.cursor.item/vnd.google.note" />
      </intent-filter>
      </Activity>
    • Flag: 通常用Activity.launchMode属性替代Flag的作用
      public void startSite(View source) {
              Uri uri = Uri.parse("http://baidu.com");
              Intent it = new Intent(Intent.ACTION_VIEW, uri);
              startActivity(it);
          }
      
          public void startCalldial(View source) {
              Uri uri = Uri.parse("tel:0800000123");
              Intent it = new Intent(Intent.ACTION_DIAL, uri);
              startActivity(it);
          }
      
          public void startSms(View source) {
              Uri uri = Uri.parse("content://contacts/people/1");
              Intent it = new Intent(Intent.ACTION_VIEW, uri);
              it.putExtra("sms_body", "The SMS text");
              it.setType("vnd.android-dir/mms-sms");
              startActivity(it);
          }

  5. 当系统通过Intent启动指定的Activity时,如果系统没有找到合适的Activity,会导致程序异常,但通过Intent激发BroadcastReceiver时,如果找不到合适的BroadcastReceiver组件,应用不会有任何问题

  6. PendingIntent类是一种特殊的Intent,主要区别是Intent是立即执行,而PendingIntent不是立刻执行,pendingintent 执行的操作实际是参数传来的Intent操作,使用pendingintent的目的在于它所包含的Intent的操作的执行时需要满足某些条件的,主要使用的地方有:通知Notification的发送,短信SmsManager的发送和警报器AlarmManager的执行等,Intent与PendingIntent的区别如下:
    • Intent是立即使用的,PendingIntent可以等到事件发生后出发,比如当用户点击了通知栏的nocation的时候才会跳转到 应用的某一个activity,PendingIntent可以cancel
    • Intent在程序结束后终止,pendingIntent在程序结束后依然有效
    • Pending自带Context,而Intent需要再某个Context中运行
    • Intent在原Task中运行,PendingIntent在新的Task中运行
 
原文地址:https://www.cnblogs.com/phenixyu/p/3969132.html