Android在一個APP中通過包名或類名啟動另一個APP
阿新 • • 發佈:2018-12-20
開發有時需要在一個應用中啟動另一個應用,比如Launcher載入所有的已安裝的程式的列表,當點選圖示時可以啟動另一個應用。一般我們知道了另一個應用的包名和MainActivity的名字之後便可以直接通過如下程式碼來啟動:
[java] view plain copy
- Intent intent = new Intent(Intent.ACTION_MAIN);
- intent.addCategory(Intent.CATEGORY_LAUNCHER);
- ComponentName cn = new ComponentName(packageName, className);
- intent.setComponent(cn);
- startActivity(intent);
但是更多的時候,我們一般都不知道目標應用程式的啟動Activity的類名,而只知道包名,接下來就需要這麼做了,我封裝成了一個方法,如下所示:
[java] view plain copy
- private void doStartApplicationWithPackageName(String packagename) {
- // 通過包名獲取此APP詳細資訊,包括Activities、services、versioncode、name等等
- PackageInfo packageinfo = null;
- try {
- packageinfo = getPackageManager().getPackageInfo(packagename, 0);
- } catch (NameNotFoundException e) {
- e.printStackTrace();
- }
- if (packageinfo == null) {
- return;
- }
- // 建立一個類別為CATEGORY_LAUNCHER的該包名的Intent
- Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);
- resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
- resolveIntent.setPackage(packageinfo.packageName);
- // 通過getPackageManager()的queryIntentActivities方法遍歷
- List<ResolveInfo> resolveinfoList = getPackageManager()
- .queryIntentActivities(resolveIntent, 0);
- ResolveInfo resolveinfo = resolveinfoList.iterator().next();
- if (resolveinfo != null) {
- // packagename = 引數packname
- String packageName = resolveinfo.activityInfo.packageName;
- // 這個就是我們要找的該APP的LAUNCHER的Activity[組織形式:packagename.mainActivityname]
- String className = resolveinfo.activityInfo.name;
- // LAUNCHER Intent
- Intent intent = new Intent(Intent.ACTION_MAIN);
- intent.addCategory(Intent.CATEGORY_LAUNCHER);
- // 設定ComponentName引數1:packagename引數2:MainActivity路徑
- ComponentName cn = new ComponentName(packageName, className);
- intent.setComponent(cn);
- startActivity(intent);
- }
- }