当前位置: 首页 > 知识库问答 >
问题:

将其他Android活动推到前台

壤驷文华
2023-03-14

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

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

我尝试了什么:

>

  • 在安装后从包B向包a发送广播意图;看起来在包的广播接收器上没有接收到意图(可能是因为它在后台或应用程序已更新?)

    安装后,如果我通过adb手动运行该命令,该命令将有效:" $ ADB shell am start-n " com . MMA . main app/com . MMA . main app . main activity "-a Android . intent . action . main-c Android . intent . category . launcher "。所以我试着在延迟一段时间后从安装包B中执行它:“am start-n”$ mainAppPackage/$ mainAppPackage。MainActivity" -a ${Intent。ACTION_MAIN} -c ${Intent。类别_启动器}”。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()
                    + "\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(),将活动放在前面:val i=Intent(上下文、Mainactive::class.java);i.setAction(Intent.ACTION_MAIN);i.addCategory(Intent.CATEGORY_LAUNCHER);context.startActivity(i)//独立工作,但apk更新后不会触发onCreate。

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

  • 共有1个答案

    邢博学
    2023-03-14

    安装完成后,您需要启动活动。您可以在安装完成之前启动活动。若要获取应用更新完成,请按如下方式注册广播接收器:

    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中停止服务:

    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 
            }
        }
    }
    
     类似资料: