web-dev-qa-db-ja.com

AndroidでプログラムでLauncherアクティビティを構成するにはどうすればよいですか?

私は2つのアクティビティLoginActivityMainActivityのアプリに取り組んでいます。ユーザーが最初にアプリを開くと、ユーザーはログインし、資格情報(ユーザー名とトークン)がPreferencesに保存されます。

これで、ユーザーがアプリを再度開くと、MainActivityが開始されます。 Applicationクラスでこれらのアクティビティを切り替えて、LAUNCHER_ACTIVITYのインテントフィルターをマニフェストから削除しようとしましたが、機能しません。

保存された設定に基づいて、プログラムでランチャーアクティビティを切り替える方法はありますか?

19
aruke

要するに、デフォルトで起動されるActivityを変更することはできません。更新:別の回答で CommonsWare で説明されている代替案があります。

ただし、妥当な回避策があります。 MainActivityで、ユーザーがログインしているかどうかを確認し、すぐにLoginActivityにリダイレクトできます。これには、ログイン後に自動的にMainActivityに戻るという追加の利点があります。

または、常に最初にLoginActivityに移動し、ユーザーがすでにログインしている場合は、それらをMainActivityに送信する(Intent履歴を書き換えて、LoginActivityへの戻りを削除するか、 noHistory フラグをマニフェスト)。

15
Knossos

保存された設定に基づいて、プログラムでLauncherアクティビティを切り替える方法はありますか?

あなたはこれを試すことができます:

ステップ#1:通常どおりLoginActivityLAUNCHER _<intent-filter>_を持たせ、MainActivityに_<intent-filter>_を持たせません。

ステップ#2: マニフェストの_<activity-alias>_要素 が、MainActivity _<intent-filter>_を含むLAUNCHERを指すようにします。

ステップ3:_Android:enabled="false"_を_<activity-alias>_に置くと、デフォルトで無効になるため、アプリが最初にインストールされたとき、ランチャーアイコンはLoginActivityのみです。

ステップ#4:ユーザーがログインし、MainActivityがランチャーアクティビティになるように変更する場合は、PackageManagerおよびsetComponentEnabledSetting()を使用して_<activity-alias>_を作成します。有効にし、LoginActivityを無効にします。

すべてのホーム画面がこの変更をオンザフライで検出するわけではありません。そのため、変更を反映するには、デバイスを再起動する必要があります。このため、1つのランチャーアクティビティを使用することをお勧めします。必要に応じて、そのランチャーアクティビティに_Theme.NoDisplay_を設定し、Fahimの回答に従ってonCreate()の正しい「実際の」アクティビティにルーティングすることができます。

22
CommonsWare

最も簡単な方法は、いつものようにMainActivityランチャーアクティビティを作成することです。
次に、ユーザーがすでにログインしている場合はSharedPreferences経由でMainActivity#onCreate(Bundle)をチェックインし、ログインしていない場合はすぐにLoginActivityを開始します。ユーザーがログインしたら、ユーザーがSharedPreferencesにログインしたことを示すブールフラグを保存し、MainActivityを終了します。

3
aga

アクティビティは必ずしもUIを必要としないため、マニフェストでランチャーアクティビティを使用して、必要なアクティビティを起動できます。

2
Olayinka

私の知る限り、プログラムでランチャーを変更することはできませんが、それも意味がありません。

LoginActivityのonCreateで、ユーザー名とトークンがすでに保存されているかどうかを確認し、それで自動的にログインしようとすると、MainActivityにリダイレクトされます。アプリの動作方法に応じて、ユーザーがログインしているかどうかをチェックする変数を設定できます。ユーザーがLoginActivityである場合、再度ログインすることなくユーザーをMainActivityにリダイレクトします。

//LoginActivity
onCreate(Bundle bundle)
{
    /* ... */

    //Or whatever you use to login (it could also go inside a thread or an AsyncTask
    if (login())
    {
        //Intent
        Intent intent = new Intent(this, MainActivity.class);

        //Start Activity
        startActivity(intent);

        //Finish this activity, so when user pressed back the login activity will not come forth and  the app will exit 
        //this looks like when a user has logged in once, the login screen will not be visible to him (unless you want to)
        finish();
    }
}

ログインが成功した場合にのみユーザー名とトークンを保存するように設定することもできます。つまり、上記のコードは次のように変更できます。

if (getUsername() != null)
{
    /* Start Main Activity */
}

これはログインを試みませんが、資格情報が少なくとも1回はログインしているため、資格情報が正しいことを認識しています。

アプリがこれらの方法とは異なる動作をする場合は、遠慮なく言ってください。詳細をお知らせできる場合があります

2
TomTsagk

アプリの最初に表示したいXMLにOnCreateの後にIntentを追加するだけです。

public class LoginActivity extends Activity {

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       //add some code to detect if user is logged in
       if (user != null){
           Intent in = new Intent(LoginActivity.this, YourDesiredActivity.class);
           startActivity(in);
       } 
   ..........
   ...........
0
Loyal Fine