安卓定时开关机软件

发布时间:2015-06-08 来源: 安卓自动开关机软件

第一篇:安卓定时开关机软件

Android 之实现定时开关机 分类

Android2012-09-26 00:201051人阅读评论(3)收藏举报 androidserviceactiontimezoneserverdialog 关于 android 自动关机,网上有很多应用程序和例子。

相对于自动开机来说,自动关机可 以在应用层通过设置 alarm 来实现。而自动开机,网上的介绍就比较少了,因为它需要底层 rtc 时钟的支持。前段时间根据客户需求实现了自动开关机。在这里分享一下。

1. 简介 我的实现是在设置程序里面增加一个接口, 让用户设置自动开关机, 这个自动开关机的设置 可以参照闹钟的设置。关于自动关机,考虑到关机的时候,用户可能正有一些重要的操作, 那么应该给用户一个机会去取消当前的关机。

1)一个 BroadcastReceiver, 接收如下信息

a) 自 定 义 的 ACTION_REQUEST_POWER_OFF

设 置 auto power off 时 , 通 过 AlarmManager 设置的一个 RTC_WAKEUP 时钟。当到设置的关机时间时,之前设置到 AlarmManager 的这个 action 会被广播。我们实现的这个 BroadcastReceiver 接收到这个消息 后,就要开始 power off 流程 b) 自 定 义 的 ACTION_REQUEST_POWER_ON

设 置 auto power on 时 , 通 过 AlarmManager 设置的一个 RTC_WAKEUP 时钟。我们知道 power on 的应该设置一个 rtc 的 alarm,那么这个 RTC_WAKEUP 的 alarm 是做什么的呢?其实当用户设置自动关机的时候, 我 设 置 了 2 个 时 钟 , 一 个 是 RTC 时 钟 , 用 于 关 机 状 态 下 开 机 ; 还 有 一 个 就 是 这 个 RTC_WAKEUP 时钟。之所以设置这个时钟,其实是这样的,比如说你设置了周一到周五每 天7点半自动开机,而周四早上你7点就打开了手机,这样到7点半的时候,之前设置的时钟 就过期了,如果不重新设置的话,周五早上是不会自动开机的。所以这个时候,之前设置的 RTC_WAKEUP 就接收到了这样的信息,在重新设置下次自动开机的时钟。

c) BOOT_COMPLETE 和 TIMEZONE changed, Time set 等时间相关的 action:当系统开 机完成或时间、时区发生改变时,都需要重新设置 alarm。

2 ) 一 个 处 理 power off 的 Service , 当 BroadcastReceiver 接 收 到 ACTION_REQUEST_POWER_OFF,我们给用户一个机会去取消当前的自动关机。这个 Service 的作用就是启动一个无背景的页面,给用户提示。同时播放之前用户设置的提示音 或振动。

3)一个 Activity:显示一个 dialog 提示用户要自动关机,并用一个计时器倒计时。当用户确 认关机, 或者计时器到时间的时候, 就关机。

否则取消当前关机, 并重设下次自动关机 alarm。

2. 自动关机的实现。自动关机的实现比较简单,这里主要说一下怎么设置 alarm,和实现关 机

1) 设置自动关机的 alarm: ? ? ? ? ? ? ? PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, Intent intent = new Intent( "com.android.settings.action.REQUEST_POWER_OFF"); AlarmManager am = (AlarmManager) context .getSystemService(Context.ALARM_SERVICE); ? ? intent, PendingIntent.FLAG_CANCEL_CURRENT); am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); ?? am.set(AlarmManager.RTC_WAKEUP, time, pendingIntent); 2)自动关机掉的是./frameworks/base/services/java/com/android/server/ShutdownActivity.java: ?? Intent newIntent = new Intent(Intent.ACTION_REQUEST_SHUTDOWN); ?? newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); ?? startActivity(newIntent); Intent.ACTION_REQUEST_SHUTDOWN 是 Intent 里面一个隐藏的 action。

