Android 在PackageInstaller完成(自我)更新后启动应用程序
PackageInstaller成功(自行)更新应用程序后,应用程序关闭,不再启动 可能重复: 情况非常相似,我将首先展示一些代码片段 AndroidManifest.xmlAndroid 在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
<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());