Intent

发布于 2022-04-06  93 次阅读


Intent 用于通过描述您想在某个 Intent 对象中执行的简单操作(如“查看地图”或“拍摄照片”)来启动另一应用中的某个 Activity。这种 Intent 称作隐式 Intent,因为它并不指定要启动的应用组件,而是指定一项操作并提供执行该操作所需的一些数据

当调用 startActivity() 或 startActivityForResult() 并向其传递隐式 Intent 时,系统会将 Intent 解析为可处理该 Intent 的应用并启动其对应的 Activity。如果有多个应用可处理 Intent,系统会为用户显示一个对话框,供其选择要使用的应用。

本文仅介绍Intent跳转页面,后续会更新。

.

Intent显式启动activity

通过提供目标应用的软件包名称或完全限定的组件类名来指定可处理 Intent 的应用。通常,您会在自己的应用中使用显式 Intent 来启动组件,这是因为您知道要启动的 Activity 或服务的类名。例如,您可能会启动您应用内的新 Activity 以响应用户操作,或者启动服务以在后台下载文件。

public void OnClick(View view){
        Intent intent;
        //1、intent跳转
        intent = new Intent(MainActivity.this, FirstActivity.class);
        startActivity(intent);
        //2、包名.类名
        intent.setClassName(String.valueOf(this), "com.example.education.FirstActivity");
        startActivity(intent);
        //3、ComponentName
        ComponentName cName = new ComponentName(this, FirstActivity.class);
        intent.setComponent(cName);
        startActivity(intent);
}

.

Intent隐式启动activity

不会指定特定的组件,而是声明要执行的常规操作,从而允许其他应用中的组件来处理。例如,如需在地图上向用户显示位置,则可以使用隐式 Intent,请求另一具有此功能的应用在地图上显示指定的位置。

首先我们先来到AndroidManifest.xml(注:我是先创建了一个名为FirstActivity的emptyActivity)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.education">

    <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/Theme.Education">
        <activity
            android:name=".FirstActivity"
            android:exported="false">
            <intent-filter>
                <action android:name="action.FirstActivity" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

之后来到后端,在setAction中写下想要跳转的页面的androi:name的属性值,即可完成隐式跳转:

public void toFirstActivity(){
        //写法1
        Intent intent1 = new Intent();
        intent1.setAction("action.FirstActivity");
        startActivity(intent1);
        //写法2
        Intent intent2 = new Intent("action.FirstActivity");
        startActivity(intent2);
}

.

在AndroidManifest.xml中,我们可以看到intent-fliter(意向过滤器)中有action标签和category标签。

category标签的意思是,向 Intent 过滤器添加类别名称。具体类别名称对应的功能参见下表。

category类别名称功能(Launcher字符串其实就是在桌面创建一个图标点击后跳入这个activity)

.

action标签的意思是,向 Intent 过滤器添加操作。 <intent-filter> 元素必须包含一个或多个 <action> 元素。如果 Intent 过滤器中没有 <action> 元素,则过滤器不接受任何 Intent 对象。

action的属性只有一个,android:name 操作的名称。

某些标准操作在 Intent 类中定义为 ACTION_string 常量。若要将其中一项操作分配给此属性,请在 ACTION_ 后跟的 string 前面加上“android.intent.action.”。例如,对于 ACTION_MAIN,请使用“android.intent.action.MAIN”;对于 ACTION_WEB_SEARCH,请使用“android.intent.action.WEB_SEARCH”。

.

注意!当多个activity中的android:name的属性相同时,这些activity将同时启动并由用户来选择启动哪一个activity


谢谢你能看完呀~~~