web-dev-qa-db-fra.com

Android: Redémarrez l'application après la mise à jour - action_package_replaced

Mon application qui n'est pas sur Play Store Vérifiez sur le Web s'il y a une nouvelle version et le téléchargement et le démarrez. Après l'installation, je voudrais redémarrer l'application et j'utiliserais un BroadcastRecevier avec ACTION_PACKAGE_REPLACED. Ceci est le code:

diffusion :

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

Manifeste :

<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>

Le problème est que lorsque j'installe Nouveau APK, la diffusion semble ne pas commencer, pourquoi?

24
MisterX_Dev

regarde ça:

Comment savoir mon Android Application a été mis à niveau afin de réinitialiser une alarme?

correct Correction est que vous utilisez la mauvaise chaîne dans le manifeste: http://developer.android.com/reference/android/content/intent.html#action_Package_Replaced

il devrait être "android.inent.action.acackage_replacé" à la place.


ok, je vois que ce que j'ai écrit n'est toujours pas suffisant pour l'essayer, alors je ferai une exception et publierai tout un projet juste pour montrer que cela fonctionne: l'application est dans un package appelé "com.broadcast_recefeiver_test". N'oubliez pas de l'exécuter avant de tester, sinon cela ne fonctionnera pas sur certains Android versions (je pense à API 11+).

manifeste:

<?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>

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

s'il vous plaît, courez-le et voyez que cela fonctionne parfaitement.


EDIT: Si votre application est destinée à API12 et ci-dessus, et souhaite uniquement gérer le cas de la mise à jour de votre application, vous pouvez utiliser cette intention seule:

http://developer.android.com/reference/andrroid/content/intent.html#action_my_package_replacé

29

Je mets le récepteur suivant dans l'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>

Mon application peut donc être lancée sur la mise à jour ainsi que le redémarrage de périphériques. Bien que tout le monde a mentionné que vous avez besoin de l'API 12+ pour My_Package_Replacé.

7
Sileria

Après deux jours de lutte et d'expérimentation, j'ai découvert la raison. Il s'est avéré que j'ai besoin de lire attentivement la documentation officielle.

Comme dit ici: https://developer.android.com/reference/andrroid/content/intente#action_my_package_replacé

Il s'est avéré que la phrase clé est la suivante: il ne contient aucune donnée supplémentaire

celles. Si vous avez changé le manifeste, l'application ne redémarre pas après la mise à jour

je vous en prie