将其他 Android activity 推到前台
Pushing other Android activity to foreground
我从包 A 触发了来自特权包 B 的 运行ning 服务。
包 B 执行包 A 的更新。
目标设备正在使用 Android 9(API 级别 28)。
更新成功(应用版本码发生变化)。
但我的问题是,更新后,包 A 在后台;在我的设备上,它在后台应用程序列表中,我必须手动按下它才能将其调到前台。
我希望它在安装后回到前台。
我尝试了什么:
安装后将 BroadcastIntent 从包 B 发送到包 A;包的 A BroadcastReceiver 似乎没有收到意图(可能是因为它在后台或应用程序已更新?)
安装后,如果我 运行 通过 adb 手动执行此命令,则此命令有效:"$ adb shell am start -n "com.mma.mainapp/com.mma.mainapp.MainActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER"。所以我尝试在延迟安装后从包 B 执行它: "am start -n "$mainAppPackage/$mainAppPackage.MainActivity" -a ${Intent.ACTION_MAIN} -c ${Intent.CATEGORY_LAUNCHER} ".运行命令(文件("."))。
我也尝试在安装后使用正确的权限从包 B 执行此操作,但未列出包 A:
private fun moveToFront(mainAppPackage: String) {
val activityManager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
val recentTasks = activityManager.getRunningTasks(Int.MAX_VALUE)//activityManager.appTasks.map { it.taskInfo }
for (i in recentTasks.indices) {
log("PUSH Application executed : "
+ recentTasks[i].baseActivity.toShortString()
+ "\t\t ID: " + recentTasks[i].id + "")
if (recentTasks[i].baseActivity.toShortString().indexOf(mainAppPackage) > -1) {
log("PUSH TO FRONT : "
+ recentTasks[i].baseActivity.toShortString()
+ "\t\t ID: " + recentTasks[i].id + "")
activityManager.moveTaskToFront(recentTasks[i].id, ActivityManager.MOVE_TASK_WITH_HOME)
}
}
}
覆盖包 A 的 Application::onCreate(),将 activity 置于最前面:val i = Intent(context, MainActivity::class.java) ; i.setAction(Intent.ACTION_MAIN); i.addCategory(Intent.CATEGORY_LAUNCHER); context.startActivity(i) // 独立工作,但 apk 更新后不会触发 onCreate。
有什么方法可以完成这个任务吗? (这应该是可行的,因为包 B 是特权的(使用标准程序安装在 /system/priv-app 下的 root 设备上)并且具有与包 A 相同的签名)
安装完成后需要启动一个Activity。您可能会在安装完成之前启动 activity。要获取应用 A 更新完成,请像这样注册一个广播接收器:
private static final IntentFilter appUpdateIntentFilter = new IntentFilter();
static {
appUpdateIntentFilter.addDataScheme("package");
appUpdateIntentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
}
private AppUpdateReceiver appUpdateReceiver = new AppUpdateReceiver();
那么如果你是从app B的服务开始下载,在服务的onCreate中注册,在onDestroy中停止:
private void registerBroadcastReceiver() {
try {
registerReceiver(appUpdateReceiver, appUpdateIntentFilter);
} catch (IllegalArgumentException e) {
// already registered
}
}
private void unregisterBroadcastReceiver() {
try {
unregisterReceiver(appUpdateReceiver);
} catch (IllegalArgumentException e) {
// already unregistered
}
}
class AppUpdateReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//if packageName is for app A then start an activity of app A
int uid = intent.getIntegerExtra(Intent.EXTRA_UID);
String appName = context.getPackageManager().getNameForUid(uid);
if(appName.equals("com.appA.PackageName")) {
//start an activity of app A
}
}
}
我从包 A 触发了来自特权包 B 的 运行ning 服务。 包 B 执行包 A 的更新。 目标设备正在使用 Android 9(API 级别 28)。 更新成功(应用版本码发生变化)。 但我的问题是,更新后,包 A 在后台;在我的设备上,它在后台应用程序列表中,我必须手动按下它才能将其调到前台。
我希望它在安装后回到前台。
我尝试了什么:
安装后将 BroadcastIntent 从包 B 发送到包 A;包的 A BroadcastReceiver 似乎没有收到意图(可能是因为它在后台或应用程序已更新?)
安装后,如果我 运行 通过 adb 手动执行此命令,则此命令有效:"$ adb shell am start -n "com.mma.mainapp/com.mma.mainapp.MainActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER"。所以我尝试在延迟安装后从包 B 执行它: "am start -n "$mainAppPackage/$mainAppPackage.MainActivity" -a ${Intent.ACTION_MAIN} -c ${Intent.CATEGORY_LAUNCHER} ".运行命令(文件("."))。
我也尝试在安装后使用正确的权限从包 B 执行此操作,但未列出包 A:
private fun moveToFront(mainAppPackage: String) { val activityManager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager val recentTasks = activityManager.getRunningTasks(Int.MAX_VALUE)//activityManager.appTasks.map { it.taskInfo } for (i in recentTasks.indices) { log("PUSH Application executed : " + recentTasks[i].baseActivity.toShortString() + "\t\t ID: " + recentTasks[i].id + "") if (recentTasks[i].baseActivity.toShortString().indexOf(mainAppPackage) > -1) { log("PUSH TO FRONT : " + recentTasks[i].baseActivity.toShortString() + "\t\t ID: " + recentTasks[i].id + "") activityManager.moveTaskToFront(recentTasks[i].id, ActivityManager.MOVE_TASK_WITH_HOME) } } }
覆盖包 A 的 Application::onCreate(),将 activity 置于最前面:val i = Intent(context, MainActivity::class.java) ; i.setAction(Intent.ACTION_MAIN); i.addCategory(Intent.CATEGORY_LAUNCHER); context.startActivity(i) // 独立工作,但 apk 更新后不会触发 onCreate。
有什么方法可以完成这个任务吗? (这应该是可行的,因为包 B 是特权的(使用标准程序安装在 /system/priv-app 下的 root 设备上)并且具有与包 A 相同的签名)
安装完成后需要启动一个Activity。您可能会在安装完成之前启动 activity。要获取应用 A 更新完成,请像这样注册一个广播接收器:
private static final IntentFilter appUpdateIntentFilter = new IntentFilter();
static {
appUpdateIntentFilter.addDataScheme("package");
appUpdateIntentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
}
private AppUpdateReceiver appUpdateReceiver = new AppUpdateReceiver();
那么如果你是从app B的服务开始下载,在服务的onCreate中注册,在onDestroy中停止:
private void registerBroadcastReceiver() {
try {
registerReceiver(appUpdateReceiver, appUpdateIntentFilter);
} catch (IllegalArgumentException e) {
// already registered
}
}
private void unregisterBroadcastReceiver() {
try {
unregisterReceiver(appUpdateReceiver);
} catch (IllegalArgumentException e) {
// already unregistered
}
}
class AppUpdateReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//if packageName is for app A then start an activity of app A
int uid = intent.getIntegerExtra(Intent.EXTRA_UID);
String appName = context.getPackageManager().getNameForUid(uid);
if(appName.equals("com.appA.PackageName")) {
//start an activity of app A
}
}
}