有的时候,项目会需要调用别人的应用程序,比如拨号、短信什么的(都是现在rom改的太多了,这些基础应用都一样,碎片化太严重),下面我给出两种方法来实现:
一、通过packmanager的getLaunchIntentForPackage方法
- PackageManager packageManager = MainActivity.this.getPackageManager();
- Intent intent=new Intent();
- try {
- intent =packageManager.getLaunchIntentForPackage("要调用应用的包名");
- } catch (NameNotFoundException e) {
- Log.i(TAG, e.toString());
- }
- startActivity(intent);
这个比较简单,包名的话,可以根据packagemanager获取到packageInfo,最后还可以根据intent获取到componentname。
二、通过intent的resolveActivity方法
- Intent it = new Intent(Intent.ACTION_MAIN);
- it.setPackage(pkg);//pkg为包名
- it.addCategory(Intent.CATEGORY_LAUNCHER);
- ComponentName ac = it.resolveActivity(mPackageManager);//mPackageManager为PackageManager实例
- String classname =ac.getClassName() ;
这种方法是受到了activitymanagerservice源码的启发,创建一个category_lancher类型的intent,然后向PackageManagerService查询Activity。
说明:resolveActivity()方法默认使用MATCH_DEFAULT_ONLY的flag ,是指activity中的catetory必须要包含android.intent.category.DEFAULT类型,否则会返回null。这时可以用 PackageManager 的getLaunchIntentForPackage()方法直接获取intent,再通过intent的getcomonent().getClassName()获取类名,另外getLaunchIntentForPackage() 是PackageManager 的一个抽象方法,其实现是在ApplicationPackageManager包内。
最后补充一点:
过 PackageInfo 获取具体信息方法:
包名获取方法:packageInfo.packageName
icon获取获取方法:packageManager.getApplicationIcon(applicationInfo)
应用名称获取方法:packageManager.getApplicationLabel(applicationInfo)
使用权限获取方法:packageManager.getPackageInfo(packageName,PackageManager.GET_PERMISSIONS).requestedPermissions
通过 ResolveInfo 获取具体信息方法:
包名获取方法:resolve.activityInfo.packageName
icon获取获取方法:resolve.loadIcon(packageManager)
应用名称获取方法:resolve.loadLabel(packageManager).toString()