Android:更新后重新启动应用程序 – ACTION_PACKAGE_REPLACED

我的应用程序不在Play商店上在网上validation如果有新版本并下载并启动它。 安装后,我想重新启动应用程序,我会用ACTION_PACKAGE_REPLACED一个BroadcastRecevier 。 这是代码:

广播:

 public void onReceive(Context context, Intent intent) { if(intent.getAction().equals(Intent.ACTION_PACKAGE_REPLACED)){ ApplicationInfo app = new ApplicationInfo(); if(app.packageName.equals("it.android.downloadapk")){ Intent LaunchIntent = context.getPackageManager().getLaunchIntentForPackage(app.packageName); context.startActivity(LaunchIntent); } } } 

performance:

 <receiver android:name="it.android.downloadapk.Broadcast"> <intent-filter> <action android:name="android.intent.action.ACTION_PACKAGE_REPLACED"></action> <data android:scheme="package" android:path="it.android.downloadapk" /> </intent-filter> </receiver> 

问题是,当我安装新的apk,广播似乎没有启动,为什么?

Solutions Collecting From Web of "Android:更新后重新启动应用程序 – ACTION_PACKAGE_REPLACED"

看到这个:

如何知道我的Android应用程序已升级,以重置警报?

正确的解决方法是您在清单中使用了错误的string: http : //developer.android.com/reference/android/content/Intent.html#ACTION_PACKAGE_REPLACED

它应该是“android.intent.action.PACKAGE_REPLACED”来代替。


好吧,我看到我写的东西还不足以尝试,所以我会做一个例外,并发布一个完整的项目,以显示它的工作原理:应用程序代码是在一个名为“com.broadcast_receiver_test”的包。 不要忘记在testing之前运行它,否则它不会在一些Android版本(我认为API 11 +)上工作。

performance:

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.broadcast_receiver_test" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="3" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name"> <activity android:name=".BroadcastReceiverTestActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:name=".MyBroadcastReceiver"> <intent-filter> <action android:name="android.intent.action.PACKAGE_REPLACED"/> <data android:scheme="package" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.PACKAGE_REMOVED"/> <data android:scheme="package" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.PACKAGE_ADDED"/> <data android:scheme="package" /> </intent-filter> </receiver> </application> </manifest> 

MyBroadcastReceiver.java:

 public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(final Context context,final Intent intent) { final String msg="intent:"+intent+" action:"+intent.getAction(); Log.d("DEBUG",msg); Toast.makeText(context,msg,Toast.LENGTH_SHORT).show(); } } 

请运行它,看看它是完美的。


编辑:如果你的应用程序是API12及以上,只希望处理更新你的应用程序的情况下,你可以单独使用这个意图:

http://developer.android.com/reference/android/content/Intent.html#ACTION_MY_PACKAGE_REPLACED

我把下面的接收器放在AndroidManifest.xml中

 <receiver android:name=".StartupReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> <intent-filter> <action android:name="android.intent.action.MY_PACKAGE_REPLACED"/> </intent-filter> </receiver> 

所以我的应用程序可以启动更新以及设备重启。 当然每个人都提到你需要API 12+ MY_PACKAGE_REPLACED。