로그 아웃시 활동 기록 스택을 지우고 "뒤로"버튼이 로그인 한 활동을 열지 못하도록합니다.


235

내 응용 프로그램의 모든 활동을 보려면 사용자가 로그인해야합니다. 사용자는 거의 모든 활동에서 로그 아웃 할 수 있습니다. 이것은 응용 프로그램의 요구 사항입니다. 사용자가 로그 아웃하면 언제든지 사용자를 Login으로 보내려고합니다 Activity. 이 시점에서이 활동이 히스토리 스택의 맨 아래에 있기를 원하므로 "뒤로"단추를 누르면 사용자가 Android 홈 화면으로 돌아갑니다.

나는이 질문이 몇 가지 다른 장소를 요구하는 것을 보았습니다. 모두 비슷한 대답으로 대답했습니다.

설명서에 설명 된 것처럼 Intent플래그를 설정하여 로그인 활동을 열려고 FLAG_ACTIVITY_CLEAR_TOP했지만 로그인 활동을 기록 스택의 맨 아래에 배치하고 사용자가 다시 탐색하지 못하게하는 목표를 달성하지 못했습니다. 이전에 본 로그인 활동 또한 android:launchMode="singleTop"매니페스트에서 Login 활동에 사용해 보았지만 이것이 목표를 달성하지 못합니다 (어쨌든 효과가없는 것 같습니다).

나는 역사 스택을 지우거나 이전에 열었던 모든 활동을 끝내야한다고 생각합니다.

한 가지 옵션은 각 활동의 onCreate확인 상태를 finish()로그인하고 로그인하지 않은 경우입니다. 이 옵션이 마음에 들지 않습니다. 뒤로 버튼을 계속 사용할 수 있으므로 활동이 닫힐 때 뒤로 돌아갑니다.

다음 옵션은 LinkedList모든 곳에서 정적으로 액세스 할 수있는 모든 열린 활동 (아마도 약한 참조를 사용)에 대한 참조 를 유지하는 것입니다. 로그 아웃하면이 목록에 액세스하여 이전에 열었던 모든 활동을 반복 finish()하여 각 활동을 호출 합니다. 아마이 방법을 곧 구현하기 시작할 것입니다.

Intent그러나 오히려 이것을 달성 하기 위해 깃발 속임수를 사용하고 싶습니다 . 위에서 설명한 두 가지 방법 중 하나를 사용하지 않고도 응용 프로그램 요구 사항을 충족시킬 수 있다는 사실을 알게되어 기쁩니다.

Intent설정 또는 매니페스트 설정 을 사용하여이 작업을 수행 할 수있는 방법이 있습니까? 아니면 두 번째 옵션 LinkedList인 열린 활동을 유지하는 것이 최선의 옵션입니까? 아니면 내가 완전히 간과하는 또 다른 옵션이 있습니까?

답변:


213

IMHO가 더 강력한 다른 접근법을 제안 할 수 있습니다. 기본적으로 로그인 상태를 유지해야하는 모든 활동에 로그 아웃 메시지를 브로드 캐스트해야합니다. 그래서 당신은 모든 활동에를 사용 sendBroadcast하고 설치할 수 있습니다 BroadcastReceiver. 이 같은:

/** on your logout method:**/
Intent broadcastIntent = new Intent();
broadcastIntent.setAction("com.package.ACTION_LOGOUT");
sendBroadcast(broadcastIntent);

수신자 (보안 활동) :

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    /**snip **/
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction("com.package.ACTION_LOGOUT");
    registerReceiver(new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d("onReceive","Logout in progress");
            //At this point you should start the login activity and finish this one
            finish();
        }
    }, intentFilter);
    //** snip **//
}

27
@Christopher, 각 활동은 방송이 생성 될 때 방송에 등록합니다. 백그라운드로 갈 때 (즉, 새로운 활동이 스택의 맨 위에 오면) onStop ()이 호출되지만 여전히 브로드 캐스트를 수신 할 수 있습니다. onStop ()이 아닌 onDestroy ()에서 unregisterReceiver ()를 호출해야합니다.
Russell Davis

