Android, comment utiliser DexClassLoader pour remplacer dynamiquement une Activité ou un Service

Je suis en train de faire quelque chose de semblable à ce stackoverflow affichage. Ce que je veux faire est de lire la définition d'une activité ou d'un service à partir de la carte SD. Pour éviter de manifester des problèmes d'autorisation, j'ai créer un shell version de cette activité dans le .apk, mais essayez de le remplacer par une activité du même nom qui résident sur la carte SD au moment de l'exécution. Malheureusement, je suis en mesure de charger l'activité de la définition de la classe à partir de la carte SD en utilisant DexClassLoader, mais l'origine de la définition de classe est celle qui est exécutée. Est-il un moyen de spécifier que la nouvelle définition de la classe remplace l'ancienne, ou des suggestions sur la façon d'éviter le manifeste des problèmes d'autorisation sans réellement fournir le nécessaire de l'activité dans le paquet? L'exemple de code:

    ClassLoader cl = new DexClassLoader("/sdcard/mypath/My.apk",
            getFilesDir().getAbsolutePath(),
            null,
            MainActivity.class.getClassLoader());

    try {
        Class<?> c = cl.loadClass("com.android.my.path.to.a.loaded.activity");
        Intent i = new Intent(getBaseContext(), c);
        startActivity(i);
    }
    catch (Exception e) {

Intead de lancement de la com.android.my.path.to.a.loaded.activity spécifié dans /sdcard/mypath/My.apk, il lance l'activité de manière statique chargé dans le projet.

J'ai le sentiment que cela ne peut être fait simplement en raison de la façon dont Android gère des actifs. Si vous avez appelé startActivity sur une classe dans une autre application, il faudra charger dans l'application du thread ne sont pas les vôtres, et donc d'être simplement un dangereux alternative à Android Intentions.

OriginalL'auteur RickNotFred | 2010-03-25