Intent的使用

来源:互联网 发布:ubuntu mate 17.10 qq 编辑:程序博客网 时间:2024/05/29 03:51

一、什么是Intent

1、Intent的概念:

Android中提供了Intent机制来协助应用间的交互与通讯,或者采用更准确的说法是,Intent不仅可用于应用程序之间,也可用于应用程序内部的activity, service和broadcast receiver之间的交互。Intent这个英语单词的本意是“目的、意向、意图”。
Intent是一种运行时绑定(runtime binding)机制,它能在程序运行的过程中连接两个不同的组件。通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意愿的内容选择适当的组件来响应。
activity、service和broadcast receiver之间是通过Intent进行通信的,而另外一个组件Content Provider本身就是一种通信机制,不需要通过Intent。我们来看下面这个图就知道了:

这里写图片描述

2、对于向这三种组件发送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。
二、Intent的相关属性:

Intent由以下各个组成部分:
component(组件):目的组件
action(动作):用来表现意图的行动
category(类别):用来表现动作的类别
data(数据):表示与动作要操纵的数据
type(数据类型):对于data范例的描写
extras(扩展信息):扩展信息
Flags(标志位):期望这个意图的运行模式
Intent类型分为显式Intent(直接类型)、隐式Intent(间接类型)。官方建议使用隐式Intent。上述属性中,component属性为直接类型,其他均为间接类型。

相比与显式Intent,隐式Intnet则含蓄了许多,它并不明确指出我们想要启动哪一个活动,而是指定一系列更为抽象的action和category等信息,然后交由系统去分析这个Intent,并帮我们找出合适的活动去启动。

Activity 中 Intent Filter 的匹配过程 :

这里写图片描述

 <activity android:name=".MainActivity">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <activity android:name=".SecondActivity">            <intent-filter>                <action android:name="com.ukulele.action.MY_ACTION"></action>                <category android:name="android.intent.category.DEFAULT"></category>                <category android:name="android.intent.category.MY_CATEGORY"></category>            </intent-filter>        </activity>        <activity android:name=".ThirdActivity">            <intent-filter>                <action android:name="com.ukulele.action.MY_ACTION"></action>                <category android:name="android.intent.category.DEFAULT"></category>            </intent-filter>        </activity>        <activity android:name=".FourthActivity">            <intent-filter android:priority="1">                <action android:name="android.intent.action.VIEW" />                <category android:name="android.intent.category.DEFAULT" />                <data android:scheme="http" android:host="www.baidu.com"/>            </intent-filter>        </activity>

1.component(组件):目的组件
Intent intent = new Intent();
ComponentName componentName = new ComponentName(MainActivity.this,SecondActivity.class);
intent.setComponent(componentName);
startActivity(intent);

2.Action(动作):用来表现意图的行动
Intent intent = new Intent();
intent.setClass(MainActivity.this,SecondActivity.class);
startActivity(intent);

3.category(类别):用来表现动作的类别
同事匹配了两个活动
只有和中的内容同时能够匹配上Intent中指定的action和category时,这个活动才能响应Intent。
Intent intent = new Intent(“com.ukulele.action.MY_ACTION”);
intent.addCategory(“android.intent.category.DEFAULT”);
startActivity(intent);

多添加一条类别Category 就明确了
每个Intent中只能指定一个action,但却能指定多个category;类别越多,动作越具体,意图越明确
Intent intent = new Intent(“com.ukulele.action.MY_ACTION”);
intent.addCategory(“android.intent.category.DEFAULT”);
intent.addCategory(“android.intent.category.MY_CATEGORY”);
startActivity(intent);

4.data(数据):表示与动作要操纵的数据
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
Uri data = Uri.parse(“http://www.baidu.com“);
intent.setData(data);
startActivity(intent);

5.type(数据类型):对于data范例的描写
播放音乐
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri data = Uri.parse(“file:///storage/sdcard0/平凡之路.mp3”);
intent.setDataAndType(data,”audio/mp3”);
startActivity(intent);

播放视频
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri uri = Uri.parse(“file:///storage/sdcard0/权力的游戏.mp4”);
intent.setDataAndType(uri,”video/mp4”);
startActivity(intent);

打开拨号界面,并指定电话
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse(“tel:10086”));
startActivity(intent);

直接拨打电话
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse(“tel:10086”));
startActivity(intent);

打开发短信界面
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse(“10086”),”vnd.android-dir/mms-sms”);
intent.putExtra(“sms_body”,”具体内容”);
startActivity(intent);

打开发短信界面2
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setData(Uri.parse(“10086”));
intent.putExtra(“sms_body”,”具体内容”);
startActivity(intent);

卸载app
Intent intent = new Intent(Intent.ACTION_DELETE);
intent.setData(Uri.parse(“package:com.example.xxx”));
startActivity(intent);

安装app
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri data = Uri.fromFile(new File(“/storage/sdcard0/AndroidTest.apk”));
intent.setDataAndType(data,”application/vnd.android.package-archive”);
startActivity(intent);

startActivityForResult()

这个方法期望在活动销毁后返回一个结果给上一个活动
MainActivity:

public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Button button = (Button) findViewById(R.id.button);        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Intent intent = new Intent(MainActivity.this,SecondActivity.class);                //第一个参数是Intent 第二个参数是请求码                startActivityForResult(intent,1);            }        });    }    //第一个参数requestCode是启动活动时传入的请求码    //第二个参数resultCode返回数据传入的处理结果    //第三个参数data就是携带返回数据的Intent    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        switch (requestCode){            case 1:                if(requestCode == RESULT_OK){//RESULT_OK是1                    String returnData = data.getStringExtra("data_return");                }                default:                    break;        }    }}

SecondActivity:

public class SecondActivity extends AppCompatActivity {    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_second);    }    //如果用户在SecondActivity中并不是通过点击按钮,而是通过Back返回到MainActivity的,    //这样数据就没法返回了吧,所以用onBackPressed来解决这个问题    @Override    public void onBackPressed() {        Intent intent = new Intent();        intent.putExtra("data_return","Hello MainActivity");        setResult(RESULT_OK,intent);        finish();    }}

启动活动的最佳方法:
FirstActivity:

public class FirstActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_first);        Button button = (Button) findViewById(R.id.button);        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                SecondActivity.actionStart(FirstActivity.this,"data");            }        });    }}

SecondActivity:

public class SecondActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_second);    }    public static void actionStart(Context context, String data){        Intent intent = new Intent(context, SecondActivity.class);        intent.putExtra("param",data);        context.startActivity(intent);    }}
原创粉丝点击