이전 활동 모두 완료
내 응용 프로그램에는 다음과 같은 흐름 화면이 있습니다.
Home->screen 1->screen 2->screen 3->screen 4->screen 5
이제 log out
각 화면에 공통 버튼이 있습니다.
( Home/ screen 1 / screen 2 /screen 3/ screen 4 / screen 5
)
사용자가 모든 화면에서 로그 아웃 버튼을 클릭하면 모든 화면이 완료되고 새 화면 Log in
이 열리기를 원합니다 .
나는 FLAG_ACTIVITY
이것을 달성하기 위해 거의 모든 것을 시도했다 . 또한 stackoverflow에서 일부 답변을 겪었지만 문제를 해결할 수는 없습니다. 내 응용 프로그램이 Android 1.6에 있으므로 사용할 수 없습니다FLAG_ACTIVITY_CLEAR_TASK
문제를 해결할 방법이 있습니까?
사용하다:
Intent intent = new Intent(getApplicationContext(), Home.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
이렇게하면 집 위에있는 모든 활동이 지워집니다.
사용자가 로그인하고 홈을 생성 할 때 로그인 화면을 마치고 그 화면의 맨 위에 1부터 5까지의 모든 화면이 있다고 가정합니다. 내가 게시 한 코드는 다른 모든 활동을 마치는 홈 화면으로 돌아갑니다. 인 텐트에 추가 기능을 추가하고 홈 화면 활동에서이를 읽고 완료 할 수도 있습니다 (로그인 화면을 다시 시작하거나 다른 방법으로 시작할 수 있음).
확실하지 않지만이 플래그로 로그인을 시도 할 수도 있습니다. 이 경우 활동이 어떻게 주문되는지 모르겠습니다. 따라서 현재 표시된 화면을 포함하여 현재 화면 아래의 화면을 지우는 지 확실하게 알 수 있습니다.
도움이 되었기를 바랍니다.
시도해 볼 수 있습니다 Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK
. 이전의 모든 활동을 완전히 지우고 새로운 활동을 시작합니다.
새 활동을 시작하기 전에 다음 코드를 추가하십시오.
finishAffinity();
또는 이전 버전의 Android에서 작동하려는 경우 :
ActivityCompat.finishAffinity(this);
사용자가 열려있는 모든 활동을 종료 하려면 애플리케이션을 시작할 때 실행되는 첫 번째 활동을로드하고 다른 모든 활동을 지우고 마지막 남은 활동을 완료하는 단추를 눌러야합니다. 사용자가 종료 버튼을 누를 때 다음 코드를 실행하십시오. 내 경우에는 LoginActivity
내 프로그램에서 가장 먼저 실행되는 활동입니다.
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);
위의 코드는를 제외한 모든 활동을 지 웁니다 LoginActivity
. 그런 다음 LoginActivity
's' 안에 다음 코드를 삽입하여 onCreate(...)
언제 LoginActivity
재생성되고 'EXIT'신호가 전달 되는지 듣습니다 .
if (getIntent().getBooleanExtra("EXIT", false)) {
finish();
}
Android에서 종료 버튼을 만드는 것이 왜 그렇게 어려운가요?
Android는 사용자가 사용하는 프로그램이 백그라운드에서 실행 중인지 여부에 대해 신경 쓰지 않기를 원하기 때문에 응용 프로그램에 "종료"버튼을 사용하지 못하게하려고합니다.
Android OS 개발자는 프로그램이 예기치 않게 종료되고 전화기 전원이 꺼진 상태에서 살아남을 수 있기를 원하며, 사용자가 프로그램을 다시 시작하면 중단 된 곳에서 바로 들어옵니다. 따라서 사용자는 응용 프로그램을 사용하는 동안 전화를 받고 더 많은 리소스를 위해 응용 프로그램을 해제해야하는지도를 열 수 있습니다.
사용자가 응용 프로그램을 다시 시작하면 중단없이 중단 된 부분을 바로 가져옵니다. 이 종료 버튼은 활동 관리자의 전원을 사용하여 자동으로 관리되는 Android 프로그램 수명주기에 문제를 일으킬 수 있습니다.
Intent intent = new Intent(this, classObject);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
이것은 모든 안드로이드 버전에서 작동합니다. 어디 IntentCompat
클래스는 안드로이드 지원 라이브러리에 추가.
활동에 다음을 사용하십시오
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
프래그먼트 사용을 위해 CLEAR_TASK 플래그를 제거하십시오.
이것이 일부 사람들에게 사용될 수 있기를 바랍니다.
public void finishAffinity ()
API 레벨 16에서 추가됨
현재 작업에서 동일한 선호도를 가진 바로 아래의 모든 활동뿐만 아니라이 활동을 완료하십시오. 이것은 일반적으로 응용 프로그램을 다른 작업 (예 : 이해하는 콘텐츠 유형의 ACTION_VIEW에서)으로 시작할 수 있고 사용자가 위로 탐색을 사용하여 현재 작업에서 자체 작업으로 전환 한 경우에 사용됩니다. 이 경우 사용자가 두 번째 응용 프로그램의 다른 활동으로 이동 한 경우 모든 작업을 작업 스위치의 일부로 원래 작업에서 제거해야합니다.
이 마무리를 통해 이전 활동에 결과를 전달할 수 없으며 그렇게하려고하면 예외가 발생합니다.
나는 늦었다 고 생각하지만 간단하고 짧은 대답이 있습니다. Activity에는 finishAffinity () 메소드가 있으며 현재 활동과 모든 상위 활동을 완료하지만 Android 4.1 이상에서만 작동합니다.
API 16+의 경우
finishAffinity();
16 세 미만인 경우
ActivityCompat.finishAffinity(YourActivity.this);
그것이 도움이되기를 바랍니다!
참고로, 알아두면 좋을 것입니다.
이 답변은 효과가 있습니다 ( https://stackoverflow.com/a/13468685/7034327 )
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
this.finish();
반면 이것은 작동하지 않습니다
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
.setFlags()
이전 플래그를 교체하고 새 플래그를 추가하지 않습니다 .addFlags()
.
그래서 이것은 또한 작동합니다
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
응용 프로그램에 최소 SDK 버전 16이있는 경우 finishAffinity ()를 사용할 수 있습니다
현재 작업에서 동일한 선호도를 가진 바로 아래의 모든 활동뿐만 아니라이 활동을 완료하십시오.
상단 결제 화면에서 모든 백 스택 액티비티를 제거합니다.
@Override
public void onBackPressed() {
finishAffinity();
startActivity(new Intent(PaymentDoneActivity.this,Home.class));
}
http://developer.android.com/reference/android/app/Activity.html#finishAffinity%28%29
내가 이것을 위해 구현 한 솔루션 (어딘가에서 스택 오버플로에서 찾았다 고 생각하지만 기억이 나지 않습니다. 처음에 누가 그것을했는지 덕분에)
모든 활동에서 다음을 수행하십시오.
// Clear your session, remove preferences, etc.
Intent intent = new Intent(getBaseContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
그런 다음 LoginActivity에서 onKeyDown을 덮어 씁니다.
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
moveTaskToBack(true);
return true;
}
return super.onKeyDown(keyCode, event);
}
앱의 마지막 화면에있는 로그 아웃 버튼의 경우 로그 아웃 버튼 리스너에서이 코드를 사용하여 열려있는 모든 이전 활동을 완료하면 문제가 해결됩니다.
{
Intent intent = new Intent(this, loginScreen.class);
ntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
Intent i1=new Intent(getApplicationContext(),StartUp_Page.class);
i1.setAction(Intent.ACTION_MAIN);
i1.addCategory(Intent.CATEGORY_HOME);
i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
i1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i1);
finish();
나는 당신이 사용할 수있는 동일한 문제가 있습니다 IntentCompat
.
import android.support.v4.content.IntentCompat;
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
이 코드는 저에게 효과적입니다.
안드로이드 API 17
finish()
그냥 사용하는 대신finishAffinity();
로그인-> 홈-> 화면 1-> 화면 2-> 화면 3-> 화면 4-> 화면 5
화면 4 (또는 기타)->
StartActivity (로그인)와
FLAG_ACTIVITY_CLEAR_TOP
API> = 15 ~ API 23 간단한 솔루션.
Intent nextScreen = new Intent(currentActivity.this, MainActivity.class);
nextScreen.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(nextScreen);
ActivityCompat.finishAffinity(currentActivity.this);
내 경우에는 finishAffinity()
다음과 같은 마지막 활동에서 함수를 사용 합니다.
finishAffinity()
startHomeActivity()
도움이 되길 바랍니다.
startActivityForResult()
이전 액티비티에서 사용하는 경우 모든 액티비티에서 내부 메소드를 재정의 OnActivityResult()
하고 호출하십시오 finish();
. 이렇게하면 작업이 수행됩니다.
사용자가 로그 아웃 버튼을 클릭하면 다음 코드를 작성하십시오.
Intent intent = new Intent(this, LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
또한 로그인 후 새로운 활동을 호출하면 finish ()를 사용하지 마십시오.
단순히 로그인 화면을 종료 할 때가 아니라 로그인 화면에서 나올 때입니다.
그런 다음 모든 앞으로의 활동에서 이것을 로그 아웃에 사용하십시오.
final Intent intent = new Intent(getBaseContext(), LoginScreen.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(intent);
완벽하게 작동합니다.
사용자를 로그인하고 screen 1
거기에서 다른 화면으로 이동하면
Intent intent = new Intent(this, Screen1.class);
intent.addFlags(FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
이 방법을 찾았습니다. 모든 기록을 지우고 종료합니다.
Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startMain);
Intent intent = new Intent(getApplicationContext(), SplashScreen.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();
System.exit(0);
이 솔루션은 API 수준에도 불구하고 모든 장치에서 작동하는 것으로 나타났습니다 (<11 인 경우에도)
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);
참고 URL : https://stackoverflow.com/questions/6330260/finish-all-previous-activities
'Programming' 카테고리의 다른 글
자바 스크립트-문자열에서 모든 쉼표를 교체합니다 (0) | 2020.03.02 |
---|---|
ListBox ItemTemplate을 가져와 ListBox의 전체 너비를 가로로 늘리는 방법은 무엇입니까? (0) | 2020.03.02 |
왜 포인터를 사용합니까? (0) | 2020.03.02 |
mysqli 또는 PDO-장단점은 무엇입니까? (0) | 2020.03.02 |
time.sleep — 스레드 또는 프로세스를 잠급니다? (0) | 2020.03.02 |