基础篇:5.熟练掌握Intent机制

  前言

    在讲解Intent之前,先来回顾下之前在哪些方面接触过这东西:

    (1)启动Activity:startActivity(Intent intent);  startActivityForResult(Intent intent);

     (2)发送广播: Context.sendBroadcast(Intent intent); Contxt.sendOrderBroadcast(Intent intent);

       (3)启动或绑定Service:  Context.startService(Intent intent);  Context.bindService(Intent intent);

  由此可见,android的三大组件都是通过Intent进行激活和各组件间进行数据传输,那么何为Intent?!

  Intent简介

  Intent是android程序中传输数据的核心对象,Intent在官方文档中的定义为:执行某操作的一个抽象描述。这个定义理解起来不是很直观。个人更喜欢这个定义:Intent负责对应用中一次操作的动作、动作涉及的数据、附加数据进行描述。Intent起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。

  Intent构成

  (1)ComponentName

    组件名称用来指定为处理Intent对象的组件,可以通过以下三种方法进行设置:

      a)  intent.setComponent(SecondActivity)   参数为要设置的组件名称

      b)  intent.setClass(MainActivity.this,SecondActivity.class)   第一个参数为当前Activity的this对象,第二个参数为要打开的Activity的class对象

      c)  intent.setClassName(MainActivity.this,SecondActivity)   第一个参数为当前Activity的this对象,第二个参数为要打开的Activity类对象

  (2)Action

    用来指明要实施的动作是什么,很大程度上决定了Intent的构建,一些常用的动作如下:

      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     改变时区警告.

    除了官方给出的一些常用动作外,用户也可以自定义自己的动作,自定义动作字符串应包含程序包名的前缀,如com.example.alarm.xxx

    设置动作:  intent.setAction(String action)      获取动作:   intent.getAction(String action)

  (3)Data

    数据是作用在Intent上的数据的URI(通用资源标示符)和数据的MIME类型(已注册的数据类型主要有:application,audio,example,message,model,multipart,text,video),不同的动作有不同的数据规格。

    设置数据:intent.setData(Uri.parse("tel:18620390143"))//设置要拨打的号码

  (4)Extra

    附加数据用来为Intent添加附加信息:

    设置附加数据:  intent.setExtra("name","张光源")  第一个参数为附加信息名称,第二个参数为附加信息值

    获取附加数据:  intent.getExtra("name")   根据附加信息名称,获取相应数据值

  (5)IntentFilter

    隐式Intent(并不指明目标组件名称)需要通过过滤器<intent-filter>进行解析,一个过滤器对英语Intent对象的动作、数据、种类,过滤器需要检测隐式Intent的这三个字段,其中任何一个失败,则为解析失败。然而一个组件可以拥有多个过滤器,在这个过滤器上解析失败,有可能在其它过滤器解析成功。过滤器的使用如下:

       <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <data android:mimeType="video/mpeg" android:scheme="http">
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

  目前所接触到的Intent操作都是显式Intent(指定compoment),所以对Intent的解析方面了解还不够深入,待后期有更深理解再进行补充。

  附:经常接触的Intent实例:

       Intent intent=new Intent(MainActivity.this,MyAlarmReceiver.class);//指定跳转的Inetent
            intent.setAction("com.example.action.setalarm");//指定intent的action
            sender=PendingIntent.getBroadcast(MainActivity.this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);//指定PendingIntent
       Intent it=new Intent(context,AlarmMessage.class);//定制要跳转的activity
            it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 传递一个新的任务标记
            context.startActivity(it);//启动Intent
原文地址:https://www.cnblogs.com/dream550/p/3891031.html