전체 기록 스택을 지우고 Android에서 새 작업 시작
스택에서 활동을 시작하여 전체 기록을 삭제할 수 있습니까?
상황
저는 A->B->C 또는 B->C(화면 A가 사용자 토큰을 선택하지만 많은 사용자가 단일 토큰만 가지고 있음)로 이어지는 활동 스택을 가지고 있습니다.
화면 C에서 사용자는 화면 B를 비활성화하는 작업을 수행할 수 있으므로, 애플리케이션은 이미 스택에 있는지 여부에 관계없이 화면 A로 가져가려고 합니다.그러면 A 화면이 내 애플리케이션의 스택에 있는 유일한 항목이 될 것입니다.
메모들
그 밖에도 비슷한 질문들이 많지만, 저는 이 정확한 질문에 대한 답을 찾지 못했습니다.전화해봤습니다getParent().finish()
이로 인해 항상 null 포인터 예외가 발생합니다.FLAG_ACTIVITY_CLEAR_TOP
활동이 이미 스택에 있는 경우에만 작동합니다.
API 레벨 11에서는 이를 위해 새로운 Intent Flag가 추가되었습니다.의도.플래그_활동_클리어_태스크
명확하게 하기 위해, 다음을 사용합니다.
자바
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
코틀린
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
API lvl <= 10의 경우 안타깝게도 아직 이에 대한 깨끗한 해결책을 찾지 못했습니다."DontHack Android Like This" 솔루션은 정말 순수한 해킹입니다.그런 짓을 해서는 안 된다.:)
편집: @Ben Pearson의 의견에 따르면 API <=10의 경우 IntentCompat 클래스를 동일하게 사용할 수 있습니다.사용할 수 있음IntentCompat.FLAG_ACTIVITY_CLEAR_TASK
작업을 지우기 위해 플래그를 지정합니다.따라서 pre API 레벨 11도 지원할 수 있습니다.
사례 1: 활동 A와 B 두 가지만:
여기서 활동 흐름은 A->B입니다.B에서 뒤로 버튼을 클릭하면 애플리케이션을 닫고 A에서 B 활동을 시작해야 합니다(통화 완료). 이렇게 하면 Android가 A 활동이 애플리케이션의 로딩/플래시 화면에서 Backstack.eg 에 저장되는 것을 방지할 수 있습니다.
Intent newIntent = new Intent(A.this, B.class);
startActivity(newIntent);
finish();
사례 2: 두 개 이상의 활동:
A->B->C->D->B와 같은 흐름이 있고 활동 D에서 오는 동안 활동 B의 뒤로 버튼을 클릭합니다.그런 경우에는 우리가 사용해야 합니다.
Intent newIntent = new Intent(D.this,B.class);
newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(newIntent);
여기서 활동 B는 의도로 인해 새 인스턴스가 아닌 백스택에서 시작됩니다.FLAG_ACTIVE_CLEAR_TOP 및 의도.FLAG_ACTIVE_NEW_TASK는 스택을 지우고 최상위 스택으로 만듭니다.그래서 뒤로 버튼을 누르면 전체 애플리케이션이 종료됩니다.
Android의 최신 버전 >= API 16 사용finishAffinity()
접근 방식은 >= API 16에 적합합니다.
Intent mIntent = new Intent(mContext,MainActivity.class);
finishAffinity();
startActivity(mIntent);
- 새 활동을 시작하고 모든 스택을 삭제하는 것과 같습니다.
- 또는 주 활동/첫 번째 활동으로 재시작합니다.
저도 이 일에 몇 시간을 들였습니다... 그리고 FLAG_ACTIVE_CLEAR_에 동의합니다.TOP은 원하는 것처럼 들립니다. 실행 중인 활동을 제외한 전체 스택을 지우고, Back(뒤로) 버튼을 누르면 응용 프로그램이 종료됩니다.하지만 Mike Repass가 언급했듯이 FLAG_ACTIVE_CLEAR_TOP은 실행 중인 활동이 이미 스택에 있을 때만 작동합니다. 활동이 없을 때는 플래그가 아무 것도 하지 않습니다.
무엇을 해야 하나?시작 중인 활동을 FLAG_ACTIVE_NEW_TASK와 함께 스택에 넣습니다. 그러면 해당 활동이 기록 스택의 새 작업을 시작합니다.그런 다음 FLAG_ACTIVE_CLEAR_TOP 플래그를 추가합니다.
이제 FLAG_ACTIVE_CLEAR_TOP이 스택에서 새 활동을 찾으로 이동하면 다른 모든 활동이 삭제되기 전에 해당 활동이 풀업됩니다.
로그아웃 기능은 다음과 같습니다. 보기 매개 변수는 이 기능이 연결된 버튼입니다.
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();
}
활동을 에, 활을시직후한작사, 용새동을 사용합니다.startActivity
꼭전요세에 전화하세요.finish()
현재 활동이 새 활동 뒤에 쌓이지 않도록 합니다.
스택을 변경하면 안 됩니다.Android 뒤로 버튼은 웹 브라우저에서와 같이 작동해야 합니다.
방법을 생각해 낼 수는 있지만, 꽤나 어려운 일입니다.
만들기
singleTask
에추으써로에 으로써.AndroidManifest
예:<activity android:name=".activities.A" android:label="@string/A_title" android:launchMode="singleTask"/> <activity android:name=".activities.B" android:label="@string/B_title" android:launchMode="singleTask"/>
확다하
Application
어디로 가야 할지에 대한 논리를 고수할 것입니다.
예:
public class DontHackAndroidLikeThis extends Application {
private Stack<Activity> classes = new Stack<Activity>();
public Activity getBackActivity() {
return classes.pop();
}
public void addBackActivity(Activity activity) {
classes.push(activity);
}
}
A에서 B까지:
DontHackAndroidLikeThis app = (DontHackAndroidLikeThis) getApplication();
app.addBackActivity(A.class);
startActivity(this, B.class);
B에서 C까지:
DontHackAndroidLikeThis app = (DontHackAndroidLikeThis) getApplication();
app.addBackActivity(B.class);
startActivity(this, C.class);
C에서:
If ( shouldNotGoBackToB() ) {
DontHackAndroidLikeThis app = (DontHackAndroidLikeThis) getApplication();
app.pop();
}
그리고 뒤로 버튼을 조작합니다.pop()
스택에서.
다시 한 번 말하지만, 당신은 이것을 해서는 안 됩니다 :)
재사용 가능한 고급 코틀린:
세터 방법을 사용하여 플래그를 직접 설정할 수 있습니다.or
는 자바 비트위스를 대체하는 것입니까?|
.
intent.flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK
이 기능을 정기적으로 사용하려면 Intent 확장 기능을 만듭니다.
fun Intent.clearStack() {
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
그런 다음 의도를 시작하기 전에 이 함수를 직접 호출할 수 있습니다.
intent.clearStack()
다른 상황에서 플래그를 추가하는 옵션이 필요한 경우 확장 기능에 선택적 매개 변수를 추가합니다.
fun Intent.clearStack(additionalFlags: Int = 0) {
flags = additionalFlags or Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
아래 코드를 사용해 보십시오.
Intent intent = new Intent(ManageProfileActivity.this, LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|
Intent.FLAG_ACTIVITY_CLEAR_TASK|
Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
사용해 보십시오.
Intent logout_intent = new Intent(DashboardActivity.this, LoginActivity.class);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(logout_intent);
finish();
나에게는 위의 어떤 방법도 통하지 않습니다.
이전의 모든 활동을 지우려면 다음과 같이 하십시오.
finishAffinity() // if you are in fragment use activity.finishAffinity()
Intent intent = new Intent(this, DestActivity.class); // with all flags you want
startActivity(intent)
Intent i = new Intent(MainPoliticalLogin.this, MainActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i);
Java의 경우: -
startActivity(new Intent(getApplicationContext(),ChooseServiceActivity.class)
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK));
때때로 안드로이드 에뮬레이터가 eclipse DDMS 도구를 연결하지 못하고 수동으로 시작하도록 adb를 요청할 수 있습니다.이 경우 명령 프롬프트를 사용하여 adb를 시작하거나 중지할 수 있습니다.
나는 너무 간단한 해킹을 발견했습니다. 그냥 이 새로운 요소를 추가하세요.AndroidManifest
다음과 같이:-
<activity android:name=".activityName"
android:label="@string/app_name"
android:noHistory="true"/>
그자리의 android:noHistory
스택에서 원하지 않는 활동을 지웁니다.
언급URL : https://stackoverflow.com/questions/3473168/clear-the-entire-history-stack-and-start-a-new-activity-on-android
'programing' 카테고리의 다른 글
Oracle에서 구체화된 보기를 부분적으로 새로 고칠 수 있습니까? (0) | 2023.08.08 |
---|---|
ARC는 file -fno-objc-arc를 표시하더라도 구조체 또는 유니언에서 Objective-C 개체를 금지합니다. (0) | 2023.07.29 |
Ajax를 통해 Javascript Object를 PHP로 전송 (0) | 2023.07.29 |
Thymeleafth:reactJS의 텍스트 사용 방법 (0) | 2023.07.29 |
MySQL 데이터베이스에 아랍어로 데이터 저장 (0) | 2023.07.29 |