簡體   English   中英

完成所有之前的活動

[英]Finish all previous activities

我的應用程序具有以下流程屏幕:

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來實現這一點。 我也在go通過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 的所有屏幕。 我發布的代碼將使您返回主屏幕,完成所有其他活動。 您可以在意圖中添加額外內容並在主屏幕活動中閱讀並完成它(也許從那里再次啟動登錄屏幕或其他東西)。

我不確定,但您也可以嘗試使用此標志登錄。 我不知道在這種情況下如何安排活動。 所以不知道它是否會清除您正在使用的屏幕下方的內容,包括您當前正在使用的內容,但它絕對是通往 go 的方式。

希望這可以幫助。

您可以嘗試Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK 它將完全清除所有以前的活動並開始新的活動。

在啟動新 Activity 之前,只需添加以下代碼:

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之外的所有活動。 然后將以下代碼放入LoginActivityonCreate(...)中,以偵聽何時重新創建LoginActivity並傳遞了“EXIT”信號:

if (getIntent().getBooleanExtra("EXIT", false)) {
    finish();  
}

為什么在 Android 中制作退出按鈕這么難?

Android 極力勸阻您不要在應用程序中使用“退出”按鈕,因為他們希望用戶永遠不會關心他們使用的程序是否在后台運行。

Android 操作系統開發人員希望您的程序能夠在手機意外關機和斷電的情況下幸存下來,並且當用戶重新啟動程序時,他們會從上次中斷的地方繼續。 因此,用戶可以在使用您的應用程序時接聽電話,並打開需要釋放您的應用程序以獲取更多資源的地圖。

當用戶恢復您的應用程序時,他們會從上次中斷的地方繼續,不會中斷。 這個退出按鈕正在篡奪活動管理器的權力,可能會導致自動管理的 android 程序生命周期出現問題。

Intent intent = new Intent(this, classObject);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

這適用於所有 Android 版本。 其中IntentCompat將 class 添加到 Android 支持庫中。

使用以下活動

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

刪除 CLEAR_TASK 標志以供片段使用。

我希望這可能對某些人有用。

我想我遲到了,但有一個簡單而簡短的答案。 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()替換任何以前的標志,並且不會 append 任何新標志,而.addFlags()會。

所以這也可以

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

來自開發人員.android.com

 public void finishAffinity ()

在 API 級別 16 中添加

在當前任務中完成此活動以及緊接其下的所有具有相同親和力的活動。 這通常在應用程序可以啟動到另一個任務時使用(例如從它理解的內容類型的 ACTION_VIEW)並且用戶已經使用向上導航切換出當前任務並進入它自己的任務。 在這種情況下,如果用戶向下導航到第二個應用程序的任何其他活動,則所有這些活動都應作為任務切換的一部分從原始任務中刪除。

請注意,此完成不允許您將結果傳遞給先前的活動,如果您嘗試這樣做,則會引發異常。

如果您的應用程序具有最低 sdk 版本 16,那么您可以使用finishAffinity()

在當前任務中完成此活動以及緊接其下的所有具有相同親和力的活動。

這對我有用 在 Top Payment 屏幕中刪除所有后台活動,

@Override
public void onBackPressed() {
         finishAffinity();
        startActivity(new Intent(PaymentDoneActivity.this,Home.class));
    } 

http://developer.android.com/reference/android/app/Activity.html#finishAffinity%28%29

對於應用程序最后一個屏幕上的注銷按鈕,在注銷按鈕偵聽器上使用此代碼來完成所有打開的先前活動,您的問題就解決了。

{
Intent intent = new Intent(this, loginScreen.class);
ntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}

就我而言,我在最后一個活動中使用finishAffinity() function,例如:

finishAffinity()
startHomeActivity()

希望它會有用。

我為此實施了一個解決方案(我想我在某個地方的 Stack Overflow 上找到了它,但我不記得了,所以感謝首先這樣做的人):

從您的任何活動中執行以下操作:

// 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);
}

我有同樣的問題,你可以使用IntentCompat ,像這樣:

import android.support.v4.content.IntentCompat;
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);

這段代碼對我有用。

Android api 17

    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();

而不是使用finish() ,只需使用finishAffinity();

對於 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);

登錄->首頁->屏幕1->屏幕2->屏幕3->屏幕4->屏幕5

在屏幕 4(或任何其他)->

StartActivity(Log in)
 FLAG_ACTIVITY_CLEAR_TOP

如果您在之前的活動中使用startActivityForResult() ,只需覆蓋OnActivityResult()並調用finish(); 在所有活動中使用它里面的方法..這將完成這項工作......

我想我遲到了,但有一個簡單而簡短的答案。 Activity 中有一個finishAffinity() 方法可以完成當前活動和所有父活動,但它只在Android 4.1 或更高版本中有效。

對於 API 16+,使用

完成親和力();

對於 16 歲以下,使用

ActivityCompat.finishAffinity(YourActivity.this);

希望能幫助到你!

shareedit 於 2018 年 5 月 27 日 8:03 回答

阿克謝·塔魯

當用戶單擊注銷按鈕時,請編寫以下代碼:

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

並且在登錄后,如果您調用新活動,請不要使用 finish();

簡單地說,當您從登錄屏幕 go 時,而不是在完成登錄屏幕時。

然后在所有轉發活動中,使用它來注銷:

final Intent intent = new Intent(getBaseContext(), LoginScreen.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.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);

如果您在screen 1中登錄用戶並從那里 go 到其他屏幕,請使用

Intent intent = new Intent(this, Screen1.class);
intent.addFlags(FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

盡管 API 級別(即使 < 11),我發現此解決方案適用於所有設備

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);

關閉所有先前活動並清除 memory 的最佳方法

finishAffinity()
System.exit(0);

我已經嘗試了我的標志,但仍然沒有工作。 我有一個設計非常相似的應用程序,並且在邏輯方面我有一個可能的解決方案。 我已經使用共享首選項構建了我的登錄和注銷。

如果我注銷,我的共享首選項中的數據將被銷毀/刪除。

從我的任何活動(例如 Home.java)中,我檢查共享首選項是否有數據,在這種情況下它不會,因為我在從其中一個屏幕注銷時將其銷毀。 因此,邏輯會破壞/完成該活動並將我帶回登錄活動。 您可以在所有其他活動中復制此邏輯。

但是請記住在 onPostResume() 中執行此檢查,因為這是當您 go 回到 Home.java 時調用的

下面的代碼示例:

@Override
protected void onPostResume() {
    SharedPreferences pref = this.getSharedPreferences("user_details", Context.MODE_PRIVATE);
    if (pref.getAll().isEmpty()){
        //Shared Preferences has no data.
        //The data has been deleted
        Intent intent = new Intent(getApplicationContext(), Login.class);
        startActivity(intent);
        finish();
        //Finish destroys that activity which in our case is the Home.java
    }


    super.onPostResume();
}

Kotlin這樣:

在另一個活動(有一些類)中,在Imports

var activity:Activity?=null
    get() = field
    set(value) {
        field = value
    }

然后,在onCreate

activity=this

現在在 MainActivity 中:

activity?.finish()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM