需求場景:
應用在進入后臺后過一段時間要自動退出應用冈爹。
使用 Application.ActivityLifecycleCallbacks 這個類來判斷當前應用是否進入后臺,自定義一個類结胀,用一個成員變量去進行計算剥汤,在 onStart() 的時候,該變量 +1恤磷,在 onStop() 的時候河胎,該變量 -1。當應用處于前臺的時候避诽,該變量總是大于 0 的。進入后臺就小或等于 0职祷。
然后關(guān)于過一段時間退出應用部分氏涩,一段代碼就能解決,加在一起就行了有梆。
public class MyApplicationLifecycleCallback implements Application.ActivityLifecycleCallbacks {
private int i = 0;
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
@Override
public void onActivityStarted(final Activity activity) {
i++;
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(final Activity activity) {
i--;
if (i < 1) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
System.exit(0);
}
}, 60 * 1000);
}
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
}
但是這樣子是尖,只要進入后臺后,就直接執(zhí)行延遲退出泥耀,當用戶再打開應用饺汹,然后看著應用莫名退出,應該是一臉懵逼的痰催。
所以要加上一個可以撤銷的線程兜辞。想到了可以使用 application 的 Looper 來取消該進程。
在 application 中聲明一個 handler夸溶,通過這個 handler 與 looper 交互逸吵。
public class MyApplication extends Application {
private static MyApplication instance;
public Handler mainHandler;
public Handler getMainHandler(){
return mainHandler;
}
public static MyApplication getInstance() {
return instance;
}
@Override
public void onCreate() {
super.onCreate();
instance = this;
mainHandler = new Handler(Looper.getMainLooper());
registerActivityLifecycleCallbacks(new MyApplicationLifecycleCallback());
}
}
然后在 Application.ActivityLifecycleCallbacks 中使用該 handler
public class MyApplicationLifecycleCallback implements Application.ActivityLifecycleCallbacks {
private int i = 0;
private Runnable myRunnable;
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
@Override
public void onActivityStarted(final Activity activity) {
i++;
// 每次進入前臺的時候,取消后臺存在的退出子線程
removeBackground();
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(final Activity activity) {
i--;
if (i < 1) {
// 執(zhí)行五分鐘后退出應用的進程
runBackground(new Runnable() {
@Override
public void run() {
System.exit(0);
}
}, 60 * 5 * 1000);
}
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
/**
* 添加后臺執(zhí)行進程
*
* @param runnable 執(zhí)行的進程
* @param t 延遲的時間
*/
public void runBackground(Runnable runnable, long t) {
MyApplication.getInstance().getMainHandler().postDelayed(runnable, t);
if (myRunnable != null) {
MyApplication.getInstance().getMainHandler().removeCallbacks(myRunnable);
}
myRunnable = runnable;
}
/**
* 取消后臺進程
*/
private void removeBackground() {
if (myRunnable != null) {
MyApplication.getInstance().getMainHandler().removeCallbacks(myRunnable);
}
}
}
這樣子就解決了進入后臺過一段時間自動退出應用這個功能了蜘醋。