3. 自动开机的实现。一直在做上层应用和 framework,对于底层不是很熟悉。正好有同事之 前做过关机闹铃,所以把他之前的实现稍加改动就可以了。在系统 power off 的状态下自动 开机,我们需要设置一个 rtc 时钟,当用户设置自动开机时,由 AlarmManagerService 将时 钟设置下去。这学要底层的支持。这里的实现是定义一个我们自己的 rtc alarm type

1) 首先要在头文件里面定义

a) kernel/include/linux/android_alarm.h b) bionic/libc/kernel/common/linux/android_alarm.h ?? #define ANDROID_RTC_ALARM_SET _IOW('a', 7, int) 2) 定义完成之后, 还需要实现

kernel/drivers/rtc/alarm-dev.c 文件的 alarm_ioctl 方法里面, 在 增加一个 case,实现设置 alarm ?? case ANDROID_RTC_ALARM_SET

?? { ?? unsigned int rtc_alarm_time; ?? struct rtc_time rtc_now; ?? if (copy_from_user(&rtc_alarm_time, (void __user *)arg, ?? sizeof(rtc_alarm_time))) { ?? rv = -EFAULT; ?? goto err1; ?? } ?? if (pmic_rtc_get_time(&rtc_now) < 0) { ?? rtc_now.sec = 0; ?? if (pmic_rtc_start(&rtc_now) < 0) { ?? printk("get and set rtc info failed\n"); ?? break; ?? } ?? } ?? pmic_rtc_disable_alarm(PM_RTC_ALARM_1); ?? rtc_now.sec += rtc_alarm_time; ?? pmic_rtc_enable_alarm(PM_RTC_ALARM_1, &rtc_now); ?? break; ?? } 当然不要忘记增加一个 include: ?? #include <mach/pmic.h> 3)在 frameworks/base/services/jni/com_android_server_AlarmManagerService.cpp 里面增加一 个方法去设置时钟: ?? static void android_server_AlarmManagerService_updateRtcAlarm(JNIEnv* env, jobject obj, jint fd, jint seconds) ?? { ?? #if HAVE_ANDROID_OS ?? int result = ioctl(fd, ANDROID_RTC_ALARM_SET, &seconds); ?? LOGE("set rtc alarm to %d later

%s\n", seconds, strerror(errno)); ?? if (result < 0) ?? { ?? LOGE("Unable to set rtc alarm to %d later

%s\n", seconds, strerror(errno)); ?? } ?? #endif ?? } 还有就是不要忘记定义一下接口: ?? {"updateRtcAlarm", "(II)V", (void*)android_server_AlarmManagerService_updateRtcAlarm}, 4) 在 frameworks/base/services/java/com/android/server/AlarmManagerService.java 里面定义 native 的设置 alarm 的方法,然后调用就可以实现将自动关机的 alarm 设置下去了

