web-dev-qa-db-ja.com

Androidの動的開始アクティビティ?

Android条件に基づいて)で開始アクティビティを動的に変更する方法はありますか?私が試みた(動作しなかった)は次のとおりです。

  1. androidManifest.xmlで定義されているLAUNCHERカテゴリを削除します
  2. アプリが使用するカスタムApplicationクラスを作成する
  3. applicationクラスのonCreateメソッドをオーバーライドして、次のようなコードを定義します。

if (condition) {
    startActivity(new Intent(this, MenuActivity.class));
} else {
    startActivity(new Intent(this, LoginActivity.class));
}
47
Matt Huggins

Activityの状態をチェックし、次のonCreateを起動し、それ自体でfinish()を呼び出すUIのない​​初期Activityがないのはなぜですか? finish()内からonCreate()を呼び出したことはないので、これが機能するかどうかはわかりません。

[〜#〜]編集[〜#〜]
正常に動作しているようです。わかりやすくするためのコードを次に示します。
イニシャルActivity

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Intent intent;
    if (condition) {
       intent = new Intent(this, ClassA.class);
    } else {
       intent = new Intent(this, ClassB.class);
    }
    startActivity(intent);
    finish();
    // note we never called setContentView()
}

その他Activity

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
}
58
dave.c

これが私の小さなモバイルプロジェクトの1つに対して私が個人的に行ったことです。個別の画面なしのActivityを作成する代わりに、条件があり、対応する画面を起動します。代わりに、条件を1つのActivityに入れて動的setContentView()のように:

_if (!userIsLoggedIn) {
    setContentView(R.layout.signup);
} else {
    setContentView(R.layout.homescreen);
}
_

このアプローチの2つの重要な注意事項:

1:onCreate()でそれを書く代わりに、意思決定をonResume()内に置きたいと思います。なぜなら、画面を前面に表示する必要があるときは常に後者が呼び出されるからです。 Android アクティビティライフサイクル から確認できます。たとえば、ユーザーが私のアプリをダウンロードして初めて起動した場合、ユーザーがいないためログインすると、サインアップページが表示されます。サインアップが完了したら、何らかの理由でHOMEボタン(BACKではなく、アプリを完全に終了します!)を押してから再開します。アプリでは、彼女が表示するレイアウトはすでにホーム画面のものです。onCreate()内に条件を配置すると、表示されるのはサインアップ画面です。ライフサイクルによると、アプリを前面に戻す場合は、onCreate()に戻ります。

2:このソリューションが理想的なのは、これら2つのアクティビティの機能をマージしても、コードの悪魔のような長いブロックが生成されない場合のみです。私が言ったように、私のプロジェクトは小さなものでした(その主な機能はバックグラウンドで発生します)。そのため、単一の動的Activityにはあまり多くありませんでした。画面なしのActivityは、コードをより人間が読めるようにする必要がある場合に最適です。

8
Matthew Quiros