web-dev-qa-db-ja.com

アプリケーションを閉じて、最近のアプリから削除/

私はこの質問がよくあることを知っており、Stack Overflowで何度も尋ねましたが、ほぼ4ページの検索エンジンの結果とこの問題に関する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

そして、マニフェストに以下のコードを追加するすべての回答で私が見る1つの一般的な提案:

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

これは、アプリの実行中にユーザーがホームボタンを押したときに追加すると、最近のアプリリストにアプリが表示されなくなるためです。

これに関する他の多くの提案がありますが、いずれもタスクを閉じてアプリケーションを閉じたり、最近のアプリリストからアプリケーションをクリアしたりしません。また、Settings>Apps>yourApp>your Applicationまだ「強制停止」を要求するのは、アプリケーションが実行されていることを意味します!

52
Hamad

上記のゲストのソリューションと、下記の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"を宣言する代わりに機能します。これは、アプリがプログラムによってアプリを終了するまで、最近のリストでアプリをユーザーに表示できるようにするためです。

79
Luke

この試みを提示する前に、アプリケーション情報の「強制停止」の可用性に対処できないことを明確にしたいと思います。 Androidプロセスを実行していない場合でも、アプリケーションを強制停止できます。強制停止は、パッケージを特定の停止状態にし、ブロードキャストイベントを受信できません。

さて、これについての私の安っぽいアイデアで、それは邪魔ではありません。その要点は、終了したいタスクを、システムが最近のアプリリストから除外するタスクに置き換えることです。

  1. すぐに終了するアクティビティを定義します(私はExiterと呼びます)。
    • finish()onCreate(Bundle)を呼び出します。
    • 質問から、OPもSystem.exit(int)も呼び出したいようです。しかし、この答えを読んでいる他の人にとっては、通常、プロセスを強制終了する必要はありません。
    • _Android:theme="@Android:style/Theme.NoDisplay"_を使用して、これが一連の冗長な遷移を引き起こさないようにします。
  2. 終了するタスクでExiterが実行されるように、_Android:taskAffinity_を設定します。または、しないでください:デフォルトでは、未指定のtaskAffinityは、すべてのアクティビティが共通の匿名taskAffinityを共有するようにします。
  3. 終了する場合は、startActivity(Intent)を使用して、次のフラグでExiterを開始します。
    • _Intent.FLAG_ACTIVITY_NEW_TASK_-同じタスクでアクティビティを開始したい場合でも、他のフラグにはこのフラグが必要です。幸いなことに、taskAffinityはシステムが実際に新しいタスクを開始するのを防ぎます。
    • _Intent.FLAG_ACTIVITY_CLEAR_TASK_-これにより、タスクのすべてのアクティビティが終了します。 Exiterだけで、どこでもfinish()を呼び出す必要はありません。
    • _Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS_-タスクは最近のアプリのリストに含まれません。終了するタスクと同じタスクであるため、このフラグはリストからタスクを削除します。

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

19
guest

これをアクティビティに追加します。

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

finishAndRemoveTask()

アクティビティが完了し、閉じる必要がある場合にこれを呼び出し、タスクのルートアクティビティを完了するためにタスクを完全に削除する必要があります。

8
Benny

finishAndRemoveTask();は、タスクバーからアプリを削除するために働きました。アプリを閉じた後。

7
Mahesh Kartan

Kotlinのソリューション。

ExitHelper.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"
/>

次に、アクティビティの通常の方法として使用します。

override fun boo() {
    foo()
    finishAndRemoveTaskCompat()
}
1
Alexandr