需求场景:
应用在进入后台后过一段时间要自动退出应用。
使用 Application.ActivityLifecycleCallbacks 这个类来判断当前应用是否进入后台,自定义一个类,用一个成员变量去进行计算,在 onStart() 的时候,该变量 +1,在 onStop() 的时候,该变量 -1。当应用处于前台的时候,该变量总是大于 0 的。进入后台就小或等于 0。
然后关于过一段时间退出应用部分,一段代码就能解决,加在一起就行了。
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) {
}
}
但是这样子,只要进入后台后,就直接执行延迟退出,当用户再打开应用,然后看着应用莫名退出,应该是一脸懵逼的。
所以要加上一个可以撤销的线程。想到了可以使用 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) {
// 执行五分钟后退出应用的进程
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) {
}
/**
* 添加后台执行进程
*
* @param runnable 执行的进程
* @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);
}
}
}
这样子就解决了进入后台过一段时间自动退出应用这个功能了。