Android Intent(Data、Type属性与inten
2022-02-11 本文已影响0人
gaookey
image.png
Data 属性通常用于向 Action 属性提供操作的数据。Data 属性接受一个 Uri 对象,该 Url 对象通常通过如下形式的字符串来表示。
Uri 字符串总满足如下格式
- 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 属性的组合:
- ACTION_VIEW content://com.android.contacts/contacts/1:显示标识为1的联系人信息
- ACTION_EDIT content://com.android.contacts/contacts/1:编辑标识为1的联系人信息
- ACTION_DIAL content://com.android.contacts/contacts/1:显示向标识为1的联系人拨号的界面
- ACTION_VIEW tel:123:显示向指定号码123拨号的界面
- ACTION_DIAL tel:123:显示向指定号码123拨号的界面
- ACTION_VIEW content://contacts/people/:显示所有联系人列表的信息,通过这种组合可以非常方便地查看系统联系人
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);
});
}
}