- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经为测试模式设置了 1 分钟的 AlarmManager。它向 OnAlarmReceiver 发送广播。OnAlarmReceiver 启动 sendWakefulWork(context, TaskService);在 TaskService 的 doWakefulWork() 方法中,我发送了触发通知的 sendOrderedBroadcast。这很好用 ^ 出现声音和振动通知。但只有当手机处于 Activity 模式时。当手机处于 sleep 模式(屏幕关闭)时,通知期间只有振动和闪光灯工作。 sleep 模式下通知没有声音,只有振动。有时它会发出声音,但只是有时会发出声音,例如每小时发出 1 次声音,但它应该每分钟发出声音。此外,当手机连接到电脑时,它在 sleep 模式下每分钟都会发出声音,但当我从电脑上拔下手机时,它只会开始振动。当我打开屏幕时,一切都变得正常:通知播放声音 + 振动。
所以我不知道是我的代码有问题还是我的手机 (HTC Desire Android 2.2) 有问题
我已经尝试了很多方法来修复它:
没有。只有声音在 sleep 模式下消失,振动效果完美。
public class OnBootReceiver extends BroadcastReceiver {
public static void setAlarm(Context ctxt) {
AlarmManager mgr = (AlarmManager) ctxt.getSystemService(Context.ALARM_SERVICE);
mgr.setRepeating(AlarmManager.RTC_WAKEUP,
System.currentTimeMillis()+1000,
1*60*1000,
getPendingIntent(ctxt));
}
public static void cancelAlarm(Context ctxt) {
AlarmManager mgr = (AlarmManager) ctxt.getSystemService(Context.ALARM_SERVICE);
mgr.cancel(getPendingIntent(ctxt));
}
private static PendingIntent getPendingIntent(Context ctxt) {
Intent i=new Intent(ctxt, OnAlarmReceiver.class);
return PendingIntent.getBroadcast(ctxt, 0, i, PendingIntent.FLAG_CANCEL_CURRENT);
}
@Override
public void onReceive(Context ctxt, Intent intent) {
setAlarm(ctxt);
}
}
我在 TaskService 类中的 doWakefulWork 方法:
protected void doWakefulWork(Intent intent) {
Intent mIntent = new Intent(EXERCISE_EVENT);
mIntent.putExtra(StringUtils.PARAM_NEXT_TASK_TIME, nextStringTime);
mIntent.putExtra(StringUtils.PARAM_TASK_NUMBER, taskNumber);
sendOrderedBroadcast(mIntent, null);
}
这是我的 NotificationBrodcastReceiver :
public class NotificationBrodcastReceiver extends android.content.BroadcastReceiver {
public void onReceive(Context ctx, Intent intent) {
String ns = Context.NOTIFICATION_SERVICE;
NotificationManager mNotificationManager = (NotificationManager) ctx.getSystemService(ns);
int icon = R.drawable.notif_icon;
CharSequence tickerText = ctx.getResources().getString(R.string.notification_ticker);
long when = System.currentTimeMillis();
Notification notification = new Notification(icon, tickerText, when);
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notification.defaults |= Notification.DEFAULT_SOUND;
notification.defaults |= Notification.DEFAULT_VIBRATE;
Intent notificationIntent = new Intent(ctx, MainActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(ctx, 0, notificationIntent, 0);
notification.setLatestEventInfo(ctx, "contentTitle", "contentText", contentIntent);
mNotificationManager.notify(NOTIFICATION_ID, notification);
}
}
最佳答案
您正在使用有序广播来发出您的通知
。据推测,您这样做是因为如果 Activity 在前台并且对该广播具有更高优先级的 BroadcastReceiver
,则您希望该 Activity 处理请求。
该模式适用于非清醒情况。然而,一旦 doWakefulWork()
结束,没有任何东西可以让设备保持唤醒状态,因此设备将重新进入休眠状态。您订购的 Broadcast
是异步发生的,因此它的工作将在 doWakefulWork()
结束后发生,因此您的 Notification
可能根本不会发生。如果 Notification
部分发生,正如你所描述的,我个人认为这种行为是 Android 中的一个错误(它应该拥有自己的 WakeLock
以便回放铃声),但是您的 BroadcastReceiver
完全有可能根本无法获得控制权,因为设备在广播传送之前就睡着了。
你的 hold-a-WakeLock
-for-two-seconds 解决方法将增加成功的几率,但也不能保证。确保您有机会发出 Notification
的唯一保证方法是:
在 doWakefulWork()
中完成这项工作,或者
保持 WakeLock
直到广播完成并引发 Notification
。
我会在未来为 WakefulIntentService
框架添加额外的功能,以更好地处理您的场景,因为您似乎想做的事情是合理的,并且有一个共同点会很好模式的实现。但是,您尝试做的事情绝对超出了 WakefulIntentService
的当前范围。
关于android - 唤醒 IntentService 在 sleep 模式下工作不完整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11478824/
我正在阅读雷姆齐教授的OSTEP书 http://pages.cs.wisc.edu/~remzi/OSTEP/ 我只能部分理解以下代码如何导致唤醒/等待竞态条件。(该代码摘自书籍一章。 http:/
我目前正在构建一个应用程序,如果我的 android 手机处于锁定状态,我想在收到任何通知时避免屏幕亮起。 我正在尝试找到解决方案,但我找不到任何方法。 我在 switch.setOnCheckedC
有没有办法以编程方式进入 BIOS 并为支持 LAN 唤醒功能的机器打开该功能? 理想情况下,解决方案应该是跨 BIOS,但使用单独的解决方案来打击每个主要供应商也是可以的。 最佳答案 BIOS 配置
我有大量的 Azure 数据库,目前有 6 个,但随着时间的推移,这个数量将会增加。 数据库的访问频率很低,因此为了节省成本,它们被设置为 1 小时后自动休眠。 我需要在 Access 中连接到一个或
我有一个已纳入消费计划的现有 Azure Function 我正在编写另一个函数来调用它 现有函数运行后,它会处理存储帐户中的文件。 为了处理我的存储帐户中的文件,我们必须手动进入门户并通过导航“唤醒
我有一个已纳入消费计划的现有 Azure Function 我正在编写另一个函数来调用它 现有函数运行后,它会处理存储帐户中的文件。 为了处理我的存储帐户中的文件,我们必须手动进入门户并通过导航“唤醒
我想使用方法 wakeUp电源管理器。Eclipse (ADT) 不调整此方法。但是对面的“goToSleep”就没有问题了: PowerManager pm = (PowerManager) MyA
我有以下线程池。 #include #include #include #include #include #include #include // remove me (only fo
我写了一个Java程序,它分析其他程序。执行可能需要很长时间(=几天)。现在(三天后),我遇到了问题,我的程序/进程正在 sleep (S)。它仍然分配了 50% 的内存,有时会打印新的输出,但 to
我有一个很简单的问题。 我们使用 BackgroundAgents( Periodic agents ) 来执行一些后台任务,这些任务需要 WiFi(Internet) 连接才能执行 HttpWebR
我读了一些其他帖子,但没有找到我正在寻找的确切答案,所以我希望有人能给出一些澄清。 我有一个程序会运行一段时间。我有一些在后台运行的线程来执行各种任务,为了简单起见,让我们想想 3 个线程。 Thre
我的后台服务正在尽快将消息发送到本地服务器。每条消息通常需要大约 30 毫秒。但是,当手机处于 sleep 模式时,大约需要 400 毫秒到 1000 毫秒(使用“正确”的 Wifi 策略关闭屏幕)
嘿,我需要在某个时间唤醒我正在 sleep 的 Android 设备。有什么建议吗? 附:唤醒:打开显示屏并可能解锁手机 最佳答案 唤醒屏幕: PowerManager pm = (PowerMana
我们有一个用 C# 编写的 Windows 服务。该服务会生成一个执行此操作的线程: private void ThreadWorkerFunction() { while(false == _s
在scala中,我如何告诉线程: sleep t秒钟,或直到收到消息?也就是说,最多只能睡t秒钟,但是如果t尚未结束,您会醒来,并且您会收到一条特定的消息。 最佳答案 或者,您可以使用条件变量。 va
我发现我们可以在 Awake() 或 Start() 中初始化变量,并且 Awake() 将在 之前调用开始()。 我们应该什么时候在Awake和Start中进行初始化才能获得最佳性能? 最佳答案 通
在 Windows Azure 辅助角色中处理“紧急”消息的最佳方式是什么? 我有一个启动的辅助角色,执行无限 while(true) 循环,并在此循环中: 读取队列中是否有消息 处理它们并删除它们
你好,我已经调试了我的代码一整天,但我就是看不出哪里可能出错。 我在主线程上使用 SerialPortEventListener,在工作线程中我有一个与服务器通信的客户端套接字。由于此工作线程到达re
我想知道线程何时从某个条件中唤醒我在消费者线程上有这样的东西 while(true) { std::unique_lock gu
我希望这个问题适合 SE,但如果不适合,请告诉我可以将其移动到哪里,我会很乐意这样做。我目前正在构建一个 iOS 应用程序,需要在发出“匹配预订请求”时唤醒设备/中断当前应用程序,我正在寻找的行为类似
我是一名优秀的程序员,十分优秀!