Intent详解

不羁的心 提交于 2020-03-24 00:24:22

1、什么是Intent

Android提供了Intent机制来协助应用建的交互与通讯,或者采用更准确的说法是,Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity,service和broadcast receiver之间的交互,intent这个词本意是“目的、意向、意图”。

Intent是一种运行时绑定(runtime binding)机制,他能在程序运行的过程中连接两个不同的组件。通过Intent,你的程序可以向Android表达某种请求或意愿,Android会根据意愿的内容选择适当的组件来响应。

 对于像这三种组件发送intent有不同的机制:

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

使用Activity.setResult(),传入一个intent来从activity中返回结果

将intent对象传给Context.startService()来启动一个service或者传消息给一个运行的service。

将intent对象传给Context.bindService()来绑定一个service。

将intent对象传给Context.sendBroadcast(),Context.sendOrderedBroadcast(),或者Context.sendStickyBroadcast()等广播方法,则他们被传给broadcast receiver。

2、Intent的相关属性

intent由一下各个组成部分:

2.1component(组件):目的组件

Intent intent = new Intent();
ComponentName componentName = new ComponentName(this,PhoneNumberListActivity.class);
intent.setComponent(componentName); 

2.2Action(动作) :用来表现意图的行动

Action是一个用户定义的字符串,用于描述一个Android应用程序组件,一个Intent Filter可以包含多个Action。在AndroidManifest.xml的Activity定义时可以在其<intent-filter>节点指定一个Action列表,用于标识Activity所能接受的“动作”。

//需要在AndroidManifest.xml中添加intent-filter,为Activity时,必须加上category属性
        <activity android:name=".PhoneNumberListActivity">
            <intent-filter>
                <action android:name="action_MY_ACTION"></action>
                <category android:name="android.intent.category.DEFAULT"></category>
            </intent-filter>
        </activity>

//代码
        //间接法(通过Action属性)
        Intent intent = new Intent();
        intent.setAction("action_MY_ACTION");
        startActivity(intent);

如果有多个符合条件,则出现界面自己选择,可以设置优先级,android:priority="2",但是程序中必须有一个优先级为负数才能生效。

        <activity android:name=".WelcomeActivity">
            <intent-filter android:priority="-1">
                <action android:name="action_MY_ACTION"></action>
                <category android:name="android.intent.category.DEFAULT"></category>
            </intent-filter>
        </activity>
        <activity android:name=".PhoneNumberListActivity">
            <intent-filter android:priority="1">
                <action android:name="action_MY_ACTION"></action>
                <category android:name="android.intent.category.DEFAULT"></category>
            </intent-filter>
        </activity>

2.3category(类别):用来表现动作的类别

<activity android:name=".PhoneNumberListActivity">
    <intent-filter android:priority="1">
        <action android:name="action_MY_ACTION"></action>

        <category android:name="android.intent.category.DEFAULT"></category>
        <category android:name="category.MY_CATEGORY"></category>
    </intent-filter>
</activity>


//间接法(通过Action属性)
Intent intent = new Intent();
intent.setAction("action_MY_ACTION");
//添加类别
//在Activity的清单文件配置中,必须使用默认的类别android.intent.category.DEFAULT
intent.addCategory("category.MY_CATEGORY");
startActivity(intent); 

2.4data(数据): 表示与动作要操纵的数据

Data属性是Android要访问的数据,和action和category声明方式相同,也是在<intent-filter>中,多个组件匹配成功优先显示优先高的,优先级相同则显示列表。

<activity android:name=".PhoneNumberListActivity">
   <intent-filter android:priority="1">
      <action android:name="action_MY_ACTION"></action>

      <category android:name="android.intent.category.DEFAULT"></category>
      <category android:name="category.MY_CATEGORY"></category>

   <data
        android:host="www.baidu.com"
        android:scheme="http"></data>
   </intent-filter>
</activity>


