Android APP打開另外一個APP的幾種實現總結

需求分析:android

1.A點擊拉起B;this

2.若是B沒安裝,下載安裝;url

3.若是B已安轉,未在後臺運行點擊打開B,傳值帳號密碼,作跨登陸;spa

4.若是B已安裝,且正在後臺運行,A打開B直接顯示在後臺運行的頁面;code

1.A拉起B可實現的幾種方法

(1)包名,特定Activity名拉起component

Intent intent = new Intent(Intent.ACTION_MAIN); /**知道要跳轉應用的包命與目標Activity*/ ComponentName componentName = new ComponentName("cn.com.xxxx", "cn.com.xxxx.xxx.login.WelcomeActivity"); intent.setComponent(componentName); intent.putExtra("", "");//這裏Intent傳值
startActivity(intent);

B應用須要在manifest文件對應Activity添加blog

android:exported="true"

(2)包名拉起(這裏就是進去啓動頁)get

Intent intent = getPackageManager().getLaunchIntentForPackage("cn.com.xxxx"); if (intent != null) { intent.putExtra("type", "110"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); }

(3)url拉起it

Intent intent = new Intent(); intent.setData(Uri.parse("csd://pull.csd.demo/cyn?type=110")); intent.putExtra("", "");//這裏Intent固然也可傳遞參數,可是通常狀況下都會放到上面的URL中進行傳遞
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);

B應用manifest文件需配置(注意:在原有intent-filter下方另外添加,不是在原先裏面,兩個同時存在)io

<intent-filter>
    <data android:host="pull.csd.demo" android:path="/cyn" android:scheme="csd" />
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
</intent-filter>

優勢:不暴露包名   缺點:host path schemeA應用和B應用得提早規定

2.判斷B應用是否安裝

/** * 檢查包是否存在 * * @param packname * @return
 */
private boolean checkPackInfo(String packname) { PackageInfo packageInfo = null; try { packageInfo = getPackageManager().getPackageInfo(packname, 0); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } return packageInfo != null; }

3.判斷B應用是否在後臺運行並直接打開

public static Intent getAppOpenIntentByPackageName(Context context,String packageName){ //Activity完整名
    String mainAct = null; //根據包名尋找
    PackageManager pkgMag = context.getPackageManager(); Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); intent.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED|Intent.FLAG_ACTIVITY_NEW_TASK); List<ResolveInfo> list = pkgMag.queryIntentActivities(intent, PackageManager.GET_ACTIVITIES); for (int i = 0; i < list.size(); i++) { ResolveInfo info = list.get(i); if (info.activityInfo.packageName.equals(packageName)) { mainAct = info.activityInfo.name; break; } } if (TextUtils.isEmpty(mainAct)) { return null; } intent.setComponent(new ComponentName(packageName, mainAct)); return intent; } public static Context getPackageContext(Context context, String packageName) { Context pkgContext = null; if (context.getPackageName().equals(packageName)) { pkgContext = context; } else { // 建立第三方應用的上下文環境
        try { pkgContext = context.createPackageContext(packageName, Context.CONTEXT_IGNORE_SECURITY | Context.CONTEXT_INCLUDE_CODE); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } } return pkgContext; } public static boolean openPackage(Context context, String packageName) { Context pkgContext = getPackageContext(context, packageName); Intent intent = getAppOpenIntentByPackageName(context, packageName); if (pkgContext != null && intent != null) { pkgContext.startActivity(intent); return true; } return false; }
if (checkPackInfo("cn.com.xxxxx")) { openPackage(this,"cn.com.xxxxx"); } else { Toast.makeText(this, "沒有安裝" + "",Toast.LENGTH_LONG).show(); //TODO 下載操做
}

這裏運用的是模擬點擊圖標啓動,不會出現程序多開,和棧頂Activity重複或者順序錯亂的問題。

固然Activity的LaunchMode最好設爲「singletop」

相關文章
相關標籤/搜索