我对wakelock有疑问.在下面显示的情况下,Android操作系统是否释放唤醒锁(PARTIAL_WAKE_LOCK如果您需要指定)以防止获取唤醒锁并且在关闭电源(不睡眠)之前浪费电池.
案例1-a:
App已经在其中一个线程中获得了wakelock(没有超时选项)(在这种情况下请认为这是合理的)并且它被设计为在关键任务完成时释放唤醒锁.应用程序可以被taskmanager或臭名昭着的taskkiller杀死,应用程序没有机会让它的线程释放唤醒锁.那个唤醒锁会发生什么?
案例1-b :(
如果对案例1-a的回答是"是的,请不要担心",那么请忽略这种情况.)与案例1-a相同但应用程序给予唤醒锁的超时选项,比如3秒.此超时选项是否保持有效?
案例2-a:
请想象一下,有一项服务由AlarmManager启动(通过广播接收器),并且该服务已获得唤醒锁(没有超时选项).此服务旨在使唤醒锁获取时间最小化.但不幸的是,由于内存紧缩,Android操作系统选择了这项服务.(我不知道当获得唤醒锁时操作系统是否不会终止服务,但我猜操作系统并不关心.但我希望操作系统稍后会发布唤醒锁.)那个唤醒锁会发生什么?
案例2-b :(
如果对案例2-a的回答是"是的,请不要担心",那么请忽略这种情况.)与案例2-a相同但是服务给了唤醒锁的超时选项,比如3秒.此超时选项是否保持有效?
android kill-process android-source android-wake-lock wakelock
应用程序描述: 该应用程序旨在作为特定客户端的安全程序(不公开部署).当应用程序在一段时间内未检测到移动时,如果应用程序处于后台或设备处于睡眠状态,应用程序应发出警报并将其置于前台.
问题: 如果设备处于睡眠状态并处于锁定状态,我们需要唤醒并解锁设备.使用SO和其他地方的各种技术,我们已经能够(部分地)唤醒和解锁设备,但是当设备物理插入计算机时,这只能正常运行.如果设备本身没有插上电源,我们测试了唤醒 - 解锁,没有任何反应; 设备似乎仍然处于睡眠状态,应用程序似乎什么都不做(没有警报).
我使用过这篇文章关于使用PowerManager和KeyguardManager,这篇文章使用了窗口标志.
这是目前用于唤醒设备的代码:
public void wakeDevice() {
PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
wakeLock = powerManager.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "TAG");
wakeLock.acquire();
KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
KeyguardLock keyguardLock = keyguardManager.newKeyguardLock("TAG");
keyguardLock.disableKeyguard();
runOnUiThread(new Runnable(){
public void run(){
getWindow().addFlags(
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
}
});
}
Run Code Online (Sandbox Code Playgroud)
从我看到/使用过的其他一些SO问题的评论和帖子中,似乎PowerManager/KeyguardManager代码应该已经完成了这个技巧.同样,正如我之前所说的,它在技术上工作,而设备通过USB插入到开发机器,但在设备分离时绝对没有任何作用.
另请注意,这是我们的第一个Android应用程序,所以我们完全清楚我们可能会完全关注我们正在尝试做的事情.欢迎任何建议.
所以简而言之,鉴于上面的代码,为什么设备根据它是否插入而表现得如此不同,以及为了唤醒和解锁设备,我们应该改变什么?提前感谢您的帮助!
我们目前正在开发一款适用于健身追踪应用的Android应用.它在后台不断运行,并且在大多数设备上运行良好,但我们一直在使应用程序在某些三星设备上完全死机.经过一番调查,似乎有些三星设备有一个完全自定义的"应用优化"功能(http://forums.androidcentral.com/samsung-galaxy-s6/599408-app-optimisation-after-updating.html),基本上是Doze功能的(非常)原始版本,存在于Android的更高版本中,如果它们三天没有被使用,它们基本上只是谋杀应用程序.
由于此应用程序或多或少仅执行日志记录,并且未打开活动,因此对我们来说存在很大问题,因为此功能已在许多三星设备上预先启用.通过使用前台服务解决了这个问题,但这是一个解决方案的大锤,需要通过持续通知来扰乱用户,而且我们真的不需要应用程序处于前台 - 我们对正常的电源没问题管理Android.
三星应用程序优化功能明确指出,如果应用程序未使用三天,它将"优化"应用程序.有没有人了解三星认为"被使用"的东西,我能以某种方式触发吗?
侧面咆哮:在我看来,这是一个糟糕的实现功能,使Android上的开发更具敌意.除了我们的用例,它将会破坏任何信使应用程序.如果不是因为Facebook Messenger和Whatsapp很难被豁免应用,那么用户就会疯狂,因为这会破坏他们的体验.
android android-service android-alarms android-wake-lock samsung-touchwiz
我正在开发一个在后台运行的Android应用程序,并支持蓝牙配件.我想在后台不断听取蓝牙设备尝试打开手机插座.我的问题是,是否有可能在不经常保留部分唤醒锁的情况下实现这一点,因为这显然会产生严重的电池后果.所以我想知道的是蓝牙对手机入睡的影响.打开蓝牙插座时手机是否保持清醒状态?如果设备尝试连接,蓝牙芯片是否会自动唤醒Android?我试图做一些测试来回答这些问题,但是很难找出唤醒锁发生的事情.另外,我不知道我是否可以依赖于我观察到的行为或者是否可以在其他设备上进行更改.
我一直在用androids新的espresso框架编写测试,并发现它运行良好.一个烦人的事情(特别是浓缩咖啡)是我必须确保我的屏幕醒来并解锁以便运行测试.我找到了一种解决方法(通过各种来源),但我不确定整合它的最佳方法.
所以这就是我所做的,在我的"Home"活动中,我有以下代码:
Home.class:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/************ Put this in a conditional for a test version ***********/
KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
KeyguardManager.KeyguardLock keyguardLock = km.newKeyguardLock("TAG");
keyguardLock.disableKeyguard();
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
}
Run Code Online (Sandbox Code Playgroud)
您还需要添加以下权限:
<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
Run Code Online (Sandbox Code Playgroud)
所以在这样做之后,我的测试现在唤醒我的手机运行所以我没有必须站岗并确保屏幕在测试开始之前没有关闭.
我宁愿不在我的应用程序中包含这些权限.我知道使用gradle可以制作具有自己的android清单的不同"风味",它将合并到主清单中.我正在考虑使用它,但我不想仅仅因为这个已经使用测试构建类型来运行而添加了一种风味.从android gradle文档看起来,您无法为instrumentTest目录创建AndroidManifest,因为它将自动生成.
但是,我想知道是否有另一种方法可以在不创建变量的情况下执行此操作,然后指定测试应该运行该变体.此外,我不确定所有这些的确切语法,并认为只是为了其他人在网站上有这些信息会很好,因为它似乎分散了.
最后,如果有人知道更好的方法来解决唤醒手机测试的问题,我很乐意听到它,因为我不是这种方式的忠实粉丝,我正在尝试.
我有一个应该在后台运行的服务.它在我的应用程序打开时启动,并在用户关闭我的应用程序时结束.
每当我的应用程序在后台或屏幕关闭时,我仍然需要运行该服务.
我用WakeLock实现了这一点,但由于某种原因我在标题中得到了错误.
这是令人担忧的,因为我可能是内存泄漏了WakeLock(如果我理解正确的话).
我可以通过重新启动我的应用程序来触发错误.
这是相关代码:
public class SomeService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
PowerManager manager = (PowerManager) getSystemService(POWER_SERVICE);
mWakeLock = manager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "TAG");
if (!mWakeLock.isHeld()) mWakeLock.acquire();
//Handle other processing
return START_STICKY;
}
@Override
public void onDestroy() {
if (mWakeLock.isHeld()) mWakeLock.release();
super.onDestroy();
}
}
Run Code Online (Sandbox Code Playgroud)
我很困惑,因为onDestroy()我发布了WakeLock.我不确定是什么触发了这个错误.
我希望我的应用能够打开屏幕并显示我的应用程序.假设我正在设置闹钟,每小时我都希望我的应用在设备自然睡眠前显示2分钟.
我看到不推荐使用WakeLock(FULL_LOCK)和KeyguardManager.
我创建了一个WakefulBroadcastReceiver和服务,这些都在工作.
@Override
protected void onHandleIntent(Intent intent) {
// I need to show the screen here!
for (int i=0; i<5; i++) {
Log.i("SimpleWakefulReceiver", "Running service " + (i + 1)
+ "/5 @ " + SystemClock.elapsedRealtime());
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
}
}
Log.i("SimpleWakefulReceiver", "Completed service @ " +
SystemClock.elapsedRealtime());
SimpleWakefulReceiver.completeWakefulIntent(intent);
}
Run Code Online (Sandbox Code Playgroud)
如何以编程方式打开屏幕,过去锁定并从IntentService显示我的活动?
谢谢
我试图在某个动作发生后打开和关闭显示器(让我们担心暂时关闭屏幕).根据我对唤醒锁的理解,这就是我所拥有的:
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag");
Run Code Online (Sandbox Code Playgroud)
当我在stackoverflow上阅读其他帖子时,他们似乎告诉我PARTIAL_WAKE_LOCK将关闭屏幕.但是,如果我阅读SDK,它会说它只允许屏幕关闭.所以我觉得这不对.
任何提示都会有所帮助!谢谢,
麦克风
成功设备root后.现在,我需要使设备始终处于唤醒状态,即始终可见UI,无黑屏或任何白日梦屏幕.为此,我想我要完成以下事项:
我发现的是关于应用层的所有内容,即有一些应用程序可以执行上述任务.但是,由于我的移动设备是根植的,我想用系统文件实现,这样即使其他一些应用程序试图改变上述功能,他们也应该不能这样做.
我有一些活动,其中一些Handlers正在以不超过5分钟的间隔执行.活动从a启动BroadcastReceiver并可以在屏幕关闭时启动等待用户抓取电话并获取用户输入,当发生这种情况时,onPause()调用活动以确保CPU处于睡眠模式.我没有将活动设置为打开屏幕,因为我想尽可能多地保存电池.
我已经用我的手机对它进行了测试并且工作得很好,而屏幕关闭时都会Handlers执行所有必须运行的代码.如果我在活动打开时打开和关闭屏幕,一切正常.
现在,我已经到处读到,当屏幕关闭且CPU休眠时,某些设备无法按预期工作,大多数时候都使用加速度计.现在我的问题是,我是否需要获取一个WakeLock所以当我的活动打开时CPU不会睡觉?我真的想知道这一点,因为正如我之前所说,我不想通过购买昂贵的东西来"浪费"电池WakeLock.
我更喜欢一个真正了解其工作原理的人的详细答案.
performance android battery android-wake-lock android-handler
android ×10
wakelock ×3
battery ×1
keyguard ×1
kill-process ×1
performance ×1
root ×1
service ×1