一、得到目标app包名
参考链接:https://www.jianshu.com/p/8cc2f0841b14 原作者:亭子青年
- 在模拟器/真机上面安装“包名查看器”,可以自行上网搜索
- 使用sdk tools下的3个工具进行查看:ddms.bat,monitor.bat,hierarchyviewer.bat,当然也可以通过eclipse中的ddms进行查看,在查看的过程中,你只需要在虚拟机或者真机中打开并操作指定的app,就可以在工具中进行查看
这里以hierarchyviewer.bat工具为例
hierarchyviewer.png
3.通过签名文件获得
(1)adb shell pm list packages
(2)adb shell ls -al /data/data
4.查看源代码=》AndroidManifest.xml文件
二、项目app启动目标app
参考链接:https://www.jianshu.com/p/42ae7066f8f3 作者:吾若成疯
MainActivity.java
(packageName:com.xxx.test.debug)
//点击按钮响应
public void click(View view){
//根据包名打开指定app
//app:Pos 包名:com.xxx.test.debug
openTargetApp("com.xxx.test.debug");
}
/*
*启动设备已安装的app
*/
public void openTargetApp(String packageName){
//包管理器对象
PackageManager pm = getPackageManager();
//检查包名
PackageInfo packageInfo = null;
try {
packageInfo = pm.getPackageInfo(packageName,0);
}catch (PackageManager.NameNotFoundException e){
e.printStackTrace();
}
//包名存在则启动app
if (packageInfo != null){
Intent intent = pm.getLaunchIntentForPackage(packageName);
this.startActivity(intent);
}else{
Toast.makeText(MainActivity.this,"应用程序未安装",Toast.LENGTH_LONG).show();
}
如果手机上已经安装了另一个APP直接就能够打开了。
2、打开另一个APP指定的Activity
(入口Activity:com.xxx.test.ExampleActivity)
Intent intent = new Intent();
//第一种方式
ComponentName cn = new ComponentName("com.xxx.test.debug", "com.xxx.test.ExampleActivity");
try {
intent.setComponent(cn);
//第二种方式
//intent.setClassName("com.xxx.test.debug", "com.xxx.test.ExampleActivity");
intent.putExtra("test", "intent1");
startActivity(intent);
} catch (Exception e) {
//TODO 可以在这里提示用户没有安装应用或找不到指定Activity,或者是做其他的操作
}
这里有两点需要注意
1、需要将目标Activity的android:exported="true"属性在所属应用AndroidMainfest里设置为true,意思是当前Activity可以被外部应用访问,否则会报下面的错误
Caused by: java.lang.SecurityException: Permission Denial: starting Intent
{ cmp=com.xxx.test.debug/.ExampleActivity (has extras) } from ProcessRecord
{39282a97 11545:com.xing.toolbardemo1/u0a71} (pid=11545, uid=10071) not exported from uid 10067
2、需要在当前应用的AndroidMainfest里也声明目标Activity,否则会报下面的错误
(测试机为android5.0以下)
Caused by: android.content.ActivityNotFoundException: Unable to find
explicit activity class {com.xxx.test.debug/com.xxx.test.debug.ExampleActivity};
have you declared this activity in your AndroidManifest.xml?
在清单文件里声明目标Activity就OK了
<activity android:name="com.xxx.test.debug.ExampleActivity"></activity>