将其他Android活动推到前台



从包a,我触发了从特权包B运行服务。包B执行包A的更新。目标设备正在使用Android 9(API 28级(。更新成功(应用程序版本代码已更改(。但我的问题是,在更新之后,包A处于后台;在我的设备上,它在后台应用程序列表中,我必须手动按下它才能将其带到前台。

我希望它在安装后能回到前台。

我尝试过的:

  • 安装后从包B向包a发送BroadcastIntent;看起来包的A BroadcastReceiver上没有收到意向(可能是因为它在后台,或者应用程序已经更新?(

  • 安装后,如果我通过adb:"$手动运行该命令,则该命令有效adb shell am start-n";com.mma.mainapp/com.mma/mainapp.MainActivity"-a android.intent.action.MAIN-c安卓.intent.category.LAUNCHER";。所以我试着在延迟安装后从包B执行它:;am开始-n"$mainAppPackage/$mainAppPackage.MainActivity"-a${Intent.ACTION_MAIN}-c${Intention.CATEGORY_LAUNCHER}";。runCommand(文件("."((.

  • 我还尝试在安装后从包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()
    + "tt ID: " + recentTasks[i].id + "")
    if (recentTasks[i].baseActivity.toShortString().indexOf(mainAppPackage) > -1) {
    log("PUSH TO FRONT : "
    + recentTasks[i].baseActivity.toShortString()
    + "tt ID: " + recentTasks[i].id + "")
    activityManager.moveTaskToFront(recentTasks[i].id, ActivityManager.MOVE_TASK_WITH_HOME)
    }
    }
    }
    
  • 重写包A的Application::onCreate((,将活动放在前面:val i=Intent(context,MainActivity::class.java(;i.setAction(Intent.ACTION_MAIN(;i.addCategory(Intent.CEGORY_LAUNCHER(;context.startActivity(i(//在隔离状态下工作,但在apk更新后不会触发onCreate。

有什么方法可以执行此任务吗?(这应该是可行的,假设包B具有特权(使用标准程序安装在根设备上的/system/priv应用程序下(,并且具有与包A相同的签名(

安装完成后,您需要启动"活动"。您可以在安装完成之前开始活动。要获得应用程序更新完成注册一个广播接收器,如下所示:

private static final IntentFilter appUpdateIntentFilter = new IntentFilter();
static {
appUpdateIntentFilter.addDataScheme("package");
appUpdateIntentFilter.addAction(Intent.ACTION_PACKAGE_ADDED); 
}
private AppUpdateReceiver appUpdateReceiver = new AppUpdateReceiver();

然后,如果你从应用程序B的服务开始下载,请在onCreate中注册,并在onDestroy of the service:中停止

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 
}
}
}

最新更新