Android : Suppression automatique des plugins
Comment supprimer les extensions d'une application au bon moment ?
Dans le HS consacré à Android, nous avons réalisé une application permettant d'accueillir des extensions. Nous avons expliqué comment proposer leurs téléchargements depuis une des places de marchés, mais nous n'avons rien proposé pour supprimer les extensions lors de la suppression de l'application racine. Nous allons décrire les techniques permettant de faire cela.
Lors de l'installation d'une application, plusieurs messages Broadcast (destiné à toutes les applications) peuvent être envoyés. Parmi ces messages, nous trouvons PACKAGE_REMOVED. Nous pouvons alors déclencher le lancement du plugin et l'exécution d'un traitement lors de la suppression d'un package. Malheureusement, il n'est pas possible de filtrer plus finement pour que le traitement soit déclenché uniquement lors de la suppression de l'application racine. Nous allons alors être déclenchés à chaque suppression d'une application.
Nous déclarons dans le fichier AndroidManifest.xml que nous sommes intéressés par ce message.
<receiver android:name=".PackageRemovedReceiver">
<intent-filter>
<action android:name="android.intent.action.PACKAGE_REMOVED"/>
<data android:scheme="package"/>
</intent-filter>
</receiver>
Il suffit alors de rédiger un petit BroadcastReceiver pour savoir si l'application supprimée est la notre, et demander alors de supprimer l'extension par la même occasion. Attention, une application peut être supprimée pour être remplacée par une nouvelle version. Il ne faut pas supprimer les plugins dans ce cas. Cela est détecté par la valeur true dans l'extra : Intent.EXTRA_REPLACING.
public class PackageRemovedReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
if ((!intent.getBooleanExtra(Intent.EXTRA_REPLACING, false))
&& ("package: "+APP_NAME).equals(intent.getDataString()))
{
Uri uri = Uri.fromParts("package", Application.sPackageName, null);
Intent it=new Intent(Intent.ACTION_DELETE, uri);
it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|
Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
Application.context.startActivity(it);
}
}
}
Et voilà. Lors de la suppression de l'application maître, il y a suppression automatique des extensions.
