Android Intent(Data、Type属性与inten

2022-02-11  本文已影响0人  gaookey
image.png

Data 属性通常用于向 Action 属性提供操作的数据。Data 属性接受一个 Uri 对象,该 Url 对象通常通过如下形式的字符串来表示。

Uri 字符串总满足如下格式

scheme://host:port/path

content://com.android.contacts/contacts/1

tel:123

Type 属性用于指定该 Data 属性所指定 Uti 对应的 MIME 类型,这种 MIME 类型可以是任何自定义的 MIME 类型,只要符合 abx/xyz 格式的字符串即可。

Data 和 Type 这两个属性会相互覆盖

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void overrideType(View source) {
        Intent intent = new Intent();
        // 先为Intent设置Type属性
        intent.setType("abc/xyz");
        // 再为Intent设置Data属性,覆盖Type属性
        intent.setData(Uri.parse("lee://www.fkjava.org:8888/test"));
        Toast.makeText(this, intent.toString(), Toast.LENGTH_LONG).show();
    }

    public void overrideData(View source) {
        Intent intent = new Intent();
        // 先为Intent设置Data属性
        intent.setData(Uri.parse("lee://www.fkjava.org:8888/mypath"));
        // 再为Intent设置Type属性,覆盖Data属性
        intent.setType("abc/xyz");
        Toast.makeText(this, intent.toString(), Toast.LENGTH_LONG).show();
    }

    public void dataAndType(View source) {
        Intent intent = new Intent();
        // 同时设置Intent的Data、Type属性
        intent.setDataAndType(Uri.parse("lee://www.fkjava.org:8888/mypath"), "abc/xyz");
        Toast.makeText(this, intent.toString(), Toast.LENGTH_LONG).show();
    }
}



AndroidManifest.xml 文件中为组件中声明 Data、Type 属性通过 <data.../> 元素。

<data
    android:scheme=""
    android:host=""
    android:port="" 
    android:path=""
    android:pathPrefix=""
    android:pathPattern="" />

AndroidManifest.xml

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

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.MyApplication"
        tools:targetApi="31">
        <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>


        <activity
            android:name=".SchemeActivity"
            android:exported="true"
            android:icon="@drawable/ic_scheme"
            android:label="指定scheme的Activity">
            <intent-filter>
                <action android:name="xx" />
                <category android:name="android.intent.category.DEFAULT" />
                <!-- 只要Intent的Data属性的scheme是lee,即可启动该Activity -->
                <data android:scheme="lee" />
            </intent-filter>
        </activity>
        <activity
            android:name=".SchemeHostPortActivity"
            android:exported="true"
            android:icon="@drawable/ic_host"
            android:label="指定scheme、host、port的Activity">
            <intent-filter>
                <action android:name="xx" />
                <category android:name="android.intent.category.DEFAULT" />
                <!-- 只要Intent的Data属性的scheme是lee,且host是www.fkjava.org,
                port是8888,即可启动该Activity -->
                <data
                    android:host="www.fkjava.org"
                    android:port="8888"
                    android:scheme="lee" />
            </intent-filter>
        </activity>
        <activity
            android:name=".SchemeHostPathActivity"
            android:exported="true"
            android:icon="@drawable/ic_sp"
            android:label="指定scheme、host、path的Activity">
            <intent-filter>
                <action android:name="xx" />
                <category android:name="android.intent.category.DEFAULT" />
                <!-- 只要Intent的Data属性的scheme是lee,且host是www.fkjava.org,
                path是/mypath,即可启动该Activity -->
                <data
                    android:host="www.fkjava.org"
                    android:path="/mypath"
                    android:scheme="lee" />
            </intent-filter>
        </activity>
        <activity
            android:name=".SchemeHostPortPathActivity"
            android:exported="true"
            android:icon="@drawable/ic_path"
            android:label="指定scheme、host、port、path的Activity">
            <intent-filter>
                <action android:name="xx" />
                <category android:name="android.intent.category.DEFAULT" />
                <!-- 需要Intent的Data属性的scheme是lee,且host是www.fkjava.org,
                port是8888,path是/mypath,才可启动该Activity -->
                <data
                    android:host="www.fkjava.org"
                    android:path="/mypath"
                    android:port="8888"
                    android:scheme="lee" />
            </intent-filter>
        </activity>
        <activity
            android:name=".SchemeHostPortPathTypeActivity"
            android:exported="true"
            android:icon="@drawable/ic_type"
            android:label="指定scheme、host、port、path、type的Activity">
            <intent-filter>
                <action android:name="xx" />
                <category android:name="android.intent.category.DEFAULT" />
                <!-- 需要Intent的Data属性的scheme是lee,且host是www.fkjava.org,
                port是8888,path是/mypath,
                type是abc/xyz,才可启动该Activity -->
                <data
                    android:host="www.fkjava.org"
                    android:mimeType="abc/xyz"
                    android:path="/mypath"
                    android:port="8888"
                    android:scheme="lee" />
            </intent-filter>
        </activity>
    </application>
</manifest>
    public void scheme() {
        Intent intent = new Intent();
        // 只设置Intent的Data属性
        intent.setData(Uri.parse("lee://www.crazyit.org:1234/test"));
        startActivity(intent);
    }

    public void schemeHostPort() {
        Intent intent = new Intent();
        // 只设置Intent的Data属性
        intent.setData(Uri.parse("lee://www.fkjava.org:8888/test"));
        startActivity(intent);
    }

    public void schemeHostPath() {
        Intent intent = new Intent();
        // 只设置Intent的Data属性
        intent.setData(Uri.parse("lee://www.fkjava.org:1234/mypath"));
        startActivity(intent);
    }

    public void schemeHostPortPath() {
        Intent intent = new Intent();
        // 只设置Intent的Data属性
        intent.setData(Uri.parse("lee://www.fkjava.org:8888/mypath"));
        startActivity(intent);
    }

    public void schemeHostPortPathType() {
        Intent intent = new Intent();
        // 同时设置Intent的Data、Type属性
        intent.setDataAndType(Uri.parse("lee://www.fkjava.org:8888/mypath"), "abc/xyz");
        startActivity(intent);
    }

使用 Action、Data 属性启动系统 Activity

常见的 Action 属性、Data 属性的组合:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button bn = findViewById(R.id.bn);
        // 为bn按钮添加一个监听器
        bn.setOnClickListener(view -> {
            // 创建Intent
            Intent intent = new Intent();
            // 为Intent设置Action属性
            intent.setAction(Intent.ACTION_VIEW);
            // 设置Data属性
            intent.setData(Uri.parse("http://www.crazyit.org"));
            startActivity(intent);
        });

        Button edit = findViewById(R.id.edit);
        // 为edit按钮添加一个监听器
        edit.setOnClickListener(view -> {
            // 创建Intent
            Intent intent = new Intent();
            // 为Intent设置Action属性(动作为:编辑)
            intent.setAction(Intent.ACTION_EDIT);
            // 设置Data属性
            intent.setData(Uri.parse("content://com.android.contacts/contacts/1"));
            startActivity(intent);
        });

        Button call = findViewById(R.id.call);
        // 为call按钮添加一个监听器
        call.setOnClickListener(view -> {
            // 创建Intent
            Intent intent = new Intent();
            // 为Intent设置Action属性(动作为:拨号)
            intent.setAction(Intent.ACTION_DIAL);
            // 设置Data属性
            intent.setData(Uri.parse("tel:18888888888"));
            startActivity(intent);
        });
    }
}
上一篇下一篇

猜你喜欢

热点阅读