番茄花园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 600|回复: 3

[交流讨论] 关于4.1.1版本后i939自动开关机的问题(2)

[复制链接]

升级   20.03%

  • TA的每日心情
    擦汗
    2015-8-11 22:01
  • 签到天数: 175 天

    连续签到: 2 天

    [LV.7]常住居民III

    发表于 2013-1-30 16:12:25 | 显示全部楼层 |阅读模式

    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程序编译小组论坛,babyfacergti在此谢谢SuperMe提供的资料!

    升级   49.8%

  • TA的每日心情
    开心
    2016-9-6 07:44
  • 签到天数: 566 天

    连续签到: 3 天

    [LV.9]以坛为家II

    发表于 2013-1-30 18:37:51 | 显示全部楼层
    多谢分享

    升级   33.15%

  • TA的每日心情
    开心
    2018-2-2 09:00
  • 签到天数: 371 天

    连续签到: 2 天

    [LV.9]以坛为家II

    发表于 2013-1-30 23:26:40 | 显示全部楼层
    厉害,希望有大神能弄出来

    升级   73.75%

  • TA的每日心情
    开心
    2014-10-30 09:15
  • 签到天数: 18 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2013-2-4 21:25:25 | 显示全部楼层
    看贴回帖是对作者的尊重!
     懒得打字嘛,点击右侧快捷回复;  
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    快速回复 返回顶部 返回列表