美文网首页
Android Intent(Data、Type属性与inten

Android Intent(Data、Type属性与inten

作者: gaookey | 来源:发表于2022-02-11 21:58 被阅读0次
    image.png

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

    Uri 字符串总满足如下格式

    scheme://host:port/path

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

    • scheme:contact
    • host:com.android.contacts
    • port:被省略
    • path:/contacts/1

    tel:123

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

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

    • 如果为 Intent 先设置 Data 属性,后设置 Type 属性,那么 Type 属性将会覆盖 Data 属性。
    • 如果为 Intent 先设置 Type 属性,后设置 Data 属性,那么 Data 属性将会覆盖 Type 属性。
    • 如果希望 Intent 既有 Data 属性,也有 Type 属性,则用该调用 Intent 的 setDataAndType() 方法。
    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);
            });
        }
    }
    

    相关文章

      网友评论

          本文标题:Android Intent(Data、Type属性与inten

          本文链接:https://www.haomeiwen.com/subject/pxpxlrtx.html