6

アプリ内のすべてのアクティビティにログアウト ボタンがあり、ユーザーはどのアクティビティからもログアウトできます。以前のアクティビティを表示せずにユーザーをログイン アクティビティに送りたい。このために私は使用しています:

以下は、ログアウト方法の削除セッションです

public void logoutUser() {
    //clearing all data from sharedPreferences
    editor.clear();
    editor.commit();
    Intent intnt = new Intent(contxt, LoginActivity.class);
    // Closing all the Activities
    intnt.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    // Add new Flag to start new Activity
    intnt.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK );
    // Staring Login Activity
     contxt.startActivity(intnt);

}

ユーザーがログアウト ボタンをクリックしてから Logout メソッドを呼び出したときの 2 番目のアクティビティから。私の 2 番目のアクティビティ クラスは、SherlockFragmentActivity を拡張します。

public void Logout(MenuItem v) {
    sessionMngr.logoutUser();
}

ログアウト ボタンを押すとログイン画面が表示されますが、デバイスの戻るボタンを押すと以前のアクティビティが表示されます。ログイン画面で戻るボタンを押すと、Android のホーム画面に移動する必要があります。

stackoverflow に関するいくつかの質問を見ましたが、目標を達成できません。誰かが私がマニフェストファイルで android:noHistory="true" を使用していると言ったが、私が3番目のアクティビティにいるときにボタンを押し戻すと、Androidのホーム画面が表示されますが、2番目のアクティビティに移動する必要があります。FLAG_ACTIVITY_NO_HISTORY も試しましたが、これも私の目標を達成しません。

どこが間違っているのかわかりません。誰か解決策を教えてください。

前もって感謝します

4

11 に答える 11

14

これらの両方を指定してみてください。

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);

また、安全のために、このアクティビティを開始した後に finish() を呼び出してください。

于 2013-05-07T06:35:02.960 に答える
10

最善の方法は、ログアウト中にアプリケーションで LocalBrodCastManager を使用することです。

ユーザーがログアウト ボタンを押すと、以下のコードを使用してローカル ブロードキャストを送信できます。

@Override
public void onclick(View view){

  //do this on logout button click
  final String LOG_OUT = "event_logout";
  Intent intent = new Intent(LOG_OUT);
  //send the broadcast to all activities who are listening
  LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}

これで、すべてのアクティビティがこのブロードキャストをリッスンするはずです。そして、アクティビティは次のようになります

@Override 
    protected void onCreate(Bundle savedInstanceState) {

  // Register mMessageReceiver to receive messages.
  LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
      new IntentFilter(LOG_OUT));
}

// handler for received Intents for logout event 
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
  @Override
  public void onReceive(Context context, Intent intent) {
      //do your code snippet here.
      finish();
  }
};

@Override
protected void onDestroy() {
  // Unregister since the activity is not visible
  LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
  super.onDestroy();
}

: 複数のアクティビティがある場合は、基本アクティビティからすべてのアクティビティを拡張し、このローカル ブロードキャスト マネージャーを基本アクティビティにのみ実装することをお勧めします。そのため、ログアウト コードを 1 か所だけ実装する必要があります。

于 2014-03-19T19:29:17.960 に答える
3

これが私がそれを解決した方法です:

Intent intent = new Intent(context, ActivityLogin.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);

API >= 11 で動作

于 2016-04-11T06:21:26.453 に答える
2
Intent intent = new Intent(SourceActivity.this,DestinationActivity.class); 
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

ログインアクティビティまたは宛先アクティビティに移動する前に、このコードを使用してください。したがって、スタック内にあるすべてのアクティビティがクリアされます。

うまくいけば、これはあなたを助けるでしょう.

于 2016-12-27T12:47:15.350 に答える
0

ログインアクティビティで onbackpressed を使用して、バックキーを押したときに何をする必要があるかを定義できます

@Override
public void onBackPressed() {
//what it should do on back
}
于 2013-05-07T06:47:00.090 に答える
0

これは私にとってはうまくいきます。これを試してください..そしてunregisterReceiverを忘れないで ください

于 2014-11-22T05:22:53.430 に答える
0

FLAG_ACTIVITY_MULTIPLE_TASKで試してください

ログイン アクティビティはルート (ランチャー) アクティビティですか?

onResume メソッドで次のように試してみてください

if(!login) {
    finish();
}

見栄えはよくありませんが、動作するはずです。

于 2013-05-07T06:44:27.160 に答える