今天开发中遇到个问题,一个应用中启动另一个应用的页面时出现崩溃,跳转的代码如下:
private void startLearningActivity(String text){
Intent intent = new Intent();
String packageName="com.xxx.xxxx";
String className="com.xxx.xxxx.XxxActivity";
ComponentName name = new ComponentName(packageName, className);
intent.setComponent(name);
intent.putExtra("Text", text);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
错误log如下:
java.lang.SecurityException: Permission Denial: starting Intent { flg=0x10000000 cmp=com.xxx.xxxxcom.xxx.xxxx.XxxActivity(has extras) } from ProcessRecord{812ad43 4614:com.xxx.xxxxcom/u0a81} (pid=4614, uid=10081) not exported from uid 1000
at android.os.Parcel.readException(Parcel.java:1599)
at android.os.Parcel.readException(Parcel.java:1552)
......
查找资料后发现目标Activity不支持其他应用调用。解决方法也很简单,给要跳转的目标Activity添加属性android:exported="true",该属性表示支持外部应用调用该页面。
AndroidManifest.xml中代码如下:
<activity
android:name="com.xxx.xxxxcom.XxxActivity"
android:exported="true">
</activity>
如此问题就解决了。
还有一种办法,是在目标Activity的声明里添加一个action,代码如下:
<activity
android:name="com.xxx.xxxxcom.XxxActivity">
<intent-filter >
<action android:name="android.intent.action.VIEW"/>
</intent-filter>
</activity>
同时启动方法里也添加上该action
private void startLearningActivity(String text){
Intent intent = new Intent("android.intent.action.VIEW");
String packageName="com.xxx.xxxx";
String className="com.xxx.xxxx.XxxActivity";
ComponentName name = new ComponentName(packageName, className);
intent.setComponent(name);
intent.putExtra("Text", text);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
如此也能解决问题。