Android 一一 Intent在活动之间穿梭

来源:互联网 发布:千金方医药软件 编辑:程序博客网 时间:2024/05/16 23:32

在我们的手机App中,点击应用图标,进入的界面就是该应用的主活动,当我们点击其他按钮进去其他的活动,这样的过程该如何实现呢? 换句话说就是怎样才能由主活动跳转到其他活动?

Intent

Intent 大致可以分为两种: 显式 Intent  和 隐式 Intent


显示Intent

首先右击包名-->New-->Activity-->Empty Activity, 会弹出一个创建活动的对话框,可以给活动命名, 勾选Generate Layout File,给布局文件起名, 但不要勾选 Launcher Activity选项(因为这个选项用于设置主活动).


注意: 任何一个活动都是需要在 AndroidManifest.xml 中注册, 不过 Android Studio 已经帮我们自动完成了. 可以进入 AndroidManifest.xml 中看看, 由于 SecondActivity不是主活动.因此不需要配置<intent-filter>标签里的内容,注册活动的代码也很简单.


Intent(意图) 是 Android程序中各组件之间进行交互的一种重要方式, 它不仅可以指明当前组件想要执行的动作, 还可以在不同组件之间传递数据. Intent一般可被用于启动活动, 启动服务以及发送广播等场景.

Intent 有多个构造函数的重载, 其中一个是Intent (Context packageContent, Class<?>cls). 这个构造函数接收两个参数,第一个参数Content 要求提供一个启动活动的上下文,第二个参数Class 则是指定想要启动的目标活动, 通过这个构造函数就可以构建出 Intent 的 "意图". Activity类中 提供了 一个startActivity() 方法, 这个方法是专门用于启动活动的, 它接收一个Intent 参数.


效果:


AndroidManifest.xml 文件

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.example.sunny.explicitintent">    <application        android:allowBackup="true"        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:roundIcon="@mipmap/ic_launcher_round"        android:supportsRtl="true"        android:theme="@style/AppTheme">        <activity android:name=".FirstActivity">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <activity android:name=".SecondActivity"></activity>    </application></manifest>
FirstActivity类

package com.example.sunny.explicitintent;import android.content.Intent;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;public class FirstActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_first);        // 创建按钮        Button btn = (Button)findViewById(R.id.button_1);        btn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                // 创建意图                Intent intent = new Intent(FirstActivity.this,SecondActivity.class);                // 开启意图                startActivity(intent);                // 销毁活动//                finish();            }        });    }}

使用这种方式启动活动, Intent 的 "意图" 非常明显, 因此称之为 显示 Intent


隐式Intent

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

通过在<activity>标签下配置<intent - filter>的内容,可以指定当前活动能够响应action 和 category, 打开 AndroidManifest.xml, 添加如下代码

<!-- 活动4 -->        <activity android:name=".FourActivity">            <intent-filter>                <!-- 指明了当前活动可以响应com.example.sunny.activitytest.ACTION_START这个action -->                <action android:name="com.example.sunny.activitytest.ACTION_START" />                <!-- category标签 包含了一些附加信息 -->                <category android:name="android.intent.category.DEFAULT" />            </intent-filter>        </activity>

只有<action><category> 中的内容同时能够匹配上Intent中指定的action 和 category时, 这个活动才能响应 Intent.

ThirdActivity类

public class ThirdActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_third);        Button btn = (Button)findViewById(R.id.button_1);        btn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                // 创建隐式意图                // 当<action>和<category>中的内容同时能够匹配上Intent中指定的action和category时,这个活动才能响应该Intent                // 每一个Intent只能指定一个action,但却能指定多个category                Intent intent = new Intent("com.example.sunny.activitytest.ACTION_START");                // 注意: 因为category是一种默认的category,在调用startActivity方法会自动将category添加到Intent.                startActivity(intent);            }        });    }}
在上面代码中 没有看到 category 为什么也能响应,因为 android.intent.category.DEFAULT 是一种默认的category,在调用 startActivity

()方法的时候会自动将这个 category 添加到 Intetn.每一个Intent 中只能指定一个action,但却能指定多个 category.

我们可以在ThirdActivity类中再添加一个

intent.addCategory("com.example.sunny.activitytest.ZY_CATEGORY");

然后运行程序会发现报错, 这是因为刚刚在Intent中添加的 category,在FourActivity 的<intent - filter>标签中并没有声明可以响应这个

category,所以就出现了没有任何活动能够响应该Intent的情况.

<!-- 活动4 -->        <activity android:name=".FourActivity">            <intent-filter>                <!-- 指明了当前活动可以响应com.example.sunny.activitytest.ACTION_START这个action -->                <action android:name="com.example.sunny.implicitintent.ACTION_START" />                <!-- category标签 包含了一些附加信息 -->                <category android:name="android.intent.category.DEFAULT" />                <category android:name="com.example.sunny.implicitintent.ZY_CATEGORY" />            </intent-filter>        </activity>

效果如显示Intent相同.

更多隐式 Intent 的用法

使用隐式Intent ,我们可以启动自己程序内的活动, 还可以启动其他程序的活动,这使得 Android多个应用程序之间的功能共享

称为可能, 比如说 在应用程序中需要展示一个网页,只需要调用系统的浏览器来打开这个网页即可!

public class ThirdActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_third);        Button btn = (Button)findViewById(R.id.button_1);        btn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                // 创建隐式意图                // 当<action>和<category>中的内容同时能够匹配上Intent中指定的action和category时,这个活动才能响应该Intent                // 每一个Intent只能指定一个action,但却能指定多个category//                Intent intent = new Intent("com.example.sunny.implicitintent.ACTION_START");                // 注意: 因为category是一种默认的category,在调用startActivity方法会自动将category添加到Intent.//                intent.addCategory("com.example.sunny.implicitintent.ZY_CATEGORY");//                startActivity(intent);                                // 打开一个网页//                Intent intent = new Intent(Intent.ACTION_VIEW);//                intent.setData(Uri.parse("http://www.baidu.com"));//                startActivity(intent);                                // 调用系统拨号功能                Intent intent1 = new Intent(Intent.ACTION_DIAL);                intent1.setData(Uri.parse("tel:10086"));                startActivity(intent1);            }        });    }}