9
스택 어딘가의 활동이 OS에 의해 종료되어 메모리를 복구하면 작동합니까? 즉. 위의 브로드 캐스트가 전송 된 후 시스템이 실제로 완료된 것으로 간주하고 뒤로 버튼을 눌렀을 때 다시 생성하지 않습니까?
Jan Żankowski

5
이것은 우아한 솔루션처럼 보이지만 이것이 동 기적이지 않다는 점에 유의해야합니다.
Che Jami

34
좋은 해결책이지만 위 코드에서 설명한대로 브로드 캐스트 수신기를 등록하는 대신 LocalBroadcastManager.getInstance (this) .registerReceiver (...) 및 LocalBroadcastManager.getInstance (this) .unregisterReceiver (..)를 사용해야합니다. . 그렇지 않으면 응용 프로그램이 다른 응용 프로그램에서 의도를 수신 할 수 있습니다 (보안 문제)
Uku Loskit

5
@Warlock 당신이 맞습니다. 이 방법의 함정은 백 스택의 활동이 시스템에 의해 파괴 될 때입니다 (명백한 메모리 부족 시나리오와 같은 다양한 이유로 발생할 수 있음). 이 경우 Activity 인스턴스는 브로드 캐스트를 수신하지 않습니다. 그러나 시스템은 여전히 ​​해당 활동을 다시 작성하여 해당 활동을 다시 탐색합니다. 개발자 설정 "Do n't Keep Activities"를 켜서 테스트 / 재생할 수 있습니다
Eric Schlenz

151

새로운 안드로이드 프로그래머가이 문제를 연구하고이 모든 StackOverflow 스레드를 읽는 데 하루를 보내는 것은 통과의 의례처럼 보입니다. 나는 지금 새로 시작했고 나는 미래의 순례자를 돕기 위해 겸손한 경험의 흔적을 남깁니다.

첫째, 명백한 또는 즉시 내 연구에 따라이 작업을 수행하는 방법이 없습니다 (as of September 2012).당신이 간단 할 수 생각하지 거라고 startActivity(new Intent(this, LoginActivity.class), CLEAR_STACK)하지만 .

당신은 할 수 startActivity(new Intent(this, LoginActivity.class))FLAG_ACTIVITY_CLEAR_TOP- 이것은 스택을 검색 LoginActivity 당신의 이전 원본 인스턴스를 찾아 다시 작성하고 (위쪽으로) 스택의 나머지 부분을 취소 프레임 워크의 원인이됩니다. 로그인은 스택의 맨 아래에있을 것으로 예상되므로 이제 빈 스택이 있고 뒤로 버튼은 응용 프로그램을 종료합니다.

그러나 이것은 이전에 LoginActivity의 원래 인스턴스를 스택 기반에 남겨둔 경우에만 작동합니다. 많은 프로그래머처럼, 당신이 선택, 경우 finish()LoginActivity사용자가 성공적으로 다음 스택의 기초에 더 이상의와,에 기록되면 FLAG_ACTIVITY_CLEAR_TOP의미가 적용되지 않습니다 ... 새를 만들어 결국 LoginActivity기존의 스택의 상단에. 거의 확실하게 원하는 것이 아닙니다 (사용자가 이전 화면에 로그인하지 못하게하는 이상한 행동).

이전 그래서 만약 finish()'는 d는 LoginActivity당신이 당신의 스택을 삭제하고 새로운 시작을위한 몇 가지 메커니즘을 추구해야합니다 LoginActivity. @doreamon이 스레드에서 답변 이 가장 좋은 해결책 인 것 같습니다 (적어도 내 겸손한 눈에).

https://stackoverflow.com/a/9580057/614880

LoginActivity를 활성 상태로 두 었는지 여부에 대한 까다로운 영향으로 인해 많은 혼란이 초래 될 것입니다.

행운을 빕니다.


