- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个闹钟应用程序,用户联系我说他的闹钟有时会延迟。我尝试了不同的方法和理论,最后建议用户使用默认的 Android 闹钟作为备份。
通常闹钟会延迟大约一个小时,但上次我的闹钟是在 Android 的一个明确建议之后启动的,该设备处于 sleep 状态并被 Android 的闹钟唤醒,让我的也“继续启动”。
编辑:由于我已经修改了一些类并且已经收到来自新版本的日志,所以我正在更改下面的类和日志信息。
这是我正在使用的 CountedWakeLock 类 - 我创建了自己的 HandlerThread 来处理唤醒锁的延迟释放,以检查这是否会影响启动问题。它没有解决问题,但在日志中产生了有趣的信息(如下)。
public class CountedWakeLock {
private static long TIMEOUT_DEFAULT = DateUtils.MINUTE_IN_MILLIS * 3;
private static WakeLock sWakeLock = null;
private static int sLockCount;
private static class TimeoutReleaseThread extends HandlerThread {
static TimeoutReleaseThread mInstance = null;
Handler mHandler;
private Runnable mReleaseRunnable;
public static TimeoutReleaseThread instance() {
if (mInstance == null) mInstance = new TimeoutReleaseThread();
return mInstance;
}
public TimeoutReleaseThread() {
super("TimeoutReleaseThread HandlerThread");
start();
mHandler = createHandler();
mReleaseRunnable = new Runnable() {
@Override
public void run() {
Utils.log("TimeoutReleaseThread release lock");
releaseLock();
}
};
}
private synchronized Handler createHandler() {
return new Handler(getLooper());
}
public synchronized void postRelease(long timeout) {
mHandler.removeCallbacks(mReleaseRunnable);
mHandler.postDelayed(mReleaseRunnable, timeout);
}
}
public synchronized static void acquireLock(Context context) {
acquireLock(context, TIMEOUT_DEFAULT);
}
public synchronized static void acquireLock(Context context, long timeout) {
if (sWakeLock == null) {
Utils.log("WakeLock creating");
PowerManager pm = (PowerManager) context.getApplicationContext()
.getSystemService(Context.POWER_SERVICE);
sWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
"AlarmReceiver lock");
sWakeLock.setReferenceCounted(false);
sLockCount = 0;
} else if (sWakeLock.isHeld())
Utils.log("WakeLock held already");
else
Utils.log("WakeLock not held");
Utils.log("WakeLock acquiring for " + timeout);
sLockCount++;
sWakeLock.acquire();
TimeoutReleaseThread.instance().postRelease(timeout);
}
public synchronized static void releaseLock() {
Utils.log("WakeLock releasing");
if (sWakeLock == null) {
Utils.log("WakeLock==null");
} else if (!sWakeLock.isHeld()) {
Utils.log("WakeLock not held");
sWakeLock = null;
sLockCount = 0;
} else {
sLockCount--;
if (sLockCount <= 0) {
Utils.log("WakeLock released");
sWakeLock.release();
sWakeLock = null;
if (sLockCount != 0) Utils.log("lockcount=" + sLockCount);
}
}
}
}
AlarmReceiver BroadcastReceiver - 它正在接收来自 AlarmManager 的 Intent
public void onReceive(Context context, Intent intent) {
Logger.initialize(context, "AlarmReceiver");
if (CALL_IS_ON) {
//set another alarm with AlarmManager to start after 5 seconds
//doesn't happen in this situation
} else {
Utils.log("sending START ALARM");
CountedWakeLock.acquireLock(context);
Intent i = new Intent();
i.setAction(StartAlarmReceiver.ACTION_START_ALARM);
i.putExtras(intent.getExtras());
context.sendOrderedBroadcast(i, null); //it is ordered, so eventual previous Alarm Activities etc. can be stopped
Utils.log("START ALARM send");
}
}
启动警报接收器。它实际上是在启动Alarm Activity
public void onReceive(Context context, Intent intent) {
Logger.initialize(context, "StartAlarmReceiver");
Intent i = new Intent(context, AlarmOnScreen.class);
Bundle extras = intent.getExtras();
i.putExtras(extras);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
Utils.log("AlarmActivity started");
}
更新日志:
504. 27/3 5:0:0 - logger initialized again from AlarmReceiver
505. 27/3 5:0:0 - sending START ALARM
506. 27/3 5:0:0 - WakeLock creating
507. 27/3 5:0:0 - WakeLock acquiring for 180000
508. 27/3 5:0:0 - START ALARM send
509. 27/3 5:0:0 - logger initialized again from StartAlarmReceiver
510. 27/3 5:0:0 - AlarmActivity started
511. 27/3 5:0:0 - Main start
512. 27/3 5:0:1 - Main resume
513. 27/3 5:0:1 - Main pause
514. 27/3 5:0:5 - Main stop
515. 27/3 5:3:0 - TimeoutReleaseThread release lock
516. 27/3 5:3:0 - WakeLock releasing
517. 27/3 5:3:0 - WakeLock released
518. 27/3 6:46:18 - logger initialized again from AlarmOnScreen create //user said he unlocked phone then to check the time...
现在从日志来看,我相信 WakeLock 确实在工作 - 毕竟 CPU 一定已经在运行,如果 TimeoutReleaseThread 能够完成工作。
问题是为什么 AlarmOnScreen Activity 没有启动??为什么 Main Activity(第 511-514 行)已启动?最近我让 AlarmOnScreen 在 list 中设置了 singleTask 模式。这可能是导致问题的原因吗?但为什么?由于其他一些原因,我需要这个 singleTask...
设备是 GT-S5830i,Android 2.3.6。
最佳答案
我仍然不知道是什么导致了这个问题,但是如果有人遇到过类似的问题 - 经过多次测试,这只是一个简单的更改 - 在 StartAlarmReceiver 中向 Intent 添加 Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED。
原来如此
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
有用吗?是的,它确实。到目前为止,它没有在其他手机上造成任何问题。
有意义吗?不,一点也不。
关于android - 带有 PARTIAL_WAKE_LOCK 的唤醒锁不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15612544/
我正在阅读雷姆齐教授的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 应用程序,需要在发出“匹配预订请求”时唤醒设备/中断当前应用程序,我正在寻找的行为类似
我是一名优秀的程序员,十分优秀!