Android 在Activity中打开某个app
Published in:2023-03-02 |
Words: 669 | Reading time: 3min | reading:

在使用前传入 app 包名,具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
private void openApp(String packageName) {
PackageInfo pi = null;

try {
pi = getPackageManager().getPackageInfo(packageName, 0);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
if (pi == null) {
// 这里如果 packageInfo 为 null, 说明应用不存在
Toast.makeText(SecondActivity.this, "App does not exist", Toast.LENGTH_SHORT).show();
} else {
Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);
resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
resolveIntent.setPackage(pi.packageName);
List<ResolveInfo> apps = getPackageManager().queryIntentActivities(resolveIntent, 0);
ResolveInfo ri = apps.iterator().next();
if (ri != null) {
String packageName2 = ri.activityInfo.packageName;
String className = ri.activityInfo.name;
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
ComponentName cn = new ComponentName(packageName2, className);
intent.setComponent(cn);
startActivity(intent);
}
}
}

在打开前检查是否存在

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
PackageManager packageManager = getPackageManager();
if (checkPackInfo(packname)) {
Intent intent = packageManager.getLaunchIntentForPackage(packname);
startActivity(intent);
} else {
Toast.makeText(MainActivity.this, "没有安装" + packname, 1).show();
}

/**
* 检查包是否存在
*
* @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;
}

打开 app 指定 activity

代码

1
2
3
4
5
6
7
8
9
10
11
12
Intent intent = new Intent();
//第一种方式
ComponentName cn = new ComponentName("com.example.fm", "com.example.fm.MainFragmentActivity");
try {
intent.setComponent(cn);
//第二种方式
//intent.setClassName("com.example.fm", "com.example.fm.MainFragmentActivity");
intent.putExtra("test", "intent1");
startActivity(intent);
} catch (Exception e) {
//TODO 可以在这里提示用户没有安装应用或找不到指定Activity,或者是做其他的操作
}

权限配置

1
<activity android:name="com.example.fm.MainFragmentActivity"></activity>

启动模式

android 总 Activity 的启动模式分为四种:

Activity 启动模式设置:

1
<activity android:name=".MainActivity" android:launchMode="standard" />

Activity 的四种启动模式:

1. standard 模式启动模式,每次激活 Activity 时都会创建 Activity,并放入任务栈中。

2. singleTop 如果在任务的栈顶正好存在该 Activity 的实例, 就重用该实例,否者就会创建新的实例并放入栈顶(即使栈中已经存在该 Activity 实例,只要不在栈顶,都会创建实例)。

3. singleTask 如果在栈中已经有该 Activity 的实例,就重用该实例(会调用实例的 onNewIntent())。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中。

4. singleInstance 在一个新栈中创建该 Activity 实例,并让多个应用共享改栈中的该 Activity 实例。一旦改模式的 Activity 的实例存在于某个栈中,任何应用再激活改 Activity 时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该 Activity 都会进入同一个应用中。

其中 standard 是系统默认的启动模式。

Prev:
C#杀死unity中的进程方法
Next:
kill_process_app 通过java代码kill进程