Android 在PackageInstaller完成(自我)更新后启动应用程序

Android 在PackageInstaller完成(自我)更新后启动应用程序,android,android-pendingintent,device-owner,packageinstaller,cosu,Android,Android Pendingintent,Device Owner,Packageinstaller,Cosu,PackageInstaller成功(自行)更新应用程序后,应用程序关闭,不再启动 可能重复: 情况非常相似,我将首先展示一些代码片段 AndroidManifest.xml <receiver android:name=".UpdateReceiver" > <intent-filter> <action android:name="android.intent.action.MY_PACKAGE_REPLAC

PackageInstaller成功(自行)更新应用程序后,应用程序关闭,不再启动

可能重复:

情况非常相似,我将首先展示一些代码片段

AndroidManifest.xml

<receiver android:name=".UpdateReceiver" >
    <intent-filter>
        <action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
    </intent-filter>
</receiver>
在这段代码的末尾,您可以看到发送意图的设置。我尝试过许多变体,但都不起作用。例如:

Intent intent = new Intent(Intents.APK_INSTALL_FINISHED_INTENT);

我的接受者从来没有收到过这个意图

public class UpdateReceiver extends BroadcastReceiver {
    private static final String TAG = "UPDATE";
    @Override
    public void onReceive(Context context, Intent intent) {
        Logger.info(TAG, "Intent action: " + intent.getAction());
        Logger.info(TAG, "updated");
    }
}
编辑:不知何故,我成功地自动重启了应用程序,但它在1-3秒后被杀死。我在系统的logcat中发现以下错误

W/ActivityManager: Unable to send startActivity intent
    java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.intent.action.MY_PACKAGE_REPLACED from pid=-1, uid=10071
        at com.android.server.am.ActivityManagerService.broadcastIntentLocked(ActivityManagerService.java:18195)
        at com.android.server.am.ActivityManagerService.broadcastIntentInPackage(ActivityManagerService.java:18777)
        at com.android.server.am.PendingIntentRecord.sendInner(PendingIntentRecord.java:308)
        at com.android.server.am.PendingIntentRecord.sendWithResult(PendingIntentRecord.java:205)
        at com.android.server.am.ActivityManagerService.sendIntentSender(ActivityManagerService.java:7409)
        at android.content.IntentSender.sendIntent(IntentSender.java:190)
        at android.content.IntentSender.sendIntent(IntentSender.java:154)
        at com.android.server.pm.PackageInstallerService$PackageInstallObserverAdapter.onPackageInstalled(PackageInstallerService.java:1069)
        at android.app.PackageInstallObserver$1.onPackageInstalled(PackageInstallObserver.java:34)
        at com.android.server.pm.PackageInstallerSession.dispatchSessionFinished(PackageInstallerSession.java:1137)
        at com.android.server.pm.PackageInstallerSession.-wrap2(PackageInstallerSession.java)
        at com.android.server.pm.PackageInstallerSession$4.onPackageInstalled(PackageInstallerSession.java:648)
        at com.android.server.pm.PackageManagerService.handlePackagePostInstall(PackageManagerService.java:1809)
        at com.android.server.pm.PackageManagerService.-wrap25(PackageManagerService.java)
        at com.android.server.pm.PackageManagerService$PackageHandler.doHandleMessage(PackageManagerService.java:1438)
        at com.android.server.pm.PackageManagerService$PackageHandler.handleMessage(PackageManagerService.java:1195)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:154)
        at android.os.HandlerThread.run(HandlerThread.java:61)
        at com.android.server.ServiceThread.run(ServiceThread.java:46)
我不确定这是否是原因

EDIT2:现在我收到了意图,因此应用程序正在运行。现在的问题是它在后堆栈中

我有一个启动器应用程序,可以重新启动主(更新)应用程序,但对我来说,这听起来并不干净

编辑3:

我尝试了David的答案,但收到以下错误:

E/ActivityManager: Failure starting process com.example.myapp
    java.lang.SecurityException: Package com.example.myapp is currently frozen!
        at com.android.server.pm.PackageManagerService.checkPackageStartable(PackageManagerService.java:3197)
        at com.android.server.am.ActivityManagerService.startProcessLocked(ActivityManagerService.java:3789)
        at com.android.server.am.ActivityManagerService.startProcessLocked(ActivityManagerService.java:3749)
        at com.android.server.am.ActivityManagerService.startProcessLocked(ActivityManagerService.java:3630)
        at com.android.server.am.BroadcastQueue.processNextBroadcast(BroadcastQueue.java:1255)
        at com.android.server.am.BroadcastQueue$BroadcastHandler.handleMessage(BroadcastQueue.java:172)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:154)
        at android.os.HandlerThread.run(HandlerThread.java:61)
        at com.android.server.ServiceThread.run(ServiceThread.java:46)

请注意,这是由android系统引发的,而不是由我的应用程序引发的。

在你的应用程序更新后,android会播放被替换的

要在更新后重新启动应用程序,您可以将启动
Intent
传递给
PackageInstaller
,如下所示:

Intent intent = getPackageManager().getLaunchIntentForPackage("my.package.name");
PendingIntent pendingIntent = PendingIntent.getActivity(
                mContext.get(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
session.commit(pendingIntent.getIntentSender());

这将导致您的应用程序在更新完成后重新启动。

而David Wasser的答案可能是正确的。我结案是因为我有一种非常奇怪和未定义的行为,我很确定这是因为我使用的是一个自定义ROM

被替换的
我的包
Intent
在你的应用程序更新后由安卓播送。安装/更新成功吗?@DavidWasser是,安装/更新成功。我用更多信息编辑了问题。ActivityManager引发异常。我根据这个问题编辑了这个问题。当Android还在进行更新的时候,有些东西正试图启动你的应用程序。但是如果你使用的是<代码>意图<代码>有了<代码> PasaGeMaAgER 重新启动你的应用程序,你可能不需要对<代码> MyOpCythAdx进行替换< < /代码>广播。试着去掉它,看看它是否有帮助这不是一个真正的答案。您应该编辑您的问题并添加您的评论。@DavidWasser您是对的,稍后我会写一个更长的解释,说明什么对我有用。谢谢你的意见。
E/ActivityManager: Failure starting process com.example.myapp
    java.lang.SecurityException: Package com.example.myapp is currently frozen!
        at com.android.server.pm.PackageManagerService.checkPackageStartable(PackageManagerService.java:3197)
        at com.android.server.am.ActivityManagerService.startProcessLocked(ActivityManagerService.java:3789)
        at com.android.server.am.ActivityManagerService.startProcessLocked(ActivityManagerService.java:3749)
        at com.android.server.am.ActivityManagerService.startProcessLocked(ActivityManagerService.java:3630)
        at com.android.server.am.BroadcastQueue.processNextBroadcast(BroadcastQueue.java:1255)
        at com.android.server.am.BroadcastQueue$BroadcastHandler.handleMessage(BroadcastQueue.java:172)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:154)
        at android.os.HandlerThread.run(HandlerThread.java:61)
        at com.android.server.ServiceThread.run(ServiceThread.java:46)
Intent intent = getPackageManager().getLaunchIntentForPackage("my.package.name");
PendingIntent pendingIntent = PendingIntent.getActivity(
                mContext.get(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
session.commit(pendingIntent.getIntentSender());