在android 中能不能实现 定时开机呢?

最近想搞个定时开关机的小程序。。。。。。
但是定时开机 能不能实现 ,需要学习到哪个层次的东西呢?

3个回答

关于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。

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

1) 设置自动关机的alarm:

 AlarmManager am = (AlarmManager) context
                .getSystemService(Context.ALARM_SERVICE);

        Intent intent = new Intent(
                "com.android.settings.action.REQUEST_POWER_OFF");

        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0,
                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。

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

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

  a) kernel/include/linux/android_alarm.h

#define ANDROID_ALARM_GET_TIME(type)        ALARM_IOW(4, type, struct timespec)
#define ANDROID_ALARM_SET_RTC               _IOW('a', 5, struct timespec)

/* we define ANDROID_RTC_ALARM_SET for auto power off */
#define ANDROID_RTC_ALARM_SET               _IOW('a', 7, int)

#define ANDROID_ALARM_BASE_CMD(cmd)         (cmd & ~(_IOC(0, 0, 0xf0, 0)))

  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);
  1. 总结

1) 自动开机原理比较简单,但是需要底层的支持,所以对于做应用或者framework层的技术人员来说,实现起来稍微比较麻烦。
2) 在设置自动开关机的时候,需要考虑的情况很多,比如是否设置时间/时区的改变,手机当前是开机还是关机状态等。

niangzhi
niangzhi 能解决你的问题么?如果能解决就采纳吧!
接近 7 年之前 回复
tskyming
skyming 多谢了
接近 7 年之前 回复

自动开机原理比较简单,但是需要底层的支持,所以对于做应用或者framework层的技术人员来说,实现起来稍微比较麻烦

