web-dev-qa-db-ja.com

アプリを開いたときに起動するアクティビティを動的に選択する方法

使用する前にサービスにログインする必要があるアプリを書いています。 Android=これまでのところ、私の理解では、マニフェストのランチャーから開いたときに起動するアクティビティを選択する必要があります。コンパイル時に起動するアクティビティがわかりません。ユーザーにアイコンをクリックしてもらい、ログインしているかどうかを確認してから、それに基づいてログインアクティビティを起動するか、メインアプリアクティビティを起動するかを決定します。これを行う方法はありますか?

54
msfeldstein

いいえ、コードを実行する必要があるため、宣言的に(マニフェストで)これを言う方法はありません。アクティビティ(マニフェストで設定)を起動する必要があります。次に、ユーザーがログオンしているかどうかに基づいて、このアクティビティでインテントを介して起動する2番目のアクティビティを決定する必要があります。

final Class<? extends Activity> activityClass;
if(userIsLoggedOn())
    activityClass = LoggedOnActivity.class;
else
    activityClass = LogInActivity.class;

Intent newActivity = new Intent(context, activityClass);
context.startActivity(newActivity);
64

activity-alias を使用してこれを行う別の方法があります。

  1. マニフェストで:

    <activity
        Android:name=".LoginActivity"
        Android:icon="@drawable/ic_launcher_main"
        Android:label="Login" >
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />
            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    
    <activity
        Android:name=".MainActivity"
        Android:icon="@drawable/ic_launcher_main"
        Android:label="MainActivity" >
    </activity>
    
    <activity-alias
        Android:name=".AliasActivity"
        Android:label="AliasActivity"
        Android:enabled="false"
        Android:targetActivity=".MainActivity" >
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />
            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity-alias>
    

    2.ログインアクティビティのどこか:

    String s = getApplicationContext().getPackageName();
    ComponentName cm = new ComponentName(s, s+".AliasActivity");
    ComponentName cm2 = new ComponentName(s, s+".Login");
    PackageManager pm = this.getPackageManager();
    pm.setComponentEnabledSetting(cm, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 1);
    pm.setComponentEnabledSetting(cm2, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0);
    

その後、アプリは一度強制終了され、次回アプリを起動すると、MainActivityがランチャーになります。

7
Ali.DM

Android Framewowrkはメソッドを提供します
public Intent setClassName (String packageName, String className)

string内のクラスの名前だけで呼び出すアクティビティを動的に選択するために使用できるIntentクラスの例。

ここに例があります

    String packageName = getPackageName(), className=packageName+"subFolder.myActivity";
    Intent i = new Intent();
    i.setClassName(packageName, className);
    startActivity(i); 

https://developer.Android.com/reference/Android/content/Intent.html#setClassName(Java.lang.String、%20Java.lang.String)

1
Harsha

上記のように@auvalが言ったように、私は以下のようにコードをテストし、それはうまくいきます!最初、AndroidManifest.xmlファイルは次のようになります。

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

<activity
    Android:name=".MainActivity">
</activity>

<activity-alias
    Android:name=".AliasActivity"
    Android:enabled="false"
    Android:targetActivity=".MainActivity">
    <intent-filter>
        <action Android:name="Android.intent.action.MAIN"/>
        <category Android:name="Android.intent.category.LAUNCHER"/>
    </intent-filter>
</activity-alias>

次に、これらのコードをMainActivity.classのどこかに配置できます。

private void changeLauncher() {
         String s = getApplicationContext().getPackageName();
         ComponentName cm = new ComponentName(s, s + ".AliasActivity");
        ComponentName cm2 = new ComponentName(s, s + ".LauncherActivity");
        PackageManager pm = this.getPackageManager();
        pm.setComponentEnabledSetting(cm,
           PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 
           PackageManager.DONT_KILL_APP );
        pm.setComponentEnabledSetting(cm2, 
           PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 
           PackageManager.DONT_KILL_APP);
         }

これで、最初にアプリを起動するとLauncherActivityが起動し、アプリを終了すると再びアプリを実行するとMainActivityが起動します。

0
MichaelZ