Articles of wakelock

GCM-App真的需要唤醒锁吗?

我不太确定如何在GCM客户端文档中解释这句话: android.permission.WAKE_LOCK权限,以便应用程序可以在收到消息时使处理器无法hibernate。 可选 – 仅在应用程序希望防止设备hibernate时使用。 。 如果在将工作转换为服务时未保持唤醒锁定,则有效地允许设备在工作完成之前返回hibernate状态。 最终结果是应用程序可能无法完成处理GCM消息,直到将来某个任意点,这不是您想要的。 和 不要求使用WakefulBroadcastReceiver。 如果您有一个不需要服务的相对简单的应用程序,您可以在常规的BroadcastReceiver中拦截GCM消息并在那里进行处理。 我不太确定我的应用程序是否需要召唤唤醒锁(或者如果它需要服务)。 推送通知部分对应用程序非常重要,不应该延迟超过几分钟。 在接收所有数据之前,BroadcastReceiver是否有可能被暂停?

服务,WakeLock

在浏览Stackoverflow中关于WakefulIntentService的问题和答案后,我有点困惑。 我只想获得一些关于这个主题的知识,以确保我的理解是正确的,如果我错了,请随时纠正我。 我构建了一个小应用程序,我在那里使用后台Service ,每当用户摇动手机时都会继续播放音乐。 我在设备锁定并且屏幕关闭后进行了测试,并且按预期工作。 我从这个论坛听到的消息,一旦设备进入睡眠状态,服务可能会关闭。 真的吗? 在我的情况下,它总是有效,我错过了什么? WakeFulIntentService什么需要? 我们什么时候需要使用WakefulIntentService ? 我尝试在Service运行一个计时器,虽然设备已锁定,屏幕已关闭,我的计时器正在运行,我可以肯定地说。 因为我曾经在计时器跳闸时收到通知。

开发报警应用

我想开发一个报警应用程序。 应用程序应该像这样工作: 发动它 活动告诉我时间 我可以设置闹钟 我可以关闭申请 当闹钟时间到来时,它会启动一个活动(即使设备被锁定) 我已经尝试调整此示例https://github.com/commonsguy/cwac-wakeful但是在闹钟时间到来时我无法启动活动。 我使用此代码来设置警报(对于测试,我已将此代码插入onCreate活动方法): Intent intent = new Intent(this, OnAlarmReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0); Calendar cal = Calendar.getInstance(); cal.add(Calendar.SECOND, 10); AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE); alarm.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, cal.getTimeInMillis(), pendingIntent); 这是OnAlarmReceiver类: public class OnAlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.i(ClockActivity.LOG_TAG, “OnAlarmReceiver::onReceive”); WakefulIntentService.sendWakefulWork(context, AlarmService.class); […]

AlarmManager并不总是执行BroadcastReceiver

所以我有一个BroadcastReceiver和AlarmManager。 假设我像这样创建Pending Intents: Intent i; i = new Intent(context, MyReceiver.class); i.setAction(MyReceiver.ACTION_1); i.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); pendingIntent1 = PendingIntent.getBroadcast(context, 1, i, PendingIntent.FLAG_UPDATE_CURRENT); i = new Intent(context, MyReceiver.class); i.setAction(MyReceiver.ACTION_2); i.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); pendingIntent2 = PendingIntent.getBroadcast(context, 2, i, PendingIntent.FLAG_UPDATE_CURRENT); 并按如下方式安排警报: now = SystemClock.elapsedRealtime(); long time1 = now + 10 * 1000; long time2 = time1 + 60 * 1000; am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, time1, pendingIntent1); am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, […]

在Android上关闭屏幕

我试图在某个动作发生后打开和关闭显示器(让我们担心暂时关闭屏幕)。 根据我对唤醒锁的理解,这就是我所拥有的: PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, “My Tag”); 当我在stackoverflow上阅读其他post时,他们似乎告诉我PARTIAL_WAKE_LOCK将关闭屏幕。 但是,如果我阅读SDK,它会说它只允许屏幕关闭。 所以我认为这是不对的。 任何提示都会有所帮助! 谢谢, 麦克风

正确的模式,以获取BroadcastReceiver中的WakeLock并在服务中释放它

即使经过大量的研究,我仍然不能完全确定我如何实现一个由BroadcastReceiver启动的Service的WakeLock是正确的 – 即使它似乎工作正常。 广播接收器从警报发送到它的意图,所以从AlarmManager的API文档AlarmManager : 如果您的警报接收器调用了Context.startService(),则手机可能会在启动所请求的服务之前hibernate。 为防止这种情况发生,您的BroadcastReceiver和服务需要实施单独的唤醒锁定策略,以确保电话继续运行,直到服务可用。 所以,在onReceive()我这样做: Intent serviceIntent = new Intent(context, SomeService.class); context.startService(serviceIntent); if(SomeService.wakeLock == null) { PowerManager powerManager = (PowerManager)context.getSystemService(Context.POWER_SERVICE); SomeService.wakeLock = powerManager.newWakeLock( PowerManager.PARTIAL_WAKE_LOCK, SomeService.WAKE_LOCK_TAG); } if(! SomeService.wakeLock.isHeld()) { SomeService.wakeLock.acquire(); } 在我做的服务中: try { // Do some work } finally { if(wakeLock != null) { if(wakeLock.isHeld()) { wakeLock.release(); } wakeLock = null; […]

即使我正在发布它,WakeLock仍然保持错误

我有一个应该在后台运行的服务。 它在我的应用程序打开时启动,并在用户关闭我的应用程序时结束。 每当我的应用程序在后台或屏幕关闭时,我仍然需要运行该服务。 我用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(); } } […]

