美文网首页
Android 延迟任务及取消

Android 延迟任务及取消

作者: 捡贝壳的小男孩_839c | 来源:发表于2018-11-28 18:23 被阅读37次

    需求场景:
    应用在进入后台后过一段时间要自动退出应用。

    使用 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);
            }
        }
    }
    

    这样子就解决了进入后台过一段时间自动退出应用这个功能了。

    相关文章

      网友评论

          本文标题:Android 延迟任务及取消

          本文链接:https://www.haomeiwen.com/subject/dkszqqtx.html