5
좋은 대답입니다. LoginActivity를 마치면 대부분의 사람들이 사용하도록 조언하는 FLAG_ACTIVITY_CLEAR_TOP 트릭이 작동하지 않습니다.
Konsumierer

답변에 감사드립니다. 또 다른 시나리오는 세션 (예 : fb)이있을 때와 마찬가지로 로그인 활동을 호출하지 않으므로 스택에 로그인 활동 지점이 없습니다. 그런 다음 위에서 언급 한 접근법은 쓸모가 없습니다.
Prashanth Debbadwar

118

최신 정보

슈퍼 finishAffinity()메소드는 코드를 줄이는 데 도움이되지만 동일한 결과를 얻을 수 있습니다. 스택의 모든 활동뿐만 아니라 현재 활동을 완료합니다 getActivity().finishAffinity(). 조각 상태 인 경우 사용 하십시오.

finishAffinity(); 
startActivity(new Intent(mActivity, LoginActivity.class));

원래 답변

LoginActivity-> HomeActivity-> ...-> SettingsActivity 호출 signOut ()이라고 가정하십시오.

void signOut() {
    Intent intent = new Intent(this, HomeActivity.class);
    intent.putExtra("finish", true);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // To clean up all activities
    startActivity(intent);
    finish();
}

활동 :

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    boolean finish = getIntent().getBooleanExtra("finish", false);
    if (finish) {
        startActivity(new Intent(mContext, LoginActivity.class));
        finish();
        return;
    }
    initializeView();
}

이것은 나를 위해 작동합니다, 그것이 당신에게도 도움이되기를 바랍니다. :)


1
귀하의 솔루션은 사용자가 signOut을 클릭하고 한 활동 (HomeActivity)으로 돌아갈 것이라고 가정합니다. 스택에 10 개의 활동이있는 경우 어떻게합니까?
IgorGanapolsky

11
HomeActivity 위에 10 개의 활동이있는 경우 FLAG_ACTIVITY_CLEAR_TOP 플래그는 모든 활동을 정리하는 데 도움이됩니다.
thanhbinh84

1
이것은 HomeActivity를 시작할 때 OnAct of HomeActivity를 얻는 경우에만 작동합니다. 재택 활동을 시작한다고해서 이미 완료되거나 파괴되지 않는 한 반드시 재 작성할 필요는 없습니다. HomeActivity를 다시 만들 필요가 없으면 OnCreate가 호출되지 않으며 로그 아웃하면 홈 활동에 앉아있게됩니다.
topwik

1
이것은 가능한 솔루션이며 로그 아웃과 같은 간단한 (사용자를 위해) 기능을 코딩하는 것이 훨씬 적습니다.
Subin Sebastian

2
Intent.FLAG_ACTIVITY_CLEAR_TOP 플래그는 HomeActivity를 포함한 모든 활동을 정리하는 데 도움이되므로이 활동을 다시 시작하면 onCreate () 메소드가 호출됩니다.
thanhbinh84

73

API 11 이상을 사용하는 경우 다음을 시도해보십시오 FLAG_ACTIVITY_CLEAR_TASK.-문제를 정확하게 해결하는 것 같습니다. 분명히 API 11 이전의 군중은 @doreamon이 제안했듯이 다른 모든 활동을 추가로 확인하는 조합을 사용해야합니다.

(또한 참고 : 이것을 사용하려면 전달해야합니다 FLAG_ACTIVITY_NEW_TASK)

Intent intent = new Intent(this, LoginActivity.class);
intent.putExtra("finish", true); // if you are checking for this in your other Activities
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | 
                Intent.FLAG_ACTIVITY_CLEAR_TASK |
                Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();

1
매력처럼 작동합니다. 대단히 감사합니다! min API 14에서 개발할 때 이것이 유일하게 구현해야합니다.
AndyB

1
LoginActivity 에이 솔루션을 사용할 때 FLAG_ACTIVITY_CLEAR_TOP이 필요하지 않습니다.
Bharat Dodeja

