核心代码如下
1. 第一种,知道应用程序的包名和启动的Activity的类名
Intent intent = new Intent();
ComponentName cn = new ComponentName("com.example.test03", "com.example.test03.IntentActivity");
intent.setComponent(cn);
intent.setAction(Intent.ACTION_VIEW);
startActivity(intent);
2. 第二种 只知道应用的包名
Intent launchIntentForPackage = this.getPackageManager().getLaunchIntentForPackage("com.example.test03");
this.startActivity(launchIntentForPackage);
3. 第三种 知道应用的包名和启动的Activity的类名,但是这个Activity类不是应用程序的入口的Activity
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
ComponentName cn = new ComponentName("com.example.test03",
"com.example.test03.IntentActivity");
intent.setComponent(cn);
intent.setAction(Intent.ACTION_VIEW);
startActivity(intent);
==特别注意==
++如果要启动的类或者Activity不是应用的入口Activity,使用第一种方法,就会出现如下错误++
E/AndroidRuntime(3594): Caused by: java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.VIEW cmp=com.example.test03/.IntentActivity } from ProcessRecord
我们可以看到这个错误不是平时简单的看到的那种缺少系统权限的操作,而是权限拒绝的意思。
所以如何解决?
有如下两种解决方法:
1.代码设置
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
2.清单文件中进行配置,加一个exported的属性
<activity
android:name="com.example.test03.IntentActivity"
android:exported="true"></activity>
为什么我们的入口Activity不需要设置这个属性,因为在我们设置了入口activity设置了Action和category这两个属性,相当于是设置exported的属性为true。所以在入口的Activity中不需要进行设置这个属性