Android: перезапустите приложение после обновления – ACTION_PACKAGE_REPLACED

Мое приложение, которое не входит в Play Store, проверяет в Интернете. Если есть новая версия и загрузите ее и запустите. После установки я хотел бы перезапустить приложение, и я бы использовал BroadcastRecevier с ACTION_PACKAGE_REPLACED . Это код:

Трансляция:

 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); } } } 

Manifest:

 <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 было обновлено, чтобы сбросить будильник?

Правильное исправление заключается в том, что вы используете неправильную строку в манифесте: http://developer.android.com/reference/android/content/Intent.html#ACTION_PACKAGE_REPLACED

Вместо этого он должен быть «android.intent.action.PACKAGE_REPLACED».


Хорошо, я вижу, что того, что я написал, все еще недостаточно, чтобы попробовать, поэтому я сделаю исключение и опубликую целый проект, чтобы показать, что он работает: код приложения находится в пакете под названием «com.broadcast_receiver_test». Не забудьте запустить его перед тестированием, иначе он не будет работать на некоторых версиях Android (я думаю, API 11+).

проявляются:

 <?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> ? <?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(); } } 

Просто запустите его и убедитесь, что он работает отлично.


EDIT: если ваше приложение предназначено для 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.