Android調用第三方App,android第三方app
- private List<Map<String, Object>> list = null;
- private PackageManager mPackageManager;
- private List<ResolveInfo> mAllApps;
- private Context mContext;
-
- /**
- * 檢查系統應用程式,並開啟
- */
- private void openApp(){
- //應用過濾條件
- Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
- mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
- mPackageManager = mContext.getPackageManager();
- mAllApps = mPackageManager.queryIntentActivities(mainIntent, 0);
- //按報名排序
- Collections.sort(mAllApps, new ResolveInfo.DisplayNameComparator(mPackageManager));
-
- for(ResolveInfo res : mAllApps){
- //該應用的包名和主Activity
- String pkg = res.activityInfo.packageName;
- String cls = res.activityInfo.name;
-
- // 開啟QQ
- if(pkg.contains("qq")){
- ComponentName componet = new ComponentName(pkg, cls);
- Intent intent = new Intent();
- intent.setComponent(componet);
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- mContext.startActivity(intent);
- }
- }
- }
很多人使用startActivity時候,會碰到如下的異常:
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。
[java] view plaincopy
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
這樣就可以再新的task裡面啟動這個Activity了。