📜  Android中隐式意图和显式意图的区别(1)

📅  最后修改于: 2023-12-03 14:59:17.375000             🧑  作者: Mango

Android中隐式意图和显式意图的区别

在Android应用程序中,Intent是一种重要的机制,它允许应用程序执行各种操作(如启动另一个Activity或Service、发送广播等)并与其他应用程序通信。Intent可以被分为两大类:隐式意图和显式意图。

显式意图

显式意图是指在Intent中指定了要启动的Activity(或Service)的名称,例如:

Intent intent = new Intent(MainActivity.this,TargetActivity.class);
startActivity(intent);

这里TargetActivity就是要启动的Activity的名称,这种类型的Intent被称为显式意图。

隐式意图

隐式意图是指Intent中没有指定要启动的Activity(或Service)的名称,而是指定要执行的某项操作的描述,例如:

Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setData(Uri.parse("https://www.baidu.com"));
startActivity(intent);

这里,Intent的setAction方法指定了要执行的操作是Intent.ACTION_VIEW,这个操作表示要启动一个Activity来查看某个数据,同时addCategory方法添加了Intent.CATEGORY_DEFAULT类别,这个类别是指这个Activity只有在没有其他应用程序明确地声明与之相符的类别时才会被启动。setData方法指定了要查看的数据,这里是指打开百度网站。

这里的Intent被称为隐式意图,因为它没有指定要启动的Activity的名称,而是通过操作和类别来寻找要启动的Activity。如果系统中有多个Activity可以响应这个操作和类别,那么系统会弹出一个对话框,让用户选择要启动的Activity。

区别

显式意图明确地指定要启动的Activity的名称,而且只能启动同一应用程序中的Activity,因此安全性和性能都比较高。隐式意图没有指定要启动的Activity的名称,因此可以启动外部应用程序中的Activity,但是安全性和性能都相对较低,因为系统需要搜索所有的应用程序以寻找能够响应这个Intent的Activity。

此外,还有一个需要注意的地方,那就是Intent中的数据类型。显式意图和隐式意图都可以通过setData方法来指定要操作的数据,但是只有隐式意图可以通过setType方法来指定数据类型。

// 显式意图
intent.setData(Uri.parse("https://www.baidu.com")); 

// 隐式意图
intent.setDataAndType(Uri.parse("file:///mnt/sdcard/test.pdf"), "application/pdf");

这里,隐式意图的setDataAndType方法既指定了要打开的文件的路径,又指定了文件的数据类型,而显式意图只能通过setData方法来指定数据类型。

总的来说,显式意图用于启动应用程序内的Activity,因为它们能够确保只有正确的组件会被启动,安全性和性能都较高;而隐式意图则用于启动外部应用程序中的Activity,并执行特定的操作,安全性和性能都相对较低。