从包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相同的签名)
安装完成后,您需要启动活动。您可以在安装完成之前启动活动。若要获取应用更新完成,请按如下方式注册广播接收器:
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
}
}
}
谁能帮帮我吗???
我正在尝试创建一个导航抽屉活动,这样我就可以扩展该活动,并按照这个问题链接中给出的答案在所有活动中使用菜单,但我的测试应用程序总是崩溃,下面是我的代码: BaseActivity.java
我有3个活动A、B和C。A导致B,B导致C。我希望能够在A和B之间来回移动,但我希望在C开始后完成A和B。我知道如何在通过意图启动C时关闭B,但在启动C时如何关闭A?
为什么我的代码不起作用?我想把图像从一个活动转移到另一个活动。请帮忙!注意:我已经创建了一个摄像头功能,这就是我获得图像的地方。 这是主要活动。Java语言 这就是结果性。Java语言 如果我做错了什么请告诉我谢谢
我知道如何使用发送捆绑包,但我的代码会导致。但我不知道为什么。 主要活动 维护活动2(此处接收) 这里,哪一部分错了被添加到捆绑包中,但每次抛出时。