나는 finish();로그 아웃 후 되돌아 가지 않도록 막기 위해 일을 할 것이라고 생각 합니다. 플래그를 설정해야합니까?
Pankaj

액티비티 컨텍스트 외부에서 startActivity ()를 호출하면 예외가 발생합니다. FLAG_ACTIVITY_NEW_TASK 플래그
Aman

31

나는 이것에도 몇 시간을 보냈다 ... 그리고 FLAG_ACTIVITY_CLEAR_TOP 은 당신이 원하는 것처럼 들린다 는 것에 동의합니다 : 시작되는 활동을 제외하고 전체 스택을 지우면 뒤로 버튼이 응용 프로그램을 종료합니다. 그러나 Mike Repass가 언급했듯이 FLAG_ACTIVITY_CLEAR_TOP은 실행중인 활동이 이미 스택에있는 경우에만 작동합니다. 활동이 없으면 플래그는 아무것도하지 않습니다.

무엇을해야합니까? 와 스택의 활동 존재 발사를 넣어 FLAG_ACTIVITY_NEW_TASK 그 활동을 역사의 스택에 새 작업의 시작을한다. 그런 다음 FLAG_ACTIVITY_CLEAR_TOP 플래그를 추가하십시오.

이제 FLAG_ACTIVITY_CLEAR_TOP이 스택에서 새로운 활동을 찾으면 모든 것이 지워지기 전에 거기에 있고 풀려납니다.

여기 내 로그 아웃 기능이 있습니다. View 매개 변수는 기능이 첨부 된 버튼입니다.

public void onLogoutClick(final View view) {
    Intent i = new Intent(this, Splash.class);
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    startActivity(i);
    finish();
}

1
FLAG_ACTIVITY_CLEAR_TASK아직 추가되지 않았으므로 API <= 10에서 작동 하지 않습니다
Youans

1
@christinac 당신은 FLAG_ACTIVITY_CLEAR_TOP에 대해 이야기하고 있으며 코드 스 니펫에는 FLAG_ACTIVITY_CLEAR_TASK가 있습니다. 그렇다면 어느 것이 유효합니까?
Marian Paździoch

10

많은 답변. 이것도 도움이 될 것입니다-

Intent intent = new Intent(activity, SignInActivity.class)
                .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
                .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
this.startActivity(intent);
this.finish();

코 틀린 버전

Intent(this, SignInActivity::class.java).apply {
    addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
    addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
}.also { startActivity(it) }
finish()

4

이것을 사용하면 도움이 될 것입니다. 약간 수정 된 xbakesx 답변.

Intent intent = new Intent(this, LoginActivity.class);
if(Build.VERSION.SDK_INT >= 11) {
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK);
} else {
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
}
startActivity(intent);

4

허용 된 솔루션이 올바르지 않습니다. 브로드 캐스트 수신기를 사용하는 것이이 문제에 대한 좋은 아이디어가 아니기 때문에 문제가 있습니다. 활동이 이미 onDestroy () 메소드를 호출 한 경우 수신자를 얻지 못합니다. 가장 좋은 솔루션은 공유 환경 설정에 부울 값을 가지며 활동의 onCreate () 메소드에서 확인하는 것입니다. 사용자가 로그인하지 않은 상태에서 호출되지 않으면 활동을 완료하십시오. 이에 대한 샘플 코드는 다음과 같습니다. 매우 간단하고 모든 조건에서 작동합니다.

protected void onResume() {
  super.onResume();
  if (isAuthRequired()) {
    checkAuthStatus();
  }
}

private void checkAuthStatus() {
  //check your shared pref value for login in this method
  if (checkIfSharedPrefLoginValueIsTrue()) {
    finish();
  }
}

boolean isAuthRequired() {
  return true;
}

1
몇 년이 지났지 만 둘 다했다고 생각합니다. 각 활동은 LoggedInActivity를 확장하여 onCreate ()에서 사용자의 로그인 상태를 확인했습니다. LoggedInActivity는 "사용자 로그 아웃"브로드 캐스트를 수신했으며 이에 응답하기 위해 필요한 모든 작업을 수행했습니다.
skyler

