Android 中,從當(dāng)前 APP 啟動另外一個 APP 的需求,不是很常見, 但確實(shí)存在著,比如說在某寶還沒有現(xiàn)在這么強(qiáng)大時,支付需要啟動他們的 APP. 再比如說,某米的錢包系統(tǒng),需要和他們的金融 APP 在某些業(yè)務(wù)上是相互依賴的,需要相互啟動.
綜上所述, 從一個 APP 去啟動另外一個 APP 的需求還是有它存在的價值.因此,一下是我在工作和學(xué)習(xí)中總結(jié)的如何通過一個 APP 去啟動另外一個 APP 的方式.
1.通過 APP 啟動另一個 APP
String packageName = "com.android.calendar";
Intent intent = getPackageManager().getLaunchIntentForPackage(packageName);
intent.putExtra("type", true);
startActivity(intent);
上面的代碼,就可以完成從一個 APP 啟動另一個 APP 的業(yè)務(wù)需求, 這里需要注意的是,我們需要檢測一下要啟動的 APP 是否已經(jīng)安裝,如果應(yīng)用未安裝, 則會 NullPointException.
通過這種方式, Android 虛擬機(jī)會自己在目標(biāo) APP 下尋找標(biāo)簽為 android.intent.action.MAIN 的 Activity 啟動.
這里介紹兩種方式,檢測目標(biāo)應(yīng)用是否已經(jīng)安裝
** 方法一: **
Intent intent = getPackageName().getLaunchIntentForPackage(packageName);
if (intent == null) {
// 這里判斷 Intent 為空, 說明應(yīng)用不存在
}
方法二:
PackageInfo packageInfo = getPackageManager(0.getPackageInfo(packageName, 0);
if (packageInfo == null) {
// 這里如果 packageInfo 為 null, 說明應(yīng)用不存在
}
2. 打開另外一個 APP 指定的 Activity
Intent intent = new Intent();
ComponentName componeneName = new ComponeneName("com.android.calendar", "com.android.calendar.LaunchActivity");
intent.setComponent(componeneName);
startActivity(intent);
值得注意:
- 需要將目標(biāo) Activity 的 android:export="true" 屬性在所屬應(yīng)用的 AndroidMainfest 里設(shè)置為 true, 意思是當(dāng)前 Activity 允許被外部應(yīng)用訪問, 否則會報(bào)錯
Caused by: java.lang.SecurityException: Permission Denial: starting Intent
{ cmp=com.example.fm/.MainFragmentActivity (has extras) } from ProcessRecord
{39282a97 11545:com.xing.toolbardemo1/u0a71} (pid=11545, uid=10071) not exported from uid 10067
- 在 5.0 以前的設(shè)備上,需要在當(dāng)前的 AndroidMainfest 里也生命目標(biāo)Activity, 否則會報(bào)錯; 但在 5.0 以后的設(shè)備上,就不會報(bào)錯哦
Caused by: android.content.ActivityNotFoundException: Unable to find explicit activity class {com.example.fm/com.example.fm.MainFragmentActivity};
have you declared this activity in your AndroidManifest.xml?