- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
RTC 即实时时钟(Real-Time Clock),主要是功能有:
PowerOffAlarm 是一个与安卓系统关机闹钟功能相关的应用或组件。 当用户设置好关机闹钟后,会向 PowerOffAlarm 发送设定关机闹钟广播并传入闹钟时间参数,PowerOffAlarm 接收到广播后,根据预设提前开机时间和闹钟时间往实时时钟(RTC)中写入时间,并将该时间写入文件中暂存 需要注意的是,PowerOffAlarm 中使用的时间默认是当前时区的时间,若传入的时间戳是其他时区的,则需要调整为当前时区的时间戳 。
时区是为了适应地球自转造成的不同地区时间差异而划分的区域.
关机闹钟 PowerOffAlarm 源码路径:vendor/qcom/proprietary/PowerOffAlarm/src/com/qualcomm/qti/poweroffalarm 。
首先查看 AndroidManifest.xml 中与关机闹钟相关的广播接收器的源代码:
<receiver android:name=".PowerOffAlarmBroadcastReceiver"
android:permission="org.codeaurora.permission.POWER_OFF_ALARM"
android:exported="true"
android:directBootAware="true"
android:label="PowerOffAlarmBroadcastReceiver">
<intent-filter android:priority="1000">
<!-- 取消闹钟的广播 -->
<action android:name="org.codeaurora.poweroffalarm.action.CANCEL_ALARM" />
<!-- 设置闹钟的广播 -->
<action android:name="org.codeaurora.poweroffalarm.action.SET_ALARM" />
<action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />
</intent-filter>
</receiver>
<receiver
android:name="com.qualcomm.qti.poweroffalarm.PowerOffAlarmDialog$ShutDownReceiver"
android:permission="org.codeaurora.permission.POWER_OFF_ALARM">
<intent-filter>
<!-- 关机广播 -->
<action android:name="org.codeaurora.poweroffalarm.action.ALARM_POWER_OFF"/>
</intent-filter>
</receiver>
对于设置关机闹钟和取消关机闹钟的逻辑,跟踪到 PowerOffAlarmBroadcastReceiver 的源代码:\vendor\qcom\proprietary\PowerOffAlarm\src\com\qualcomm\qti\poweroffalarm\PowerOffAlarmBroadcastReceiver.java 。
/*******************************************************************************
@file PowerOffAlarmBroadcastReceiver.java
@brief Receive "org.codeaurora.poweroffalarm.action.SET_ALARM" action to set
power off alarm and receive "org.codeaurora.poweroffalarm.action.CANCEL_ALARM"
action to cancel alarm.
******************************************************************************/
public class PowerOffAlarmBroadcastReceiver extends BroadcastReceiver {
//设置关机闹钟的动作
private static final String ACTION_SET_POWEROFF_ALARM = "org.codeaurora.poweroffalarm.action.SET_ALARM";
//设置取消关机闹钟的动作
private static final String ACTION_CANCEL_POWEROFF_ALARM = "org.codeaurora.poweroffalarm.action.CANCEL_ALARM";
//设置关机闹钟的意图携带的 extra 的 key
private static final String TIME = "time";
//设置或取消闹钟
if (ACTION_SET_POWEROFF_ALARM.equals(action)) {//设置闹钟动作
long alarmTime = intent.getLongExtra(TIME, PowerOffAlarmUtils.DEFAULT_ALARM_TIME);//取出要设置的时间戳
long alarmInPref = PowerOffAlarmUtils.getAlarmFromPreference(context);//获取之前设置的时间戳
Log.d(TAG, "Set power off alarm : alarm time " + alarmTime + " time in pref " + alarmInPref);
PowerOffAlarmUtils.saveAlarmToPreference(context, alarmTime);//保存新的时间戳
long alarmTimeToRtc = PowerOffAlarmUtils.setAlarmToRtc(alarmTime);//转化为 RTC 的时间
if (alarmTimeToRtc != FAILURE) {//是个合法时间
persistData.setAlarmTime(alarmTime);
persistData.setAlarmStatus(PowerOffAlarmUtils.ALARM_STATUS_TO_FIRE);
persistData.setSnoozeTime(PowerOffAlarmUtils.DEFAULT_ALARM_TIME);
persistData.writeDataToFile();//会把设置的 RTC 时间存在文件里面
PowerOffAlarmUtils.saveRtcAlarmToPreference(context, alarmTimeToRtc);
}
} else if (ACTION_CANCEL_POWEROFF_ALARM.equals(action)){//取消闹钟动作
long alarmTime = intent.getLongExtra(TIME, PowerOffAlarmUtils.DEFAULT_ALARM_TIME);//获取要取消的闹钟时间戳
long alarmInPref = PowerOffAlarmUtils.getAlarmFromPreference(context);//获取之前设置的时间戳
if (alarmTime == alarmInPref) {//与之前设置的时间戳相同,那就可以取消设置的闹钟
PowerOffAlarmUtils.saveAlarmToPreference(context, PowerOffAlarmUtils.DEFAULT_ALARM_TIME);
PowerOffAlarmUtils.saveRtcAlarmToPreference(context, PowerOffAlarmUtils.DEFAULT_ALARM_TIME);
int rtc = PowerOffAlarmUtils.cancelAlarmInRtc();
if (rtc < 0) {
Log.d(TAG, "Cancel alarm time in rtc failed ");
}
persistData.setAlarmStatus(PowerOffAlarmUtils.ALARM_STATUS_NONE);
persistData.setSnoozeTime(PowerOffAlarmUtils.DEFAULT_ALARM_TIME);
persistData.setAlarmTime(PowerOffAlarmUtils.DEFAULT_ALARM_TIME);
persistData.writeDataToFile();
}
}
}
最后追踪到 PowerOffAlarmUtils 的源代码:\vendor\qcom\proprietary\PowerOffAlarm\src\com\qualcomm\qti\poweroffalarm\PowerOffAlarmUtils.java 。
/**
* Set alarm time to rtc register
*
* @param time alarm time based on current time (ms)
* @return set result -- Fail, return FAILURE; Success,
* return the alarm time to rtc
*/
public static final long MS_IN_ONE_MIN = 60000L;//一分钟
private static final long SEC_TO_MS = 1000L;//将秒转化为毫秒
public static long setAlarmToRtc(long alarmTime/*未来时间的时间戳*/) {
long currentTime = System.currentTimeMillis();//当前时间的时间戳
long alarmInRtc = getAlarmFromRtc();
long rtcTime = getRtcTime();
// MS_IN_ONE_MIN 是系统预留的开机时间
long timeDelta = alarmTime - currentTime - MS_IN_ONE_MIN;//获取当前到未来的时间戳的差值(单位:ms)
// alarm in two minute is not supported
if (timeDelta <= 0) {
Log.d(TAG, "setAlarmToRtc failed: alarm time is in one minute");
return FAILURE;//设置的时间若过短就返回失败
}
long alarmTimeToRtc = timeDelta / SEC_TO_MS + rtcTime;//计算出要唤醒机器的 RTC 时间(单位:ms)
try {
IAlarm mProxy = IAlarm.getService();
int ret = mProxy.setAlarm(alarmTimeToRtc);//设置 RTC 时间
if (ret == SUCCESS) {//设置成功
return alarmTimeToRtc;
} else {
return FAILURE;//设置失败
}
} catch (Exception e) {
Log.d(TAG, e.toString());
return FAILURE;
}
}
对于关机广播的源代码,首先追踪到源代码:\vendor\qcom\proprietary\PowerOffAlarm\src\com\qualcomm\qti\poweroffalarm.java 。
public class PowerOffAlarmDialog extends Activity{
public static class ShutDownReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, Intent intent) {
PowerOffAlarmUtils.powerOff(context);//关机
}
}
}
随后追踪到 PowerOffAlarmUtils.java 中:
private static final String ACTION_REQUEST_SHUTDOWN = "com.android.internal.intent.action.REQUEST_SHUTDOWN";
public static void powerOff(Context context) {
//想要直接使用这个函数的话,app必须是系统app,且具有如下权限:
//<uses-permission android:name="android.permission.SHUTDOWN"/>
Intent requestShutdown = new Intent(ACTION_REQUEST_SHUTDOWN);
requestShutdown.putExtra(EXTRA_KEY_CONFIRM, false);//true 是弹窗询问,false 是不弹窗直接关机
requestShutdown.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(requestShutdown);
}
设置关机闹钟 。
public static final String POWER_OFF_ALARM_PACKAGE = "com.qualcomm.qti.poweroffalarm";
private static final long MS_IN_ONE_MIN = 6000L;
/**
* 设置关机闹钟,在到达预定的时间戳时开机
*
* @param mContext 上下文
* @param millis 未来的时间戳
*/
public static void startPowerOnAlarm(Context mContext, long millis) {//开机
Intent intent = new Intent(Constants.ACTION_SET_POWEROFF_ALARM);
intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
intent.setPackage(POWER_OFF_ALARM_PACKAGE);
long time = millis + MS_IN_ONE_MIN;
intent.putExtra("time", time);
mContext.sendBroadcast(intent);
}
取消关机闹钟 。
public static final String ACTION_CANCEL_POWEROFF_ALARM = "org.codeaurora.poweroffalarm.action.CANCEL_ALARM";
/**
* 取消关机闹钟,取消设定在时间戳 millis 的闹钟
*
* @param mContext 上下文
* @param millis 取消的闹钟时间戳
*/
public static void cancelAlarm(Context mContext, long millis) {
Intent intent = new Intent(ACTION_CANCEL_POWEROFF_ALARM);
intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
intent.setPackage(POWER_OFF_ALARM_PACKAGE);
millis += MS_IN_ONE_MIN;
intent.putExtra("time", millis);
sendBroadcast(intent);
}
关机功能 。
public static void startShutDown(Context mContext) {//关机
Intent intent = new Intent("org.codeaurora.poweroffalarm.action.ALARM_POWER_OFF");
intent.setPackage(POWER_OFF_ALARM_PACKAGE);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.sendBroadcast(intent);
//也可以使用如下代码实现,但必须是系统应用且带有如下权限:
// <uses-permission android:name="android.permission.SHUTDOWN"/>
// String action = "com.android.internal.intent.action.REQUEST_SHUTDOWN";
// if(Build.VERSION.SDK_INT <= Build.VERSION_CODES.N){
// action = "android.intent.action.ACTION_REQUEST_SHUTDOWN";
// }
// Intent intent = new Intent(action);
// intent.putExtra("android.intent.extra.KEY_CONFIRM", false);
// intent.setFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
// intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// mContext.startActivity(intent);
}
最后此篇关于【Android】谷歌应用关机闹钟PowerOffAlarm源码分析,并实现定时开、关机的文章就讲到这里了,如果你想了解更多关于【Android】谷歌应用关机闹钟PowerOffAlarm源码分析,并实现定时开、关机的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
在哥哥的帮助下,我制作了这个小闹钟。我昨晚尝试了它,没有使用 nonBlockingRawInput 并且工作正常,但是使用 nonBlockingRawInput 它没有工作。今天我已经试过了,但它
我创建了一个简单的闹钟通知应用程序,通过它我可以获取实时信息、设置闹钟打开或关闭以及播放单音音频。但我需要播放应以类 VOID 开头的声音。 下面是代码: 获取并启动警报通知: - (void)vie
我尝试在 Xcode 4.6.3 - http://vimeo.com/29824336 下重写以下教程 但我有一个问题,在 24:00 左右我的代码没有发出警报: -(void) scheduleL
在我的 Activity 中: Intent myIntent = new Intent(this, MyAlarmService.class); pendingIntent = PendingInt
我正在尝试制作一个可以设置多次的闹钟。这是代码 std::cout>link; std::cout<<"\n\nProccessing..."; loop3: //Ke
我构建了一个带有计时器的 Cordova 闹钟应用程序。一切正常,除了我现在想在时钟到达时通过视觉和音频警报通知用户。 我使用以下插件进行本地通知:https://github.com/katzer/
我正在编写一个应用程序,用户可以在其中配置警报/警报。在这一点上,我已经做好了一切工作。我正在使用 触发警报 Intent alarmIntent = new Intent(AlarmClock.AC
我正在尝试将后台闹钟功能添加到我正在开发的应用中。 我已经阅读了 UILocalNotification 对象及其用法,并且知道它限制为 30 秒的音频。 我正在考虑安排间隔 30 秒的多个通知(比如
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 9
这是一个非常简单的问题。我正在开发一个 iPhone 应用程序,其中使用自定义日历。用户可以在此应用程序中设置闹钟。用户添加到日历的事件不应在默认日历应用程序中可见,这意味着我无法使用默认日历应用程序
是否可以在我的应用程序代码中为 iPhone 的闹钟应用程序设置闹钟和闹钟描述?例如,在代码中设置一个早上 7:00 的闹钟,并带有“煮咖啡”的描述。因此,当用户退出我的程序时,如果他们进入 iPho
我必须创建一个示例应用程序,其中当我单击一个按钮时,应该打开 native 闹钟,以便用户可以使用它来设置闹钟? 最佳答案 对于默认应用程序 MobileClock.app 存在多个 url 方案。如
我的应用程序播放闹钟。在 Android 声音设置中,此声音由“铃声音量” slider 控制,而不是由“闹钟音量” slider 控制。如何更改由“闹钟音量”控制的声音? public void
我正在尝试构建一个闹钟,用户可以在其中选择闹钟必须响起的时间和工作日。为此,我使用了 setAlarmClock() ,因为即使设备进入打盹模式,警报也必须触发。 问题是,setAlarmClock(
我正在创建一个简单的时间选择器对话框,当用户设置时间时,我将该时间存储在日历实例中。 public void onTimeSet(TimePicker timePicker, int i, int
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
主要问题:如果我想在我的应用程序中为任务附加截止日期,我应该使用本地通知、警报或提醒吗?我希望他们在截止日期到来时即使应用程序未运行也能收到通知。 我找到了 this关于使用它说可以的 UILocal
我正在开发一个闹钟,它会按规定的时间间隔振动。因此,如果我选择 5 秒,应用程序将每隔 5 秒振动一次。但我需要停止、暂停和恢复应用程序。 这是我的课: public class AndroidAla
过去几天我一直在为 Android 构建自定义闹钟。到目前为止一切顺利,警报响起,我使用 HTTP 流播放一些远程声音(当然需要网络,否则,有本地声音的后备)。现在是时候将这个应用程序带到 iOS 上
有没有办法从我的应用程序访问和更新 iPhone 中的 native 闹钟设置?我需要一个根据一年中的时间变化的滑动闹钟,我想为此使用原生 iPhone 闹钟。这在 iOS SDK 中是否可行,例如,
我是一名优秀的程序员,十分优秀!