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.
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();
}
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
}