自动开机不会出现在第三方应用上

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
在android 中能不能实现 定时开机呢?
最近想搞个定时开关机的小程序。。。。。。rn但是定时开机 能不能实现 ,需要学习到哪个层次的东西呢?
在MAYA中能不能实现汉字输入??
如题
这个在VB中能不能实现????
在类中定义的 Private cmdfk() As CommandButtonrn可不可以在form上面显示出来,如果能该怎么写?
datagrid中能不能实现批量更新???
本来的buttoneditcloumn只能是单条纪录的更新rn请问能能在查询数据出来的时候就把所有纪录设为edit状态rn更新的时候用其它事件来触发本来的update事件,实现对所有纪录的更新呢?
android 涂鸦 不能实现清屏呢?
网上的好多都报错呢?谁有可以运行的代码?
在delphi中能不能实现定时操作,如果能,要如何做??
定时完成数据库备份,不知道能不能行。rn如果可以的话,请说的详细些,谢谢!
在ACCESS中能不能实现下面的功能
我想写一个SQL,用于插入某个表中的数据,希望能够返回插入的那行数据自动生成的ID号。注意,是用一条SQL语句。
sqlserver7.0中能不能实现以下功能...
在sqlserver7.0中有没有某一命令来清空某一数据库中的所有数据?rn还有如何检测sqlserver中是否有用户正在访问某一数据库,并将终止其访问?rnrn以上功能最好能在delphi中实现!rn请各位大虾多多帮忙!先谢了!
asp中能不能实现这样的数组
dim name,nodernredim name(100),node(100)rnnode(name(i))rnnode数组是以name数组的值作为下标的,就是哈西结构的数组方式rn但是不行啊,js代码支持这样的数组
asp.net中能不能实现在线的小游戏?
比如说很早的那个打乒乓球的游戏。rn游戏本身很简单,一人控制一个球拍。撞来撞去。rn怎么实现呢?
请问vb6中能不能实现函数重载?
rtrnthx!
请问在vb6.0中能不能实现多线程
请问在vb6.0中能不能实现多线程rnrn如果能要用什么控件或函数,还是的调用api呢rn谢谢   rn
oracle中能不能实现存储“数组”?
oracle中能不能实现存储“数组”?rnrn我想在一个字段中存储数组,可以增加可以减少,也就是说是一个可变的数组,oracle中好像没有这个数据类型,有没有实现的办法?
LINQ中能不能实现SUM语句?
SQL语句如下:rnSELECT partName,sum(partWeight) as totalWeightrnFROM tblPartsrnGROUP BY partName rn在LINQ中如何实现以上功能?rn
在ACCESS中能不能实现这样的查询?
表a:rnID gxmcrn1 工序1rn2 工序2rn3 工序3rn表b:rnmc gxmc sj(时间:分)rn零件A 工序1 20 rn零件A 工序2 30rn零件B 工序1 15rn零件B 工序3 10rn需要如下结果:rn 工序1 工序2 工序3rn零件A 20 30rn零件B 15 10rnrnrnrn
java 中能不能实现一个数字键盘
现在想通过java程序做到起到系统键盘作用的功能。rn 比如程序起来以后,rn 能够对网页上的focus文本域发送数据。rn 程序与网页是不相关的
css中能不能实现合并单元格呀?
想在css中控制合并单元格,用什么属性呢?请各位大虾帮帮忙,谢谢了。rn
简单定时开机·智能开机
可以直接设置时间开机,不支持win7·win8系统,不用再通过主板设置即可定时开机。注册码可以再网上找到,
水晶报表中能不能实现:“提取一条记录作为字段输出” 呢?
我的某个表中对应每个字段有多条记录,我在设计报表时,添加一个字段后会输出所有的记录,但我只想输出某条特定的记录,怎样做才能实现对应一个字段输出一条记录呢?请高手们指教,能不能实现呢?怎样实现?
Android定时开机及其实现流程
开(关)机原理,以低电平为例: 1、平时,电平为高 2、按下按键,电平为低; 3、电源管理(硬件PM)部分对低电平处理:低电平一直持续n秒,认为是开(关)机信号 4、进行开(关)机 要实现定时开(关)机,只需要定时时间到来后产生PM需要的开机信号(持续n秒的低电平)即可。既要定时,又要产生电平信号,在设备中由RTC这个部件完成。
android上实现定时开机接口
android上面alarm功能设置定时功能时,并不能把alarm写入到rtc芯片的alarm寄存器中,所以要实现定时开机功能,需要另外实现接口 代码中在4.4和5.1上已调试通过,通过增加jni接口直接对rtc ioctrl写入alarm操作,在shutdown把开机时间写入到rtc寄存器中
请问在SQLSERVER2000 中能不能实现这样的功能:
已知CHAR:“A,B,C,D,F,R,G,B,H,G,F,”rn能不能将A B C D F R G B H G F 取出来放入一个TABLE变量中?rn最好能提供源代码。
DB2中能不能实现indexof功能?如何实现
我的意思是这样的rn有两个表A,BrnA表的结构是A(C CHAR(10),D INTEGER)rnB的结构是B(E char(10),F CHAR(10))rn比如A表中有数据rn表Arn C(国家) D(分数)rn---------- ----------rn中国 100rn美国 50rnrnrnrn表Brn E(姓名) F(党派)rn--------- ----------rn小明 中国共产党rn吉姆 美国民进党rn大门 中国国民党rnrnrn要求是这样的,算出B表中的E(人)的D(分数)rn只要F(党派)中存在相应的C(国家),就得相应的Drnrn如何实现????????
在WEB页面中能不能实现调用客户端中的软件?
请教各位一下!谢谢!
在Dataset中能不能实现两个表之间的关联查询。
例如:在ds中有表A,表B,表Crn表A,表B,表C都有主键ID,而且是一致的。能不能通过ID将三个表关联起来,再加上其他查询条件,查询出结果(结果中包含三个表的部分字段)。rn在sql语句中很好实现,但是在Dataset中如何实现,谢谢!!!rn
PHP下的小窗口,在ASP中能不能实现?
PHP下的小窗口,在ASP中能不能实现?就像这个论坛http://www.htmlcool.com,点注册就会弹出一个小窗口,登陆界面,发帖界面也都是这个样子的。看下面的链接是PHP,不知道ASP能不能做出来?
请问在SQLSERVER2000中能不能实现如下的功能?
已知CHAR:“A,B,C,D,F,R,G,B,H,G,F”rn能不能将A B C D F R G B H G F 取出来放入一个TABLE变量中?rn最好能提供源代码。
C中能不能实现WINDOWS那样的消息机制?
我在做一个噪声监测的项目,数据采集用了两个缓存,缓存存满时会发出一个存满的消息,在C中怎么接受这个消息呢?怎么样实现MFC那样的消息机制?多谢
在vb中能不能实现域名(一级和二级)的查询.
请问在vb 中能不能实现当输入一个二级域名的字母范围(如:ab--ca)时,可查询是不是已经使用.如果有,请问怎么做?rn谢谢.
delphi中能不能实现获取数据库表中的字段名???
delphi中能不能实现获取数据库表中的字段名。就是说获取数据库中一个表的所有字段的名称,注:不是表里的数据
sql语句中能不能实现字符串sum的功能?
就是把表中某个字段的字符串都连起来.
定时开机源码(C#)
用C#编写的利用远程启动计算机。可供学习之用。 通过网络唤醒主机。
如何实现定时开机
有没有人知道定时开机如何实现啊,定时关机也可以.
定时开机 关机 重启
定时开机 关机 重启 计划开机 关机 重启 可以自定义设置开机 关机 重启
电脑定时开机
电脑定时开机
BIOS设置定时开机
定时开机是指利用系统 RTC ( Real Time Clock 实时时钟)实现在事先设定的时间自动开机,不需要在主板有跳线,只需在 BIOS SETUP 中进行时间设置即可。
bios 设置定时开机
bios 设置定时开机
定时开机.exe
可以通过控制cmd进行关机或定时关机。
定时开机定时关机操作手册
时间金系统软件在windows平台下,集电源管理控制、普通定时开机控制、智能定时开机控制、智能定时关机控制、标准时间校准、任务计划设置、自动键盘鼠标模拟、文件加密解密、智能立即关机、声音开关控制等功能于一体的高科技实用共享软件。 时间金系统软件可以按一次、小时、每天、每周、重复、空闲、登陆时来控制软件运行、播放影象音乐、打开网站、电脑声音开关、定时开机、定时关机、执行键盘鼠标模拟等功能。
请问如何定时开机?
我在 bios 中把resume by alarm该为enable,把date of month 改为31,再把启动时间改为比bios 时间晚一分钟,保存关机并不会自动开机啊?rn另外请问在win2000 server 和windows xp中如何自动登陆到系统中,不用再点击确定或者xp中的用户名?
相关热词 c# 标准差 计算 c#siki第五季 c#入门推荐书 c# 解码海康数据流 c# xml的遍历循环 c# 取 查看源码没有的 c#解决高并发 委托 c#日期转化为字符串 c# 显示问号 c# 字典对象池