简易APP实现Android定时关机

实现定时关机的方法之一(网上还有多种方法,目前用的这个是自己实践的)
主要是使用AlarmManager,思路就是:利用AlarmManager在特定的时刻发送一个广播,在程序中写一个广播接收器用于接收这个广播,一旦接收到该广播,则执行关机的命令。一句话就介绍完了,但是个人觉得这个知识点还是蛮有用的,下面详解这次用到的知识点及遇到的问题

关于AlarmManager的官网文档介绍

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.

上面说的是:当你想要在某个特定的时刻运行你的程序代码,可以使用AlarmManager,即使当前该程序并没有运行亦可。对于平时那些用到定时的操作(如ticks, timeouts),AlarmManager比Handler使用起来各更简单、有效

该APP的截图


Screenshot_20160811-230833.png

关于界面就不介绍了。
主要实现大体是按照上面的思路来的
1.设置AlarmManager所需的参数

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

这里要说一下关于AlarmManager的几个重要方法!
[这篇文章介绍的比较详细,感谢作者](http://www.runoob.com/w3cnote/android-tutorial-alarmmanager.html)

`set(int type, long triggerAtMillis, PendingIntent operation)`
这个方法是本次使用到的方法之一,用于在特定时间传递一个广播,但是只能单次提醒,它的参数说明:
**第一个参数是指AlarmManager的类型**,有5个值可以选择:`AlarmManager.ELAPSED_REALTIME` 闹钟在手机睡眠状态下不可用,该状态下闹钟使用相对时间(相对于系统启动开始); `AlarmManager.ELAPSED_REALTIME_WAKEUP `闹钟在睡眠状态下会唤醒系统并执行提示功能,该状态下闹钟也使用相对时间; `AlarmManager.RTC `闹钟在睡眠状态下不可用,该状态下闹钟使用绝对时间(即当前系统时间);` AlarmManager.RTC_WAKEUP` 表示闹钟在睡眠状态下会唤醒系统并执行提示功能,该状态下闹钟使用绝对时间; `AlarmManager.POWER_OFF_WAKEUP `表示闹钟在手机关机状态下也能正常进行提示
**第二个参数是指开启提示的时间**
**第三个参数是绑定了需要执行的操作**,比如这次采用的发送广播,也可以弹出提示框等等

`setRepeating(int type, long triggerAtMillis, long intervalMillis, PendingIntent operation)`
这个方法和上一个类似,就是多了一个参数`long intervalMillis`,这个方法是可以重复执行提醒功能,而多出的这个参数就是重复提醒之间的时间间隔

`cancel(PendingIntent operation)`
这个方法从名字就可以看出来,是用来取消提醒的

2.设置广播接收器
  注意1中的这一行代码 `Intent intent = new Intent(getApplicationContext(), AlarmBroadcastReciver.class); `  这行代码就是利用Intent直接指定广播接收器,这样就不需要在清单文件中注册具体的广播标签,该广播接收器接受到广播时,会直接执行关机操作
```@Override
public void onReceive(Context context, Intent intent) {    Toast.makeText(context,"关机啦", 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.设置按钮监听器,根据点击的按钮开启循环提醒还是单次提醒,同时显示出当前设定的数据
4.重写onStop()方法,在方法中使用ShardPreference用于保存设定的数据,在进入程序时读取保存的数据,并显示出来,以方便知道之前设定的数据

遇到的问题:本来是覆写的onDestroy()方法,想的是在程序销毁时保存数据,结果总是没保存下来,之前也用过ShardPreference在onDestroy()方法中保存数据,是可以的。最后经过多次测试,又看了一下Activity的生命周期图才发现问题所在,下面结合官网给出的生命图来说明

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

当程序进入到后台时就由运行态转换到onPause()态,当不再对用户可见时,就会进入到onStop()态,当程序被finifsh掉后,会进入onDestroy()进而被消灭,这种正常退出的情况下在onDestroy()中保存数据当然是可以的。但是考虑到图中的另一条路线,由onStop()直接转到死亡状态,这种情况就属于非正常情况退出了,比如正在运行时突然被什么清理软件给彻底杀掉了,那么这个时候是不会到onDestroy()这一步,所以此时在这个方法中保存数据就会失败,因此面对这种情况可以考虑覆写onStop()方法进行保存数据,然后在onCreate()中即活动刚创建时获取即可

按照习惯,总是以一个小APP的形式熟悉这些知识点,全代码还有之前的涉及到其他知识点的小APP的代码,都放在[GitHub](https://github.com/huangkunkun/),有些地方可能说的不是很到位,希望各位大神留言指正

一些bug的更改及遗漏问题放在[Android定时关机问题解决](http://www.jianshu.com/p/da37562f1111)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352

推荐阅读更多精彩内容