2
아마도 checkAuthStatus를 onResume()메소드 에 넣어야 할 것입니다 . 뒤로 단추를 누르면 활동이 작성되지 않고 재개 될 가능성이 더 큽니다.
maysi

1
@maysi 덕분에 제안을 위해, 그래 이런 식으로 뒤로 버튼 나는 항목 업데이트도 제대로 작동
Yekmer Simsek

4

언젠가 finish()작동하지 않는

나는 그 문제를 해결했다.

finishAffinity()


3

이 질문에 다른 접근 방식을 제안합니다. 아마도 가장 효율적인 방법은 아니지만 적용하기가 가장 쉽고 코드가 거의 필요하지 않다고 생각합니다. 첫 번째 활동 (다음 경우 로그인 활동)에 다음 코드를 작성하면 사용자가 로그 아웃 한 후 이전에 시작한 활동으로 돌아갈 수 없습니다.

@Override
public void onBackPressed() {
    // disable going back to the MainActivity
    moveTaskToBack(true);
}

LoginActivity는 사용자가 로그인 한 직후에 완료되어 뒤로 버튼을 눌러 나중에 다시 로그인 할 수 없다고 가정합니다. 대신, 사용자는 앱에서 로그 아웃 버튼을 눌러 올바르게 로그 아웃해야합니다. 이 로그 아웃 버튼이 구현하는 것은 다음과 같은 간단한 의도입니다.

Intent intent = new Intent(this, LoginActivity.class);
startActivity(intent);
finish();

모든 제안을 환영합니다.


2

선택된 답변은 영리하고 까다 롭습니다. 내가 한 방법은 다음과 같습니다.

LoginActivity는 작업의 루트 활동입니다 . Manifest.xml에서 android : noHistory = "true" 를 설정하십시오. SettingsActivity에서 로그 아웃한다고 가정하면 다음과 같이 할 수 있습니다.

    Intent i = new Intent(SettingsActivity.this, LoginActivity.class);
    i.addFlags(IntentCompat.FLAG_ACTIVITY_CLEAR_TASK
            | Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(i);

2

내 응용 프로그램에서 생각해 낸 해결책은 다음과 같습니다.

LoginActivity에서 로그인을 성공적으로 처리 한 후 API 수준에 따라 다음 로그인을 다르게 시작합니다.

Intent i = new Intent(this, MainActivity.class);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    startActivity(i);
    finish();
} else {
    startActivityForResult(i, REQUEST_LOGIN_GINGERBREAD);
}

그런 다음 LoginActivity의 onActivityForResult 메소드에서

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB &&
        requestCode == REQUEST_LOGIN_GINGERBREAD &&
        resultCode == Activity.RESULT_CANCELED) {
    moveTaskToBack(true);
}

마지막으로 다른 활동에서 로그 아웃을 처리 한 후 :

Intent i = new Intent(this, LoginActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i);

진저 브레드에있을 때 MainActivity에서 뒤로 버튼을 누르면 LoginActivity가 즉시 숨겨집니다. Honeycomb 이상에서는 로그인을 처리 한 후 LoginActivity를 마치고 로그 아웃을 처리 한 후 올바르게 다시 작성합니다.


그것은 나를 위해 작동하지 않습니다. 제 경우에는 조각 활동을 사용했습니다. Onactivityresult 메소드가 호출되지 않습니다.
Mohamed Ibrahim

1

이것은 나를 위해 일했다 :

     // After logout redirect user to Loing Activity
    Intent i = new Intent(_context, MainActivity.class);
    // Closing all the Activities
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);

    // Add new Flag to start new Activity
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    // Staring Login Activity
    _context.startActivity(i);

제공하는 솔루션에 대한 설명을 조금 더 추가하여 답변을 더 자세히 설명해 주시겠습니까?
abarisone 2016 년

