Android 延遲任務及取消

需求場景:
應用在進入后臺后過一段時間要自動退出應用冈爹。

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

這樣子就解決了進入后臺過一段時間自動退出應用這個功能了蜘醋。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末胁塞,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子压语,更是在濱河造成了極大的恐慌啸罢,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胎食,死亡現(xiàn)場離奇詭異扰才,居然都是意外死亡,警方通過查閱死者的電腦和手機厕怜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門衩匣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人粥航,你說我怎么就攤上這事琅捏。” “怎么了递雀?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵柄延,是天一觀的道長。 經(jīng)常有香客問我缀程,道長搜吧,這世上最難降的妖魔是什么市俊? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮滤奈,結(jié)果婚禮上摆昧,老公的妹妹穿的比我還像新娘。我一直安慰自己蜒程,他們只是感情好绅你,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著搞糕,像睡著了一般勇吊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上窍仰,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天汉规,我揣著相機與錄音,去河邊找鬼驹吮。 笑死针史,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的碟狞。 我是一名探鬼主播啄枕,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼族沃!你這毒婦竟也來了频祝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤脆淹,失蹤者是張志新(化名)和其女友劉穎常空,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盖溺,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡漓糙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了烘嘱。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昆禽。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蝇庭,靈堂內(nèi)的尸體忽然破棺而出醉鳖,到底是詐尸還是另有隱情,我是刑警寧澤哮内,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布盗棵,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏漾根。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一鲫竞、第九天 我趴在偏房一處隱蔽的房頂上張望辐怕。 院中可真熱鬧,春花似錦从绘、人聲如沸寄疏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽陕截。三九已至,卻和暖如春批什,著一層夾襖步出監(jiān)牢的瞬間农曲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工驻债, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留乳规,地道東北人。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓合呐,卻偏偏與公主長得像暮的,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子淌实,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359