Intent的使用

一、什么是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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值