3

というランチャーアクティビティがありHomeActivityます。

そして、LoginActivityユーザーが他の画面にアクセスするためにログインする必要がある場所から。

HomeActivityとしてマークされていsingleTaskます。

HomeActivity のonCreate()メソッドではLoginActivity、ユーザーがログインしていない場合に起動します。

では、スタック内で表示される次のアクティビティが であると仮定して、をLoginActivity呼び出すだけでfinish()、 を閉じます。LoginActivityHomeActivity

このセットアップは、1 つを除いて、ほとんどの場合に機能します。

  1. ユーザーがログインしていません。
  2. アプリを起動 -> 起動HomeActivity
  3. ログインが検出されません -> 起動しますLoginActivity
  4. で、ホームLoginActivityを押します。
  5. アプリを起動すると、LoginActivity.
  6. ログインを行い、成功するLoginActivityと終了です。

の代わりにHomeActivity、ホームスクリーンが表示されます。それは期待されていますか?私は何か間違ったことをしていますか?

開発者向けオプションの [アクティビティを保持しない]がオフになっいません。そのため、アクティビティ スタックが をどのように失うのか疑問に思ってHomeActivityHomeActivityましたLoginActivity

LoginActivity の Cancel または Login メソッド:

public void doLogin(View v) {
        setResult(RESULT_OK);
        finish();
}

public void cancel(View v) {
       setResult(RESULT_CANCELED);
       finish();
}

LoginActivity の呼び出し:

onCreate()とから呼び出されonNewIntent()ます。

なぜ onNewIntent() が必要なのですか? そのため、どこからでも を開始でき、セッションの有効期限が切れHomeActivityonNewIntent()場合に呼び出されます。上にある他のすべてのアクティビティはHomeActivity削除され、LoginActivity表示されるはずです。

protected void onCreated(Bundle savedInstance){
        if(!isLoggedIn()){
             startLoginActivity();
        }
}

protected void onNewIntent(Intent intent){
        if(!isLoggedIn()){
             startLoginActivity();
        }
}

private void startLoginActivity(){
        Intent intent = new Intent(this, LoginActivity.class);
        startActivityForResult(intent, 100);
}

HomeActivity のアクティビティ結果について:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(resultCode == RESULT_CANCELED){
                finish();
        }
        super.onActivityResult(requestCode, resultCode, data);
}

マニフェスト ファイル:

<activity android:launchMode="singleTask"
            android:name="com.example.checkact.HomeActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
</activity>
<activity android:name="com.example.checkact.LoginActivity"></activity>

更新:を使用singleTopすると正常に動作するようですが、なぜこのように動作するのかわかりませんsingleTask

4

1 に答える 1

-1

私はこのための活動を積み重ねません。

ログイン アクティビティを起動する必要がある場合は、アクティビティを開始し、HomeActivity で finish() を呼び出します。

if(!loggedIn){
    Intent logInActivity = new Intent(MainActivity.this, LoginActivity.class);
    //Potentially display a toast to say why the user is being directed to the log in screen
    // add bundle into that flags to Go back to main activity. 
   logInActivity.put extra("activity", 1);
    startActivity(logInActivity);
    finish();
}

ログイン アクティビティと同様に、認証に成功したら、次を呼び出します。

if(loggedIn){
    // get bundle it 
      Int a = get intent.getExtras().getInt("activity");
     if(a==1)
    Intent next= new Intent(LoginActivity.this, MainActivity.class);
    ///have a code for each activity that you could resume to
    startActivity(next);
    finish();
}

これにより、状態の問題が軽減されます。

于 2013-11-14T09:06:59.923 に答える