簡(jiǎn)易APP實(shí)現(xiàn)Android定時(shí)關(guān)機(jī)

實(shí)現(xiàn)定時(shí)關(guān)機(jī)的方法之一(網(wǎng)上還有多種方法魄健,目前用的這個(gè)是自己實(shí)踐的)
主要是使用AlarmManager泉蝌,思路就是:利用AlarmManager在特定的時(shí)刻發(fā)送一個(gè)廣播,在程序中寫一個(gè)廣播接收器用于接收這個(gè)廣播打洼,一旦接收到該廣播蠢古,則執(zhí)行關(guān)機(jī)的命令。一句話就介紹完了欲主,但是個(gè)人覺(jué)得這個(gè)知識(shí)點(diǎn)還是蠻有用的邓厕,下面詳解這次用到的知識(shí)點(diǎn)及遇到的問(wèn)題

關(guān)于AlarmManager的官網(wǎng)文檔介紹

Note: The Alarm Manager is intended for cases where you want to have your application code run at a specific time, even if your application is not currently running. For normal timing operations (ticks, timeouts, etc) it is easier and much more efficient to use Handler.

上面說(shuō)的是:當(dāng)你想要在某個(gè)特定的時(shí)刻運(yùn)行你的程序代碼,可以使用AlarmManager扁瓢,即使當(dāng)前該程序并沒(méi)有運(yùn)行亦可详恼。對(duì)于平時(shí)那些用到定時(shí)的操作(如ticks, timeouts),AlarmManager比Handler使用起來(lái)各更簡(jiǎn)單引几、有效

該APP的截圖


Screenshot_20160811-230833.png

關(guān)于界面就不介紹了昧互。
主要實(shí)現(xiàn)大體是按照上面的思路來(lái)的
1.設(shè)置AlarmManager所需的參數(shù)

