複数のアプリで共有しているライブラリプロジェクトを作成しました。一定期間後にユーザーをログイン画面に戻す簡単なセッション有効期限機能を実装しました。
ログイン画面のアクティビティが私の主なアクティビティであるため、マニフェストでは次のようになります。
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Theme.Sherlock.Light.DarkActionBar"
android:name="com.blah.application.MyApplication" >
<activity
android:name="com.blah.activity.LoginScreenActivity"
android:label="@string/title_activity_main"
android:screenOrientation="portrait"
android:configChanges="orientation|keyboardHidden"
android:windowSoftInputMode="adjustPan">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
セッションの有効期限が切れたら、ユーザーをログイン画面に戻したいのですが、ライブラリを使用している特定のアプリによって異なる可能性があるため、アクティビティの名前をハードコーディングしたくありません。これが私が以前やっていたことです:
Intent intent = new Intent(context, LoginScreenActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(intent);
アプリのメインアクティビティがLoginScreenActivityと異なる場合、これは機能しません。「LoginScreenActivity.class」をハードコーディングしたくありません。プログラムでメインクラスの名前を決定し、ユーザーをそのアクティビティに誘導したいのですが...誰かが私を助けてくれますか?
前もって感謝します!
編集
同じ最終結果を達成する方法を見つけましたが、それは間違いなく素晴らしいことではありません。同じライブラリ(文字列、boolsなど)を使用して新しいアプリをデプロイするために必要な構成がある程度あるため、「メイン」アクティビティ名を定義する特定のアプリのstrings.xmlファイルに文字列を追加しましたそのアプリの場合:
<string name="mainClassName">com.blah.specificapp.activity.SpecificAppLoginScreenActivity</string>
次に、名前でそのクラスのハンドルを取得し、そこにユーザーをリダイレクトできます。
Class<?> clazz = null;
try
{
clazz = Class.forName(context.getString(R.string.mainClassName));
}
catch (ClassNotFoundException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
if(clazz != null)
{
Intent intent = new Intent(context, clazz);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(intent);
}
私はこれがひどい解決策であることを知っていますが、それは機能します。私が言ったように、とにかく新しいアプリごとに行う必要のある設定がある程度あるので、もう1つの文字列を追加することは大したことではなく、あまりエレガントではありません。私のハックを使用せずに同じ目標を達成できる提案をいただければ幸いです。