簡體   English   中英

關閉應用程序並從最近的應用程序中刪除/

[英]Close application and remove from recent apps/

我知道這個問題很常見,在 Stack Overflow 上被問過很多次,但是在訪問了將近四頁的搜索引擎結果和 Stack Overflow 上關於這個問題的近 20 個問題之后,我發現它們都沒有得到解決或正確回答。

我想要的是:

我想在運行時在最近的應用程序列表中顯示我的應用程序,但是當我關閉應用程序時,我的進程應該被終止,並且應用程序應該從最近的應用程序列表中刪除。

我找到的一些答案:

use System.exit(0); //doesn't clear app from recents
OR
use android.os.Process.killProcess(android.os.Process.myPid()); //doesn't clear app from recents
OR
use finish() or this.finish() or Activity.finish();// doesn't clear app from recents

我在每個答案中看到的一個常見建議是在清單中添加以下代碼:

android:excludeFromRecents //I think this is wrong approach.

因為在我的應用程序正在運行時用戶按下主頁按鈕添加此后,用戶無法在最近的應用程序列表中看到我的應用程序。

以及許多其他關於此的建議,但它們都沒有完成關閉應用程序和從最近的應用程序列表中清除應用程序的任務。 此外,如果您進入Settings>Apps>yourApp>your Application看到它仍然要求“強制停止”表示應用程序正在運行!

我的解決方案基於上面的客人,以及下面的 gilsaints88 評論(對於 Android L 兼容性):

將此活動添加到您的 AndroidManifest.xml 文件中:

<activity
    android:name="com.example.ExitActivity"
    android:theme="@android:style/Theme.NoDisplay"
    android:autoRemoveFromRecents="true"/>

然后創建一個類ExitActivity.java:

public class ExitActivity extends Activity
{
    @Override protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        if(android.os.Build.VERSION.SDK_INT >= 21)
        {
            finishAndRemoveTask();
        }
        else
        {
            finish();
        }
    }

    public static void exitApplication(Context context)
    {
        Intent intent = new Intent(context, ExitActivity.class);

        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);

        context.startActivity(intent);
    }
}

然后,每當您想強制關閉您的應用程序並將其從最近的列表中刪除時,請調用:

ExitActivity.exitApplication(context);

這個解決方案適用於我而不是聲明 android:excludeFromRecents="true" 因為我希望用戶能夠在最近列表中看到該應用程序,直到我的應用程序觸發以編程方式關閉該應用程序的點。

在我提出我的嘗試之前,我想明確說明以下內容不會解決應用程序信息中“強制停止”的可用性問題。 Android 允許您強制停止應用程序,即使它沒有任何進程正在運行。 強制停止將包置於特定的停止狀態,在該狀態下它無法接收廣播事件。

現在那已經不礙事了,繼續我對此的俗氣想法。 它的要點是將您要退出的任務替換為系統將從最近的應用程序列表中排除的任務。

  1. 定義一個立即結束的活動(我稱之為Exiter )。
    • onCreate(Bundle)調用finish() onCreate(Bundle)
    • 從這個問題來看,聽起來 OP 也想調用System.exit(int) 但是對於閱讀此答案的其他人,您通常不必終止該過程。
    • 使用android:theme="@android:style/Theme.NoDisplay"來防止這導致一堆多余的過渡。
  2. 設置android:taskAffinity以便Exiter將在您要退出的任務中運行。 或者不要:默認情況下,未指定的taskAffinity使所有活動共享一個公共匿名taskAffinity
  3. 當你想退出時,使用startActivity(Intent)以下列標志啟動Exiter
    • Intent.FLAG_ACTIVITY_NEW_TASK - 即使我們想在同一個任務中啟動活動,其他標志也需要這個標志。 幸運的是, taskAffinity將阻止系統實際啟動新任務。
    • Intent.FLAG_ACTIVITY_CLEAR_TASK - 這將完成任務的所有活動。 您不必到處都調用finish() ,只需在ExiterExiter
    • Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS - 該任務不會在最近的應用程序列表中。 由於它與正在退出的任務相同,因此此標志將從列表中刪除該任務。

https://gist.github.com/anonymous/9884978

finishAndRemoveTask(); 為我工作從任務欄中刪除了一個應用程序。 關閉應用程序后。

將此添加到您的活動:

@Override
public void finish() {
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        super.finishAndRemoveTask();
    }
    else {
        super.finish();
    }
}

完成AndRemoveTask()

當您的活動完成並且應該關閉並且任務應該作為完成任務的根活動的一部分被完全刪除時調用它。

Kotlin 的解決方案。

退出助手.kt

fun Activity.finishAndRemoveTaskCompat() {
    if (android.os.Build.VERSION.SDK_INT >= 21) {
        finishAndRemoveTask()
    } else {
        val intent = Intent(this, ExitAndRemoveFromRecentAppsDummyActivity::class.java)

        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or
                Intent.FLAG_ACTIVITY_CLEAR_TASK or
                Intent.FLAG_ACTIVITY_NO_ANIMATION or
                Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)

        startActivity(intent)
    }
}

class ExitAndRemoveFromRecentAppsDummyActivity : Activity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        finish()
    }
}

AndroidManifest.xml

<activity
     android:name=".ExitAndRemoveFromRecentAppsDummyActivity"
     android:theme="@android:style/Theme.NoDisplay"
/>

然后將其用作您的 Activity 中的常用方法:

override fun boo() {
    foo()
    finishAndRemoveTaskCompat()
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){finishAndRemoveTask();}

這對我從后台刪除應用程序很有用。 關閉申請后

暫無
暫無

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

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