Aarを作成し、モジュールとしてプロジェクトに追加しました。このモジュールには、実行したいHelloWorldActivityがあります。
私のモジュールマニフェストは次のようになります。
<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>
これで、このコードを使用してプロジェクトからこのアクティビティを開始できます
Intent intent = new Intent("ir.sibvas.testlibary1.HelloWorldActivity");
startActivity(intent);
しかし、このコードは暗黙的であり、暗黙的な呼び出しの問題は、このモジュールを複数のアプリで使用すると、両方がユーザーのデバイスにインストールされている場合に、アプリセレクターダイアログがユーザーに表示されることを確認できます。では、この呼び出しを明示的にして、ユーザーがアプリを切り替えられないようにするにはどうすればよいですか?
helloWorldActivityが呼び出しアクティビティと同じパッケージにないため、このコードは実行されません
Intent intent = new Intent(this, HelloWorldActivity.class);
startActivity(intent);
モジュールを使用するプロジェクトごとにモジュールを変更したくありません。
Class.forName()
を使用できます。プロジェクトの別のモジュールにあるアクティビティを開始する必要があるときに機能しました。
Intent intent = null;
try {
intent = new Intent(this,
Class.forName("ir.sibvas.testlibary1.HelloWorldActivity"));
startActivity(intent);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
最初のモジュールアクティビティの起動、次に2番目のモジュールアクティビティの起動、コード行の記述は完全に問題ありません。
Intent launchIntent = getPackageManager().getLaunchIntentForPackage("com.your.packagename");
if (launchIntent != null) {
startActivity(launchIntent);//null pointer check in case package name was not found
}