啟動其他APK的Activity方法


有兩個app,分別叫做App1和App2。
App1包含兩個Activity,分別叫做App1_A和App1_B.其中App1_A是入口Activity.
也就是App1_A設置intent-filter,action為<action android:name="android.intent.action.MAIN" />
App2只有一個Activity,叫做App2_A。
現在在App2_A中通過startActivity啟動App1_A是沒問題的.但是啟動App1_B的時候報了fc錯誤。
logcat如下:
08-03 02:23:44.119: WARN/ActivityManager(64): Permission denied: checkComponentPermission() reqUid=10030
08-03 02:23:44.119: WARN/ActivityManager(64): Permission Denial: starting Intent { act=android.intent.action.VIEW cmp=com.hello/.activity2 } from ProcessRecord{407c8bc8 665:com.fileExplorer/10032} (pid=665, uid=10032) requires null

用法如下:
Intent intent = new Intent();
ComponentName componentName = new ComponentName("com.hello","com.hello.App1_A");//這個沒問題
//ComponentName componentName = new ComponentName("com.hello","com.hello.App1_B");//這個報錯
intent.setComponent(componentName);
startActivity(intent);

解決方法:
(1)
通過隱式intent調用方法實現,需要在被調用的activity的manifest文件中添加
<intent-filter>
<action android:name="com.example.project.SHOW_ACTIVITY" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
在StartActivity(it)之前,設定該intent對應的action(com.example.project.SHOW_ACTIVITY)
Intent intent = new Intent();
intent.setAction(action);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);推薦使用

利用setAction方法啟動Activity還有一個好處就是不需要知道包名和Activity類名,只需要知道action就可以隱式的啟動activity

(2)
即使直接指定了目標activity的ComponentName,跨應用的activity調用也要至少給目標activity指定一個帶action的filter。如:
<intent-filter>
<action android:name="" />
</intent-filter>
action name為空即可。
(3)給被調用的Activity增加一個帶action的filter,如下:
<intent-filter>
<action android:name="com.sdmc.ottplayer.uercenter" />
</intent-filter>
然后可以通過隱式Intent來調用,而不用使用intent.setComponent方法,如下就OK了(但是經過驗證,這種方法只是對APK的入口activity有用,對普通的沒用,和上面的問題一樣無法解決:啟動其他APK的非入口activity)
Intent i = new Intent("com.sdmc.ottplayer.uercenter");
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
this.startActivity(intent);


異常處理:
Caused by: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
Context中有一個startActivity方法,Activity繼承自Context,重載了startActivity方法。
如果使用 Activity的startActivity方法,不會有任何限制,
而如果使用Context的startActivity方法的話,就需要開啟一個新 的task,遇到上面那個異常的,都是因為使用了Context的startActivity方法。
解決辦法是,加一個flag。intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)

Intent intent = new Intent();
intent.setClass(mContext, VideoPlayer.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM