定时开关机功能实现

提示:本文仅仅针对MTK平台实现需求,对其它芯片主控平台暂无借鉴可言


需求

实现手机一样的定时开关机功能

需求描述

在手机中,都有定时开关机功能,其次在闹铃app中,定时后,在手机关机状态下,设置的闹铃时间到后,手机先开机后闹铃。
实际产品定制中,需要有这样的定时开关机功能,系统提供这样的接口,应用调用。

实际手机功能图

在这里插入图片描述在这里插入图片描述

资料相关说明

实现方案

修改方案

  • 在Android系统源码中内置Android8.1 源码对应的开关机源码,作为系统应用。 Android8.1 定时开关机源码:SchedulePowerOnOff GitHub 上面 SchedulePowerOnOff 源码
  • vendor/mediatek/proprietary/frameworks/base/services/core/java/com/mediatek/server/MtkAlarmManagerService.java 修改,适配对应的包名使其具备功能。

修改内容点

内置App

可完全参考借鉴之前文章MTK内置第三方APP-卸载不可卸载-签名问题

修改MtkAlarmManagerService.java

修改内容如下:

--- a/vendor/mediatek/proprietary/frameworks/base/services/core/java/com/mediatek/server/MtkAlarmManagerService.java
+++ b/vendor/mediatek/proprietary/frameworks/base/services/core/java/com/mediatek/server/MtkAlarmManagerService.java
@@ -361,7 +361,8 @@ public class MtkAlarmManagerService extends AlarmManagerService{

         // Only DeskClock is allowed to set this alarm
         if (mNativeData != 0 && mNativeData != -1) {
-            if (setPackageName.equals("com.android.deskclock")) {
+            if (setPackageName.equals("com.android.deskclock")^M
+            /*add by xzhe on 20230404*/ || setPackageName.equals("com.mediatek.schpwronoff")) {^M
                 /// M: Extra Logging @{
                 if (DEBUG_ALARM_CLOCK) {
                     Slog.i(TAG, "mBootPackage = " + setPackageName + " set Prop 2");
@@ -411,7 +412,8 @@ public class MtkAlarmManagerService extends AlarmManagerService{
             // AlarmPair tempAlarmPair = mPoweroffAlarms.remove(name);
             // it will always to cancel the alarm in alarm driver
             if (mNativeData != 0 && mNativeData != -1) {
-                if (name.equals("com.android.deskclock")) {
+                if (name.equals("com.android.deskclock")^M
+                    /*add by xzhe on 20230404*/ || name.equals("com.mediatek.schpwronoff")) {^M
                     set(mNativeData, PRE_SCHEDULE_POWER_OFF_ALARM, 0, 0);
                 }
             }

坑点解决

  • 定时闹铃和定时开机 在关机状态下,机器会提前150s,3分钟,120分钟 就开机了,我们称之为提前开机。 对于闹钟而言是正常的,但是对于定时开机而言,时间是需要准确的。解决方案要么应用端 适配、要么系统将时间设置为中间值 比如一分钟。 具体修改如下:
vendor/mediatek/proprietary/frameworks/base/services/core/java/com/mediatek/server/MtkAlarmManagerService.java  

修改POWER_OFF_ALARM_BUFFER_TIME  根据实际情况,综合修改具体时间值

什么意思呢?
/**
     * M: This alarm type is used to set an alarm that would be triggered if device
     * is in powerOff state. It is set to trigger POWER_OFF_ALARM_BUFFER_TIME ms earlier
     * than the actual alarm time so that phone is in wakeup state when actual alarm
     * triggers
     */

  • 上面提供的 定时开关机源码,只是针对系统设置添加了一个功能。具体对外释放的接口还需自己来实现。 那就是需要研究一下 SchedulePowerOnOff 源码了。还好源码比较简单,自己看看原理,对外释放接口来实现。

总结

  • 针对MTK方案实现定时开关机功能,并对外释放接口
  • 定时开关机功能和闹铃功能API上面都用到了AlarmManager.java,对于定时任务有一定的参考意义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

野火少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值