Android: BroadcastReceiver sur demande d'installer / désinstaller

Je veux installer un fichier apk et définir une diffusion récepteur afin de recueillir des informations concernant l'état d'installation.

J'ai préparé un BroadcastReceiver classe :

public class newPackageReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("DEBUG"," test for application install/uninstall");
    }

}

Dans l'activité principale, j'ai d'abord enregistrer un nouvel objet récepteur, puis instancier bouton pour l'installation de l'application.

public void onCreate(Bundle savedInstanceState) {
...
IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_PACKAGE_ADDED);
        filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
        filter.addAction(Intent.ACTION_PACKAGE_DATA_CLEARED);
        filter.addAction(Intent.ACTION_PACKAGE_INSTALL);
        filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
        filter.addAction(Intent.ACTION_PACKAGE_REPLACED);
        filter.addAction(Intent.ACTION_PACKAGE_RESTARTED);

        receiver = new newPackageReceiver();
        registerReceiver(receiver, filter);
        ...

dlButton.setText(R.string.dl_button);
dlButton.setOnClickListener(new AppliDownloadOnClickListener(this ));   


@Override
public void onDestroy(){
     unregisterReceiver(receiver);
     super.onDestroy();
}

Dans mon OnclickListener classe, j'ai mis :

@Override
    public void onClick(View v) {

    //actually, the below process is in an asyncTask
    URL url;
    Intent promptInstall;

    try {
        url = new URL(apkurl);

        HttpURLConnection c = (HttpURLConnection) url.openConnection();
        c.setRequestMethod("GET");
        c.setDoOutput(true);
        c.connect();

        String PATH = Environment.getExternalStorageDirectory()+ "/download/";
        File file = new File(PATH);
        file.mkdirs();
        File outputFile = new File(file, "app.apk");
        FileOutputStream fos = new FileOutputStream(outputFile);

        InputStream is = c.getInputStream();

        byte[] buffer = new byte[1024];
        int len1 = 0;
        while ((len1 = is.read(buffer)) != -1) {
            fos.write(buffer, 0, len1);
        }

        fos.close();
        is.close();

        promptInstall = new Intent(Intent.ACTION_VIEW);
        promptInstall.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/download/" + "app.apk")), "application/vnd.android.package-archive");

        if (promptInstall != null) {
            activity.startActivity(promptInstall);
        } else {
            ErrorDetails.displayToastMessage(activity,R.string.connection_error);
        }


    } catch (...) {
        ...
    }

}

Avec le code ci-dessus (j'ai rétréci), lorsque le bouton est cliqué, le programme d'installation s'affiche et l'application est parfaitement installé, mais la classe de récepteur(newPackageReceiver) n'est jamais appelée. L'enregistrement (registerReceiver) est fait dans la méthode onCreate et unregisterReceiver est appelée dans la méthode onDestroy, donc, il devrait être valide. Savez-vous pourquoi ?

Merci pour la lecture !

OriginalL'auteur johann | 2013-01-16