まず、このアプローチには最小API 16が必要です。
この問題をより広く解決するために、このソリューションを3つの部分に分割します。
1. アクティビティでアプリケーションを終了する場合は、次のコードスニペットを使用します。
if(Build.VERSION.SDK_INT>=16 && Build.VERSION.SDK_INT<21){
finishAffinity();
} else if(Build.VERSION.SDK_INT>=21){
finishAndRemoveTask();
}
2. アクティビティにアクセスできるアクティビティクラス以外のアプリケーションを終了する場合は、次のコードスニペットを使用します。
if(Build.VERSION.SDK_INT>=16 && Build.VERSION.SDK_INT<21){
getActivity().finishAffinity();
} else if(Build.VERSION.SDK_INT>=21){
getActivity().finishAndRemoveTask();
}
3.非Activityクラスのアプリケーションを終了し、ServiceなどのActivityにアクセスできない場合は、BroadcastReceiverを使用することをお勧めします。このアプローチをプロジェクトのすべてのアクティビティに追加できます。
LocalBroadcastManagerおよびBroadcastReceiverインスタンス変数を作成します。必要に応じて、getPackageName()+ "。closeapp"を置き換えることができます。
LocalBroadcastManager mLocalBroadcastManager;
BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals(getPackageName()+".closeapp")){
if(Build.VERSION.SDK_INT>=16 && Build.VERSION.SDK_INT<21){
finishAffinity();
} else if(Build.VERSION.SDK_INT>=21){
finishAndRemoveTask();
}
}
}
};
これらをActivityのonCreate()メソッドに追加します。
mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);
IntentFilter mIntentFilter = new IntentFilter();
mIntentFilter.addAction(getPackageName()+".closeapp");
mLocalBroadcastManager.registerReceiver(mBroadcastReceiver, mIntentFilter);
また、ActivityのonDestroy()メソッドでunregisterレシーバーを呼び出すことを忘れないでください
mLocalBroadcastManager.unregisterReceiver(mBroadcastReceiver);
アプリケーションを終了するには、Serviceを拡張するPlayServiceクラスで使用するLocalBroadcastManagerを使用してブロードキャストを送信する必要があります。
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(PlayService.this);
localBroadcastManager.sendBroadcast(new Intent(getPackageName() + ".closeapp"));