7

複数のアプリで共有しているライブラリプロジェクトを作成しました。一定期間後にユーザーをログイン画面に戻す簡単なセッション有効期限機能を実装しました。

ログイン画面のアクティビティが私の主なアクティビティであるため、マニフェストでは次のようになります。

<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つの文字列を追加することは大したことではなく、あまりエレガントではありません。私のハックを使用せずに同じ目標を達成できる提案をいただければ幸いです。

4

2 に答える 2

16

以下を使用して、PackageManager から起動インテントをリクエストできます。

Intent launchIntent = PackageManager.getLaunchIntentForPackage(context.getPackageName());

これにより、「メイン」アクティビティ(「ログイン」アクティビティであると想定)を起動するために使用できるインテントが返されます。これに追加Intent.FLAG_ACTIVITY_CLEAR_TOPするだけで、準備完了です。

于 2013-01-03T10:30:05.120 に答える
0

インテントフィルターでmime-typeを使用するのはどうですか。

    <activity android:name=".LoginActivity"
              android:exported="true" android:launchMode="singleTop" android:label="@string/MT">
        <intent-filter>
            <category android:name="android.intent.category.DEFAULT"/>
            <action android:name="com.foo.ACTION_LOGIN" />
            <data android:mimeType="application/x.foo.com.mobile.login" /> 
     </intent-filter>
    </activity>

そして、次のようにアクティビティを開始します。

Intent intent = new Intent();
intent.setAction("com.foo.ACTION_LOGIN");
intent.setType("application/x.foo.com.mobile.login");
startActivity(myIntent);

したがって、インテントは、このアクション/mimeタイプのペアに登録されているアクティビティによって処理されます。確かではありませんが、そのアクティビティが同じアプリでホストされている場合は、最初に選択される可能性があります。

于 2013-01-02T21:30:46.977 に答える