web-dev-qa-db-fra.com

comment démarrer une activité dans un autre module explicitement

J'ai créé un aar et je l'ai ajouté à mon projet en tant que module. dans ce module, j'ai une HelloWorldActivity que je veux exécuter.

mon manifeste de module ressemble à ceci.

<application
    Android:allowBackup="true"
    Android:icon="@mipmap/ic_launcher"
    Android:label="@string/app_name"
    Android:theme="@style/AppTheme" >
    <activity
        Android:name="ir.sibvas.testlibary1.HelloWorldActivity"
        Android:label="@string/app_name" >

        <intent-filter>
            <action Android:name="ir.sibvas.testlibary1.HelloWorldActivity" />
            <category Android:name="Android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

    <activity
        Android:name=".MainActivity"
        Android:label="@string/title_activity_main" >

        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />
            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>


    </activity>
</application>

Maintenant, je peux commencer cette activité à partir de mon projet en utilisant ce code

 Intent intent = new Intent("ir.sibvas.testlibary1.HelloWorldActivity");
 startActivity(intent);

mais comme vous pouvez le voir, ce code est implicite et le problème avec les appels implicites est que si j'utilise ce module dans plusieurs applications, toutes deux installées sur la machine utilisateur, il affichera une boîte de dialogue de sélection d'application à l'utilisateur. Alors, comment rendre cet appel explicite, empêchant l'utilisateur de changer d'application?

ce code ne s'exécutera pas car HelloWorldActivity n'est pas dans le même package que l'activité d'appel

Intent intent = new Intent(this, HelloWorldActivity.class);
startActivity(intent);

Je ne veux vraiment pas changer mon module pour chaque projet qui l'utilise.

17
Alireza A. Ahmadi

Vous pouvez utiliser la Class.forName(), cela a fonctionné pour moi lorsque j'ai eu besoin de démarrer une activité qui se trouve dans un autre module de mon projet.

 Intent intent = null;
    try {
        intent = new Intent(this, 
           Class.forName("ir.sibvas.testlibary1.HelloWorldActivity"));
        startActivity(intent);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
30
Moti Bartov

premier lancement d'activité de module puis deuxième lancement d'activité de module et écrire une ligne de code est parfaitement bien.

 Intent launchIntent = getPackageManager().getLaunchIntentForPackage("com.your.packagename");
            if (launchIntent != null) {
                startActivity(launchIntent);//null pointer check in case package name was not found
            }
1
Arvind Rajput