0

StartActivityForResult로 활동을 시작하고 로그 아웃하는 동안 결과를 설정하고 결과에 따라 활동을 완료하십시오.

intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivityForResult(intent, BACK_SCREEN);

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
    case BACK_SCREEN:
        if (resultCode == REFRESH) {
            setResult(REFRESH);
            finish();
        }
        break;
    }
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        AlertDialog alertDialog = builder.create();

        alertDialog
                .setTitle((String) getResources().getText(R.string.home));
        alertDialog.setMessage((String) getResources().getText(
                R.string.gotoHome));
        alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "Yes",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog,
                            int whichButton) {

                        setResult(REFRESH);
                        finish();
                    }

                });

        alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "No",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog,
                            int whichButton) {
                    }
                });
        alertDialog.show();
        return true;
    } else
        return super.onKeyDown(keyCode, event);

}

0

@doreamon이 제공 한 솔루션은 하나를 제외한 모든 경우에 잘 작동합니다.

로그인 후 로그인 종료 화면 사용자가 중간 화면으로 직접 이동했습니다. 예를 들어 A-> B-> C의 흐름에서 다음과 같이 탐색하십시오. 로그인-> B-> C-> 바로 가기를 누르십시오. FLAG_ACTIVITY_CLEAR_TOP을 사용하면 Home (A)가 스택 기록에 없으므로 C 활동 만 지 웁니다. A 화면에서 뒤로를 누르면 B로 돌아갑니다.

이 문제를 해결하기 위해 액티비티 스택 (Arraylist)을 유지할 수 있으며 홈을 누르면이 스택의 모든 액티비티를 종료해야합니다.


0

SharedPreferences 또는 응용 프로그램 활동에서 플래그를 관리하면 가능합니다.

앱을 시작할 때 (Splash 화면에서) 플래그를 false로 설정하십시오. Logout Click 이벤트에서는 플래그를 true로 설정하고 모든 활동의 OnResume ()에서 플래그가 true인지 확인한 다음 finish ()를 호출하십시오.

그것은 매력처럼 작동합니다 :)


0

로그 아웃을 클릭하면

private void GoToPreviousActivity() {
    setResult(REQUEST_CODE_LOGOUT);
    this.finish();
}

이전 활동의 onActivityResult ()는 모든 활동을 완료 할 때까지이 코드를 다시 호출합니다.


1
즉, finish ()를 한 번에 브로드 캐스팅하는 대신 모든 활동을 선형으로 탐색해야합니까?
IgorGanapolsky

@Igor G. 예, 순차적으로 마무리하는 다른 방법입니다
Mak

-1

한 가지 옵션은 각 활동의 onCreate 확인 로그인 상태를, 로그인하지 않은 경우 finish ()를 갖는 것입니다. 이 옵션이 마음에 들지 않습니다. 뒤로 버튼을 계속 사용할 수 있으므로 활동이 닫힐 때 뒤로 돌아갑니다.

당신이하고 싶은 것은 onStop () 또는 onPause () 메소드에서 logout () 및 finish ()를 호출하는 것입니다. 이렇게하면 액티비티가 더 이상 액티비티 스택에 포함되지 않으므로 액티비티가 다시 시작되면 Android가 onCreate ()를 호출하게됩니다. 그런 다음 onCreate ()에서 로그인 상태를 확인하고 로그인하지 않은 경우 로그인 화면으로 전달하십시오.

또 다른 방법은 onResume ()에서 로그인 상태를 확인하고 로그인하지 않은 경우 finish () 및 로그인 활동을 시작하는 것입니다.


각 활동 일시 중지 또는 중지시 로그 아웃하지 않는 것이 좋습니다. 또한 응용 프로그램은 로그 아웃 또는 로그인을 시작하므로 실제로 로그인했는지 확인할 필요가 없습니다.
skyler

@Ricardo : 솔루션에 BroadcastReceiver가 필요하지 않습니까?
IgorGanapolsky 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.