私はこの質問がよくあることを知っており、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
まだ「強制停止」を要求するのは、アプリケーションが実行されていることを意味します!
上記のゲストのソリューションと、下記の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プロセスを実行していない場合でも、アプリケーションを強制停止できます。強制停止は、パッケージを特定の停止状態にし、ブロードキャストイベントを受信できません。
さて、これについての私の安っぽいアイデアで、それは邪魔ではありません。その要点は、終了したいタスクを、システムが最近のアプリリストから除外するタスクに置き換えることです。
Exiter
と呼びます)。finish()
でonCreate(Bundle)
を呼び出します。System.exit(int)
も呼び出したいようです。しかし、この答えを読んでいる他の人にとっては、通常、プロセスを強制終了する必要はありません。Android:theme="@Android:style/Theme.NoDisplay"
_を使用して、これが一連の冗長な遷移を引き起こさないようにします。Exiter
が実行されるように、_Android:taskAffinity
_を設定します。または、しないでください:デフォルトでは、未指定のtaskAffinity
は、すべてのアクティビティが共通の匿名taskAffinity
を共有するようにします。startActivity(Intent)
を使用して、次のフラグでExiter
を開始します。Intent.FLAG_ACTIVITY_NEW_TASK
_-同じタスクでアクティビティを開始したい場合でも、他のフラグにはこのフラグが必要です。幸いなことに、taskAffinity
はシステムが実際に新しいタスクを開始するのを防ぎます。Intent.FLAG_ACTIVITY_CLEAR_TASK
_-これにより、タスクのすべてのアクティビティが終了します。 Exiter
だけで、どこでもfinish()
を呼び出す必要はありません。Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
_-タスクは最近のアプリのリストに含まれません。終了するタスクと同じタスクであるため、このフラグはリストからタスクを削除します。これをアクティビティに追加します。
@Override
public void finish() {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
super.finishAndRemoveTask();
}
else {
super.finish();
}
}
アクティビティが完了し、閉じる必要がある場合にこれを呼び出し、タスクのルートアクティビティを完了するためにタスクを完全に削除する必要があります。
finishAndRemoveTask();
は、タスクバーからアプリを削除するために働きました。アプリを閉じた後。
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()
}