Intent intent = new Intent(getApplicationContext(), AlarmBroadcastReciver.class);    pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0,            intent, PendingIntent.FLAG_UPDATE_CURRENT);    
alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
}```

這里要說(shuō)一下關(guān)于AlarmManager的幾個(gè)重要方法!
[這篇文章介紹的比較詳細(xì)她紫,感謝作者](http://www.runoob.com/w3cnote/android-tutorial-alarmmanager.html)

`set(int type, long triggerAtMillis, PendingIntent operation)`
這個(gè)方法是本次使用到的方法之一硅堆,用于在特定時(shí)間傳遞一個(gè)廣播,但是只能單次提醒贿讹,它的參數(shù)說(shuō)明:
**第一個(gè)參數(shù)是指AlarmManager的類型**渐逃,有5個(gè)值可以選擇:`AlarmManager.ELAPSED_REALTIME` 鬧鐘在手機(jī)睡眠狀態(tài)下不可用,該狀態(tài)下鬧鐘使用相對(duì)時(shí)間(相對(duì)于系統(tǒng)啟動(dòng)開(kāi)始); `AlarmManager.ELAPSED_REALTIME_WAKEUP `鬧鐘在睡眠狀態(tài)下會(huì)喚醒系統(tǒng)并執(zhí)行提示功能民褂,該狀態(tài)下鬧鐘也使用相對(duì)時(shí)間茄菊; `AlarmManager.RTC `鬧鐘在睡眠狀態(tài)下不可用,該狀態(tài)下鬧鐘使用絕對(duì)時(shí)間(即當(dāng)前系統(tǒng)時(shí)間)赊堪;` AlarmManager.RTC_WAKEUP` 表示鬧鐘在睡眠狀態(tài)下會(huì)喚醒系統(tǒng)并執(zhí)行提示功能面殖,該狀態(tài)下鬧鐘使用絕對(duì)時(shí)間; `AlarmManager.POWER_OFF_WAKEUP `表示鬧鐘在手機(jī)關(guān)機(jī)狀態(tài)下也能正常進(jìn)行提示
**第二個(gè)參數(shù)是指開(kāi)啟提示的時(shí)間**
**第三個(gè)參數(shù)是綁定了需要執(zhí)行的操作**,比如這次采用的發(fā)送廣播哭廉,也可以彈出提示框等等

`setRepeating(int type, long triggerAtMillis, long intervalMillis, PendingIntent operation)`
這個(gè)方法和上一個(gè)類似脊僚,就是多了一個(gè)參數(shù)`long intervalMillis`,這個(gè)方法是可以重復(fù)執(zhí)行提醒功能,而多出的這個(gè)參數(shù)就是重復(fù)提醒之間的時(shí)間間隔

`cancel(PendingIntent operation)`
這個(gè)方法從名字就可以看出來(lái)遵绰,是用來(lái)取消提醒的

2.設(shè)置廣播接收器
  注意1中的這一行代碼 `Intent intent = new Intent(getApplicationContext(), AlarmBroadcastReciver.class); `  這行代碼就是利用Intent直接指定廣播接收器辽幌,這樣就不需要在清單文件中注冊(cè)具體的廣播標(biāo)簽,該廣播接收器接受到廣播時(shí)椿访,會(huì)直接執(zhí)行關(guān)機(jī)操作
```@Override
public void onReceive(Context context, Intent intent) {    Toast.makeText(context,"關(guān)機(jī)啦", Toast.LENGTH_SHORT).show();    try {        Process process = Runtime.getRuntime().exec("su");        DataOutputStream out = new DataOutputStream(                process.getOutputStream());        out.writeBytes("reboot -p\n");        out.writeBytes("exit\n");        out.flush();    } catch (IOException e) {        e.printStackTrace();    }```

3.設(shè)置按鈕監(jiān)聽(tīng)器乌企,根據(jù)點(diǎn)擊的按鈕開(kāi)啟循環(huán)提醒還是單次提醒,同時(shí)顯示出當(dāng)前設(shè)定的數(shù)據(jù)
4.重寫onStop()方法成玫,在方法中使用ShardPreference用于保存設(shè)定的數(shù)據(jù)加酵,在進(jìn)入程序時(shí)讀取保存的數(shù)據(jù)拳喻,并顯示出來(lái),以方便知道之前設(shè)定的數(shù)據(jù)

遇到的問(wèn)題:本來(lái)是覆寫的onDestroy()方法猪腕,想的是在程序銷毀時(shí)保存數(shù)據(jù)冗澈,結(jié)果總是沒(méi)保存下來(lái),之前也用過(guò)ShardPreference在onDestroy()方法中保存數(shù)據(jù)码撰,是可以的渗柿。最后經(jīng)過(guò)多次測(cè)試,又看了一下Activity的生命周期圖才發(fā)現(xiàn)問(wèn)題所在脖岛,下面結(jié)合官網(wǎng)給出的生命圖來(lái)說(shuō)明

![activity_lifecycle.png](http://upload-images.jianshu.io/upload_images/2234797-ab5649666d06b5a0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

當(dāng)程序進(jìn)入到后臺(tái)時(shí)就由運(yùn)行態(tài)轉(zhuǎn)換到onPause()態(tài)朵栖,當(dāng)不再對(duì)用戶可見(jiàn)時(shí),就會(huì)進(jìn)入到onStop()態(tài)柴梆,當(dāng)程序被finifsh掉后陨溅,會(huì)進(jìn)入onDestroy()進(jìn)而被消滅,這種正常退出的情況下在onDestroy()中保存數(shù)據(jù)當(dāng)然是可以的绍在。但是考慮到圖中的另一條路線门扇,由onStop()直接轉(zhuǎn)到死亡狀態(tài),這種情況就屬于非正常情況退出了偿渡,比如正在運(yùn)行時(shí)突然被什么清理軟件給徹底殺掉了臼寄,那么這個(gè)時(shí)候是不會(huì)到onDestroy()這一步,所以此時(shí)在這個(gè)方法中保存數(shù)據(jù)就會(huì)失敗溜宽,因此面對(duì)這種情況可以考慮覆寫onStop()方法進(jìn)行保存數(shù)據(jù)吉拳,然后在onCreate()中即活動(dòng)剛創(chuàng)建時(shí)獲取即可

按照習(xí)慣,總是以一個(gè)小APP的形式熟悉這些知識(shí)點(diǎn)适揉,全代碼還有之前的涉及到其他知識(shí)點(diǎn)的小APP的代碼留攒,都放在[GitHub](https://github.com/huangkunkun/),有些地方可能說(shuō)的不是很到位,希望各位大神留言指正

一些bug的更改及遺漏問(wèn)題放在[Android定時(shí)關(guān)機(jī)問(wèn)題解決](http://www.reibang.com/p/da37562f1111)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嫉嘀,一起剝皮案震驚了整個(gè)濱河市炼邀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌剪侮,老刑警劉巖拭宁,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異瓣俯,居然都是意外死亡红淡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門降铸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人摇零,你說(shuō)我怎么就攤上這事推掸。” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵谅畅,是天一觀的道長(zhǎng)登渣。 經(jīng)常有香客問(wèn)我,道長(zhǎng)毡泻,這世上最難降的妖魔是什么胜茧? 我笑而不...
    開(kāi)封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮仇味,結(jié)果婚禮上呻顽,老公的妹妹穿的比我還像新娘。我一直安慰自己丹墨,他們只是感情好廊遍,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著贩挣,像睡著了一般喉前。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上王财,一...
    開(kāi)封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天卵迂,我揣著相機(jī)與錄音,去河邊找鬼绒净。 笑死见咒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的疯溺。 我是一名探鬼主播论颅,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼囱嫩!你這毒婦竟也來(lái)了恃疯?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤墨闲,失蹤者是張志新(化名)和其女友劉穎今妄,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體鸳碧,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盾鳞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瞻离。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腾仅。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖套利,靈堂內(nèi)的尸體忽然破棺而出推励,到底是詐尸還是另有隱情鹤耍,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布验辞,位于F島的核電站稿黄,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏跌造。R本人自食惡果不足惜杆怕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望壳贪。 院中可真熱鬧陵珍,春花似錦、人聲如沸撑碴。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)醉拓。三九已至伟姐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間亿卤,已是汗流浹背愤兵。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留排吴,地道東北人秆乳。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像钻哩,于是被迫代替她去往敵國(guó)和親屹堰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容