2017-08-04 3 views
0

Je dois afficher une invite lorsqu'une nouvelle application est installée ou désinstallée sur le périphérique, jusqu'à présent, cela fonctionne correctement. Le seul problème est que l'invite arrive même lorsque l'application est mise à jour. Comment arrêter BroadCastReceiver de se déclencher lors de la mise à jour de l'application. Mise à jourArrêter le déclenchement de BroadCastReceiver lors de la mise à jour de l'application dans Android

<receiver android:name=".WeepingReceiver"> 
    <intent-filter android:priority="100"> 
     <action android:name="android.intent.action.PACKAGE_ADDED" /> 
     <action android:name="android.intent.action.PACKAGE_REMOVED" /> 

     <data android:scheme="package" /> 
    </intent-filter> 
</receiver> 

BroadCast

@Override 
public void onReceive(Context context, Intent intent) { 
    if (intent.getAction().equals(Intent.ACTION_PACKAGE_INSTALL) 
      || intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED)) { 
      context.startActivity(new Intent(context, NewAppActivity.class). 
      setFlags(Intent.FLAG_ACTIVITY_NEW_TASK).putExtra(Utility.NEW_PACKAGE_NAME, packageName)); 
} 

Répondre

0

Essayez cette

Bundle extras = intent.getExtras(); 
if (extras.containsKey(Intent.EXTRA_REPLACING) && extras.getBoolean(Intent.EXTRA_REPLACING)) 
{ 
//do nothing here it is condition of updating your existing app 
}else 
{ 
//do your code here 
} 
+0

J'ai fait comme vous posté ci-dessus, mais ne fonctionne toujours pas. –

+0

avez-vous essayé les deux solution donnée par moi? –

+0

La solution ci-dessus a fonctionné pour moi merci. Mais maintenant je reçois l'activité lorsque l'application est désinstallée. Comment gérer ça? S'il vous plaît dire –

0

juste essayer de changer si la condition que

if (!intent.getAction().equals(Intent.ACTION_PACKAGE_REPLACED) && 
     (intent.getAction().equals(Intent.ACTION_PACKAGE_INSTALL) || 
     intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED))) { 

     context.startActivity(new Intent(context, NewAppActivity.class) 
      .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK) 
      .putExtra(Utility.NEW_PACKAGE_NAME, packageName)); 
} 

et manifeste

<receiver android:name=".WeepingReceiver"> 
    <intent-filter android:priority="100"> 
     <action android:name="android.intent.action.PACKAGE_ADDED" /> 
     <action android:name="android.intent.action.PACKAGE_REMOVED" /> 
     <action android:name="android.intent.action.PACKAGE_REPLACED" /> 
     <data android:scheme="package" /> 
    </intent-filter> 
</receiver> 
+0

'PACKAGE_REPLACED' il ne veut pas chapeau –

+0

@TimCastelijns voir mon état s'il y a vérifier de ne pas mettre à jour la condition, la condition ne sera jamais vraie en cas de mise à jour de l'application, fisst vérifier clairement toute la solution ne pas être intelligent pour simplement donner le vote sur la réponse de l'autre. –

+0

Ok. Je l'ai édité un peu pour revenir downvote –

0

application est réinstallant une nouvelle application, il est donc correct que votre récepteur reçoit l'événement PACKAGE_ADDED. Ainsi, vous ne pouvez pas empêcher votre diffusion de recevoir l'événement. Cependant, vous pouvez valider si l'intention est en cours de mise à jour en vérifiant si le nom du paquet était là avant. Vous pouvez avoir une liste des noms de paquets des applications installées et stocker. Ensuite, vérifiez que vous faites:

if (intent.getAction().equals(Intent.ACTION_PACKAGE_INSTALL) 
      || intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED) 
      || !packageList.contains(packageName)) 

You could get your package list par:

final PackageManager pm = getPackageManager(); 
//get a list of installed apps. 
List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA); 

for (ApplicationInfo packageInfo : packages) { 
    packageList.add(packageInfo.packageName); 
}