//间接法(通过Action属性)
Intent intent = new Intent();
intent.setAction("action_MY_ACTION");

//data属性,一般与action配合使用
Uri data = Uri.parse("http://www.baidu.com");
intent.setData(data);
startActivity(intent); 

2.5type(数据类型):对于data范例的描写

如果Intent对象中既包含Uri又包含Type,那么,在<intent-filter>中必须二者都包含才能通过测试

Type属性则用于明确指定Data属性的数据类型或MIME类型,但是通常来说,当intent不指定data属性时Type属性才会起作用,否则Android系统将会根据Data属性值来分析数据的类型,所以无需指定Type属性。

        //data属性,type
        Uri data = Uri.parse("http://www.baidu.com");
        /**
         * intent.setData(data);//会把type设置为null
         * intent.setType(); //会把data设置为null
         * 要是用data与type,必须使用以下方法
         */
        intent.setDataAndType(data,"text/html");
        startActivity(intent); 

2.6extras(扩展信息):扩展信息

2.7Flags(标志位):期望这个意图的运行模式

Activity的四种模式:standard、singletop、singleTask、singleInstance,可以在AndroidManifest.xml中activity标签的属性launchMode中设置该activity的加载模式。

/**
 * Activity的四种启动模式:
 * standard:默认的模式,每次启动会新创建一个Activity对象
 * singleTop:在当前任务栈中,判断站定是否为当前的Activity,如果是,则直接使用,不是则创建新的Activity放入栈顶
 * singleTask:在当前任务栈中,判断站里是否存在Activity,如果不存在则创建新的Activity入栈,
 * 如果存在则会把该Activity清除出栈,显示当前Activity
 * singleInstance:新创建一个任务栈,放入新创建的Activity,该任务栈只允许存在一个Activity实例
 */ 

也可以在代码中设置Activity的启动模式

        Intent intent = new Intent(this, PhoneNumberListActivity.class);
        //设置Activity的启动模式
        /**
         * Intent.FLAG_ACTIVITY_NEW_TASK:在新的任务栈中启动Activity
         */
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent); 

Intent分为直接Intent和间接Intent

3、Intent应用

        //显示网页
        Uri uri = Uri.parse("http://www.baidu.com");
        Intent intent = new Intent(Intent.ACTION_VIEW,uri);
        startActivity(intent);

 

 

        //拨打电话,调用拨号程序,打开拨号面板
        Uri uri = Uri.parse("tel:123456789");
        Intent intent = new Intent(Intent.ACTION_DIAL,uri);
        startActivity(intent);

        //拨打电话,直接拨号
        Uri uri = Uri.parse("tel:123456789");
        Intent intent = new Intent(Intent.ACTION_CALL,uri);
        startActivity(intent);

        //注意:要是用这个必须在配置文件中加入
        <uses-permission android:name="android.permission.CALL_PHONE" />

       //调用发送短信的界面
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.putExtra("sms_body","The SMS text");
        intent.setType("vnd.android-dir/mms-sms");
        startActivity(intent);
 
       //发送短信
        Uri uri = Uri.parse("smsto:0800000123");
        Intent intent = new Intent(Intent.ACTION_SENDTO,uri);
        intent.putExtra("sms_body","The SMS text");
        startActivity(intent);
       //播放多媒体
        Uri uri = Uri.parse("file:///sdcard/song.mp3");
        Intent intent = new Intent(Intent.ACTION_VIEW,uri);
        intent.addFlags(intent.FLAG_ACTIVITY_NEW_TASK);//非必选项
        intent.setDataAndType(uri,"audio/ma3");
        startActivity(intent);

       //卸载程序
        Uri uri = Uri.parse("package:包名");
        Intent intent = new Intent(Intent.ACTION_DELETE,uri);
        startActivity(intent);

 

 

       //安装apk
        Uri uri = Uri.fromFile(file);
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(uri,"application/vnd.android.package-archive");
        startActivity(intent);

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!