WakeLock在仍然举行时最终确定

pm和keepScreenOnvariables是全局定义的。 我在OnCreate方法中获取了PowerManager.WakeLock: pm = (PowerManager) getSystemService(Context.POWER_SERVICE); keepScreenOn = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_LOCK,”tpd”); 在我的onStart,onResume和onRestart中我抓住了锁 if (keepScreenOn == null) { keepScreenOn = pm.newakeLock(PowerManager,SCREEN_BRIGHT_LOCK,”tpd”); } keepScreenOn.acquire(); 在我的onDestroy,onPause和onStop中,我发布了锁定: if (keepScreenOn != null) { keepScreenOn.release(); keepScreenOn = null } 我的应用程序退出后,我得到一个失败的屏幕,adb抱怨 java.lang.Exception:WakeLock在仍然持有时完成:tpd 跟踪显示我在退出前释放了锁。 我错过了什么? 如果没有穿越onPause , onStop或onDestroy至少一个,就无法离开应用程序。 我可以看到应用程序调用release() ,因为它调用了acquire(),所以即使唤醒锁被引用计数,它仍然应该没有引用。

我怎样才能看到哪些唤醒锁是活跃的

出于某种原因,我的Android手机不会进入睡眠状态。 我认为唤醒锁是让它保持清醒,但没有办法分辨哪些唤醒锁是活跃的。 正在运行的服务没有列出任何可疑的东西,当然也没有什么不同。 所以我的问题是: 当进程结束时,Android肯定会发布唤醒锁吗? 有可能一个应用程序写得不好,并且在退出之前没有发布唤醒锁吗? 有没有办法看到活跃的唤醒锁? 这就是dumpsys power显示: $ dumpsys power Power Manager State: mIsPowered=true mPowerState=0 mScreenOffTime=226093 ms mPartialCount=0 mWakeLockState= mUserState= mPowerState= mLocks.gather= mNextTimeout=91922738 now=92136117 -213s from now mDimScreen=true mStayOnConditions=0 mScreenOffReason=3 mUserState=0 mBroadcastQueue={-1,-1,-1} mBroadcastWhy={0,0,0} mPokey=1 mPokeAwakeonSet=false mKeyboardVisible=false mUserActivityAllowed=false mKeylightDelay=6000 mDimDelay=47000 mScreenOffDelay=7000 mPreventScreenOn=false mScreenBrightnessOverride=-1 mButtonBrightnessOverride=-1 mScreenOffTimeoutSetting=60000 mMaximumScreenOffTimeout=2147483647 mLastScreenOnTime=0 mBroadcastWakeLock=UnsynchronizedWakeLock(mFlags=0x1 mCount=0 mHeld=false) mStayOnWhilePluggedInScreenDimLock=UnsynchronizedWakeLock(mFlags=0x6 mCount=0 mHeld=false) mStayOnWhilePluggedInPartialLock=UnsynchronizedWakeLock(mFlags=0x1 […]

Android – 在不触发睡眠/锁定屏幕的情况下关闭显示屏 – 使用触摸屏打开

我一直试图find一种关闭显示器的方法,并从用户触摸触摸屏唤醒。 该设备处于嵌入式环境中,其中设备是平板电脑,并且用户除了触摸屏之外不能访问任何东西(根本没有按钮)。 它连接到电源,所以电池不会有问题,但是当我检测到没有活动时我想要关闭屏幕,这样它就不会整天盯着它们,也不会缩短LCD背光的寿命。 我永久保持一个唤醒锁,并决定何时自己睡觉。 问题是,当我使用以下方式关闭屏幕时: WindowManager.LayoutParams params = getWindow().getAttributes(); params.screenBrightness = 0; getWindow().setAttributes(params); 活动暂停并停止。 并且该单元不会响应触摸来唤醒它。 您需要按电源按钮。 此时,“滑动解锁”显示出来。 我想关闭显示器,然后继续运行,这样我就可以检测到触摸屏事件并重新打开显示屏。 我也尝试将显示器调到0.1的亮度,这适用于某些设备,但我需要它的设备才能工作,只是“调暗”显示器。 我也试过这个: // First Remove my FULL wakelock //then aquire a partial wake lock (which should turn off the display) PowerManager.WakeLock wl = manager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, “Your Tag”); wl.acquire(); 但是此方法不会关闭显示屏。