定义:private native void updateRtcAlarm(int fd, int seconds); 调用: ?? public void setRepeating(int type, long triggerAtTime, long interval, ?? PendingIntent operation) { ?? if (operation == null) { ?? Slog.w(TAG, "set/setRepeating ignored because there is no intent"); ?? return; ?? } ?? synchronized (mLock) { ?? Alarm alarm = new Alarm(); ?? alarm.type = type; ?? alarm.when = triggerAtTime; ?? alarm.repeatInterval = interval; ?? alarm.operation = operation; ?? ?? // Remove this alarm if already scheduled. ?? removeLocked(operation); ?? ?? if (localLOGV) Slog.v(TAG, "set

" + alarm); ?? ?? int index = addAlarmLocked(alarm); ?? if (index == 0) { ?? setLocked(alarm); ?? } ?? ?? // Start to setup auto power on alarm ?? if ((alarm.type == AlarmManager.ELAPSED_REALTIME_WAKEUP) && ?? alarm.operation.getTargetPackage().equals("com.android.settings")) { ?? updateRtcAlarm(mDescriptor, (int)((alarm.when - System.currentTimeMillis()) / 1000)); ?? } ?? // End to setup auto power on alarm ?? } ?? } 5)在应用层设置自动开机 ?? AlarmManager am = (AlarmManager) context ?? .getSystemService(Context.ALARM_SERVICE); ?? Intent intent = new Intent( ?? "com.android.settings.action.REQUEST_POWER_ON"); ?? PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, ?? intent, PendingIntent.FLAG_CANCEL_CURRENT); ?? am = (AlarmManager) context ?? .getSystemService(Context.ALARM_SERVICE); ?? am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, time, pendingIntent); 4. 总结 1) 自动开机原理比较简单,但是需要底层的支持,所以对于做应用或者 framework 层的技 术人员来说,实现起来稍微比较麻烦。

2) 在设置自动开关机的时候,需要考虑的情况很多,比如是否设置时间/时区的改变,手 机当前是开机还是关机状态等。

分享到

? 上一篇:Android 之粘性广播理解 ? 下一篇:Java 之 RandomAccessFile 小结 查看评论 3楼 zhongyuanceshi 2013-03-12 17:32发表[回复] [引用][举报] <Receiver android:name=".ScheduleOffReceiver"> <intent-filter> <action android:name="ww.hzy.action_schedule_off"/> </intent-filter> </Receiver> androidmanifest.xml 文件也有过滤"ww.hzy.action_schedule_off",但就是收不到广播 2楼 zhongyuanceshi 2013-03-12 16:42发表[回复] [引用][举报] androidmanifest.xml 注册 <Receiver android:name=".ScheduleOffReceiver"> <intent-filter> <action android:name="android.intent.action.ACTION_SHUTDOWN"/> </intent-filter> </Receiver> 1楼 zhongyuanceshi 2013-03-12 16:42发表[回复] [引用] [举报] ?? AlarmManager amAlarmManager=(AlarmManager)getSystemService(Context.ALARM_SERVICE); ?? Intent intent=new Intent("ww.hzy.action_schedule_off"); ?? ?? PendingIntent pendingIntent=PendingIntent.getBroadcast(MainActivity.this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); ?? amAlarmManager=(AlarmManager)getSystemService(Context.ALARM_SERVICE); amAlarmManager.set(AlarmManager.RTC_WAKEUP, offTime-curTime, pendingIntent); ?? ?? public class ScheduleOffReceiver extends BroadcastReceiver { ?? ?? final static String SCHEDULE_OFF_ACTION="ww.hzy.action_schedule_off"; ?? @Override ?? public void onReceive(Context context, Intent intent) { ?? // TODO Auto-generated method stub ?? if(SCHEDULE_OFF_ACTION.equals(intent.getAction())) ?? { ?? Log.d("hzy","onReceive"); ?? Intent intentShutdIntent=new Intent(Intent.ACTION_SHUTDOWN); ?? intentShutdIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); ?? context.startActivity(intentShutdIntent); ?? } ?? } ?? ?? } 无法收到广播,是哪里出问题了?

第一篇:安卓定时开关机软件

如何设置计算机定时开关机 [ 标签

计算机 , 定时开关 , 电 脑 ] 其实很寂寞 回答:2 人气:2 解决时间:2011-05-03 15:08 满意答案 好评率

0% 自动定时开机的实现:首先在启动计算机 时,按“Delete”键进入BIOS界面。在BIOS设置主界面中选择 “Power Management Setup”菜单,进入电源管理窗口。默认情况 下,“Automatic Power Up(定时开机,有些机器选项为Resume By Alarm)”选项是关闭的,将光标移到该项,用PageUp或PageDown翻 页键将“Disabled”改为“Enabled”,而后在“Date (of Month) Alarm”和“Time (hh:mm:ss) Alarm”中分别设定开机的日期和时 间。如果“Date”设为0,则默认为每天定时开机。设置好后按 “ESC”键回到BIOS设置主界面,点击“Save Exit Setup”,按 “Y”键保存CMOS设置退出,接着机器会重新启动,这时便大功告 成了。当然,值得注意的是定时开机需要您的主板支持才行,不过 现在大多数主板都有这项功能。另外,不同的主板在设置上会不尽 相同,不过都大同小异。

定时关机的实现:单击“开始”按钮, 在“开始”菜单中选择“程序”选项,在“程序”中选择“附 件”,再在“附件”中选择“系统工具”,在“系统工具”中选择 “计划任务”命令, 这时就打开了“计划任务”窗口, 在该窗口中, 点击“添加已计划的任务”进入“计划任务”向导。按照提示点击 “下一步”后,再点击“浏览”按钮,找到 “C:\Windows\Rundll32.exe”打开,然后根据自己的需求设置任 务执行的方式,如每天或每周。最后设置好这个任务开始的时间和 开始的日期,点击“完成”按钮就会在计划任务窗口出现 “Rundll32”这个计划任务名。

这个计划任务还需要进行属性的 修改设置,在计划任务窗口,双击“Rundll32”打开属性窗口,在 “运行”栏中把原有的内容修改为:C:\WINDOWS\Rundll32.exe user.exe,exitwindows。

注意user.exe和exitwindows之间的“, ” 必须为英文半角,且其前后不能有“空格”。

这样,定时开机、 关机就全部设置完成。

要实现自动开机,主板必须有相应的支持 才行,近几年生产的主板绝大多数都支持自动开机,我们只要在 BIOS中进行相应设置即可。

不过不同主板、不同版本的BIOS设置 方法会有所不同。

一般常见的有以下三种品牌的CMOS

Awards / AMI / Phoenix 请选择相应的品牌查看如何设置

AMI COMS 设置 开 机时按下DEL键进入BIOS;选择Power Management Features; 选 择Set Wake Up Events; 将Resume By A 2 满意答案 好评率

0% 楼上的已经说得非常明白了!我不用多 说 评价答案 您已经评价过! 好

0 您已经评价过! 一般

333 --> 您已经评价过! 不好

0 您已经评价过! 原创

0 您已经评价过! 非原创

0 问问团队 中华IT精英 共1人编辑答案 2011-05-03 14:56 我有更好的回答 收藏 转载到QQ空间 --> 分享 QQ空间 腾 讯朋友 新浪微博 人人网 豆瓣 相关知识 ? 电脑可以定时开关机 吗 9回答 2011-08-05 ? 怎么设置定时开关机? 10回答 2008-08-11 ? 怎样设置自动定时开关机? 14回答 2008-12-15 ? 如何设置计算机的开关机图片? 1回答 2008-09-05 ? 诺基亚5230 中定时开关机在哪设置?(说清楚点) 1回答 2011-06-11 更多相 关知识>> 电脑设置定时开关机 w7在哪设置定时开关机 电脑如何 定时开关机 定时开关机 计算机开关机设置 电脑定时开关机软件 手机定时开关机软件 安卓定时开关机软件 我要评论 浏览全部评 论>> 在线求助 团队

信息产业技术 类型:中级团 满意答案

24215 团队宣言:团队的采纳率,就可以… ? 正常是开机机箱会 有“嘀”的一声,… ? 无线网卡能打大型网络游戏吗? 孺子牛 等级:20 采纳率:41.6% ? 关于电信宽带的安装问题 ? 691错误代 码 --> --> --> 帮助 提意见 Copyright ? 1998 – 2011 Tencent. All Rights Reserved. 关闭 在上方输入您感兴趣的知识,点击搜 索答案后,下方将出现您感兴趣的问题列表。

进入任一您感兴趣 的问题查看,点选其满意答案处的4个评价按钮之一,即可完成对 该满意答案的评价。

larm 设置为 Enabled, 下面是设置定时开机的具体时间:Alarm Date

01-31(具体日期)或者 Every Day(每天) Alarm Hour

00-23(0 点到 23 点) Alarm Minute

00-59(0 分到 59 分) Alarm Second

00-59(0 秒到 59 秒) 保存设置后退出 BIOS 设置界面,进入操作系 统后再次关机就生效了。

返回上方 AWARD COMS 设置 开机时按下 DEL 键进入 BIOS;选择 Power Management Setup; 选择 PM Wake Up Events; 设置 Resume By Alarm(定时开机)中的选项

设置 Month Alarm 为 NA;注:表示每天都自动开机,有些主板为 EVERY DAY; 设 置 Day of Month Alarm 为 0;注:同样表示忽略日期,每天都定时 开机;设置 Time (hh:mm:ss) Alarm 为某一具体时间; 如 6:30:00, 注

这样每天早晨 6:30 电脑都会自动开机。

保存设置后退出 BIOS 设置 界面, 进入操作系统后再次关机就生效了。

评价答案 您已经评价过! 好

0 您已经评价过! 一般

333 --> 您已经评价过! 不好

1 您 已经评价过! 原创

0 您已经评价过! 非原创

0 ╰明白了爱丶 回 答采纳率:29.8% 2011-05-03 09:2

第一篇:安卓定时开关机软件

Android 实现开机自动运行程序 有些时候,应用需要在开机时就自动运行,例如某个自动从网上更新内容的后台 service。

怎样实现开机自动运行的应用?在撰写本文时,联想到高焕堂先生以“Don't call me, I'll call you back!”总结 Android 框架,真是说到点子上了。理解这句话的含义,许多有关 Android 平台上实现某种功能的问题,都能迎刃而解。

使用场景:手机开机后,自动运行程序,在屏幕上显示"Hello. I started!"字样。

背景知识

Android 启动时, 当 会发出一个系统广播, 内容为 ACTION_BOOT_COMPLETED, 它的字符串常量表示为 android.intent.action.BOOT_COMPLETED。只要在程序中“捕捉”到 这个消息,再启动之即可。记住,Android 框架说:Don't call me, I'll call you back。我们要 做的是做好接收这个消息的准备,而实现的手段就是实现一个 BroadcastReceiver。 代码解析

1、界面 Activity:SayHello.java package com.ghstudio.BootStartDemo; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class SayHello extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView tv = new TextView(this); tv.setText("Hello. I started!"); setContentView(tv); } } 这段代码很简单,当 Activity 启动时,创建一个 TextView,用它显示"Hello. I started!"字样。 2、接收广播消息:BootBroadcastReceiver.java package com.ghstudio.BootStartDemo; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class BootBroadcastReceiver extends BroadcastReceiver { static final String ACTION = "android.intent.action.BOOT_COMPLETED"; @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(ACTION)){ Intent sayHelloIntent=new Intent(context,SayHello.class); sayHelloIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(sayHelloIntent); } } } 该类派生自 BroadcastReceiver,覆载方法 onReceive 中,检测接收到的 Intent 是否符合 BOOT_COMPLETED,如果符合,则启动 SayHello 那个 Activity。 3、配置文件:AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.ghstudio.BootStartDemo" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <receiver android:name=".BootBroadcastReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> <category android:name="android.intent.category.LAUNCHER作文"/> </intent-filter> </receiver> <activity android:name=".SayHello" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-sdk android:minSdkVersion="3" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission> </manifest> 注意其中粗体字那一部分,该节点向系统注册了一个 receiver,子节点 intent-filter 表示接收 android.intent.action.BOOT_COMPLETED 消息。不要忘记配置 android.permission.RECEIVE_BOOT_COMPLETED 权限。

完成后,编译出 apk 包,安装到模拟器或手机中。关机,重新开机。

延伸思考:在多数情况下,要自动运行的不是有界面的程序,而是在后台运行的 service。

此时,就要用 startService 来启动相应的 service 了。

安卓定时开关机软件》出自:金链花美文网
链接地址:http://www.nongyeqq.com/content/S1rOofIjaVPKJXRP.html

网站地图 | 关于我们 | 联系我们 | 广告服务 | 免责声明 | 在线留言 | 友情链接 | RSS 订阅 | 热门搜索
版权所有 金链花美文网 www.nongyeqq.com

安卓定时开关机软件