Articles of wakelock

Android GPS跟踪和WakeLock

我需要在Android手机上进行背景GPS跟踪,我目前正计划有两种情况: 当手机连接到(车载)充电器时,可以获得频繁的GPS位置(每分钟)。 当手机未连接充电器时,每5-30分钟仅轮询一次,具体取决于电池受影响的程度。 我知道我需要在服务中实现跟踪,并且可能会显示通知以保持服务的活跃性。 但是,我认为手机可能随时进入睡眠模式,这将阻止GPS跟踪。 对于这些情况, 在没有电话进入睡眠状态且不耗尽太多电量的情况下, 连续背景GPS跟踪的最佳方法是什么? 到目前为止我收集了以下内容: 对于场景1,我可能需要获取一个WakeLock,并始终保持CPU唤醒(但屏幕可能会睡眠)。 MyTracks应用程序似乎在TrackRecordingService中执行此操作。 OpenGPSTracking似乎也是如此 。 对于方案2,我可以使用AlarmManager每隔x分钟安排一次检查。 我的服务需要获得一个临时的WakeLock,等待一个GPS位置,然后停止并再次释放WakeLock。 这两种方法(永久WakeLock vs AlarmManager)的功耗如何比较? 只检查每30分钟,GPS能否在合理的时间内收到准确的位置? StackOverflow上有一些相关的问题,但没有一个有令人满意的答案。 一些半有用的: 如何让应用程序在后台运行? 继续收集数据? (把我指向MyTracks) 在后台跟踪用户的短信和地理位置 – 我的想法有效吗? 始终在GPS上的Android服务

如何在android中通知需要WAKE_LOCK?

如何在下载图像和更新通知期间删除此错误。 java.lang.SecurityException:用户10080和当前进程都没有android.permission.WAKE_LOCK。 在android.os.Parcel.readException(Parcel.java:1425)的android.os.Parcel.readException(Parcel.java:1379)android.os.IPowerManager $ Stub $ Proxy.acquireWakeLock(IPowerManager.java:326)at at android.os.PowerManager $ WakeLock.acquireLocked(PowerManager.java:309)at android.os.PowerManager $ WakeLock.acquire(PowerManager.java:300)at android.app.NotificationManager.notify(NotificationManager.java:128)at android .app.NotificationManager.notify(NotificationManager.java:104)

唤醒+ Wifi锁无效

我的后台服务正在尽快向本地服务器发送消息。 每条消息通常需要大约30ms。 但是当手机处于睡眠模式时,需要大约400ms-1000ms(使用’正确’的Wifi政策关闭屏幕) 在我的服务中,我使用以下代码来获取Wifi锁和WakeLock。 PowerManager lPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); mWakeLock = lPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, “WakeLockTag”); WifiManager lWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR1) { mWifiLock = lWifiManager.createWifiLock(WifiManager.WIFI_MODE_FULL_HIGH_PERF, “LockTag”); } else { mWifiLock = lWifiManager.createWifiLock(WifiManager.WIFI_MODE_FULL, “LockTag”); } mWifiLock.acquire(); mWakeLock.acquire(); 是否有可能获得与屏幕开启时相同的性能?

如何使振动器无限期地从服务或接收器上运行

我需要通过以下方式提醒用户某些事件: 振动 通知 振动应无限期地保持开启,直到用户确认通知为止。 问题是当设备进入睡眠状态时振动停止。 我读过以下问题: 屏幕关闭时允许手机振动 即使在Android中屏幕进入睡眠模式后仍继续振动 上面提到的一个问题的答案是,没有模式的振动就可以解决问题。 所以我试过调用Vibrator.vibrate的版本,它接受毫秒而不是一个大数字的模式,但振动仍然停止。 其他答案建议在ACTION_SCREEN_OFF操作上注册接收器。 如果设备在警报开始后进入hibernate状态,这将允许我恢复振动,但如果设备已经睡眠则无法工作。 但是,如果我能够首先打开屏幕,然后注册接收器以处理可能从那里发生的任何屏幕关闭事件,我可以得到工作。 所以我在接收到触发事件之前尝试获取完整的唤醒锁定,然后开始声音或振动,但是尽管我使用了标志FULL_WAKE_LOCK和ACQUIRE_CAUSES_WAKEUP,它仍无效。 唤醒部分工作,但不久之后设备再次进入睡眠状态。 我想FULL_WAKE_LOCK标志不起作用,因为它已在API 17中弃用,但我的设备是运行4.1.2的三星,即API 16! 现在推荐的方法似乎是使用WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,但这应该从一个活动调用,除非用户点击通知,否则我没有任何屏幕,如果发生这种情况,声音和振动应该已经有了被拦了 所以它看起来像一个死胡同。 我还能尝试什么? 更新: 我没有运气保持屏幕始终打开唤醒锁,但另一方面,他们允许我打开屏幕,如果只有几秒钟。 我实际上不需要保持屏幕,所以我在Intent.ACTION_SCREEN_OFF动作上注册接收器,当屏幕熄灭时,接收器再次恢复振动。 这在三星上运行良好,但我现在已经切换到华为继续测试,接收器不起作用。 更新: 这是华为设备中exception的堆栈跟踪: java.util.NoSuchElementException: Death link does not exist at android.os.BinderProxy.unlinkToDeath(Native Method) at com.android.server.VibratorService.unlinkVibration(VibratorService.java:294) at com.android.server.VibratorService.removeVibrationLocked(VibratorService.java:284) at com.android.server.VibratorService.cancelVibrate(VibratorService.java:213) at android.os.IVibratorService$Stub.onTransact(IVibratorService.java:83) at android.os.Binder.execTransact(Binder.java:338) at dalvik.system.NativeStart.run(Native Method)

是否可以持有多个唤醒锁?

我正在开发一个扫描二维条形码的小型实用程序应用程序,然后将每个条形码提交给执行较长任务的IntentService。 显示活动时,应该阻止设备hibernate,直到在服务中处理条形码。 如果服务完成处理,它将自行停止,但活动仍应可见。 我想在活动生命周期中持有SCREEN_DIM_WAKE_LOCK WakeLock,但由于这种types不会阻止CPUhibernate,我还需要在扫描新的2D代码时在活动中获取PARTIAL_WAKE_LOCK,然后释放它在处理后的意图服务中。 SCREEN_DIM_WAKE_LOCK的目的是避免用户每隔几秒钟按下电源按钮以唤醒设备并能够读取新条形码的不便。 用户必须一个接一个地读取大量代码,并且即使在没有用户交互的短时间间隔内,活动也应该在周围。 我知道在Android中没有100%保证应用程序在顶部,未关闭或由于我的应用程序无法控制的几个条件而预见,但我想尽我所能。 那么可以持有多个WakeLocks吗? 他们在哪里可以宣布活动和服务都加入? (Singleton,扩展应用程序?)

Android – 唤醒锁无法正常获取,应用程序需要继续在待机状态下运行

在我的应用程序中,在主要活动的onCreate()方法中,我正在创建唤醒锁定,以便在手机进入待机/屏幕关闭时CPU将继续运行。 同样在onCreate方法中,我有意创建一个使用加速度计的服务。 当应用程序打开并监控加速度计值时,此服务需要持续运行(我知道这对电池不利,但我需要这样做)。 这是我目前的代码,服务开始很好。 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE); PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, “Howaya”); wl.acquire(); if (appStart == true) { Intent AccelService = new Intent(this, Accelerometer.class); AccelService.putExtra(“unreg”, false); startService(AccelService); } appStart = false; } 我的清单中设置了以下权限 – 我尝试过不同的锁 – 昏暗的屏幕和全亮度也无济于事。 我在logcat上的输出在这里 – F/PowerManager(15628): android.util.Log$TerribleFailure: WakeLock finalized while still held: […]

如果我没有开始服务或活动,我的广播接收器是否需要唤醒锁?

我有一个由警报调用的广播接收器(使用AlarmManager安排)。 在这个接收器中,我只是从数据库中查询寄存器,并启动通知。 我认为当从广播接收器启动服务或活动时需要唤醒锁定,但是,如果我只想显示通知(在通知面板中),是否需要唤醒锁定?

将应用程序带到前面,打开显示屏并从AlarmManager解锁?

当我设置的闹钟激活时,我想打开显示屏,解锁手机并将我的应用程序带到前面。 public class CountDownAlarm extends BroadcastReceiver { public CountDownAlarm(){ } public CountDownAlarm(Context context, int timeoutInSeconds){ AlarmManager alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(context, CountDownAlarm.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); Calendar time = Calendar.getInstance(); time.setTimeInMillis(System.currentTimeMillis()); time.add(Calendar.SECOND, timeoutInSeconds); alarmMgr.set(AlarmManager.RTC_WAKEUP, time.getTimeInMillis(), pendingIntent); } @Override public void onReceive(Context context, Intent intent) { PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE); […]

屏幕关闭时,前台服务未在Android 7.0+中接收位置更新

我正在尝试创建一个Android应用程序,在设备屏幕关闭时实时连续记录设备位置数据。 我的代码可以在Android 6.0及更早版本中正常运行,但似乎Android 7.0+破坏了我的应用程序。 我已经实现了一个使用唤醒锁的Android前台服务,并订阅了Google FusedLocation API。 关闭屏幕后,永远不会触发onLocationChanged回调。 有谁见过这个问题的解决方案? 我尝试通过Android设备设置为我的应用以及Google服务框架和融合位置禁用电池优化。 public class ForegroundLocationService extends Service implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener { private static final String TAG = ForegroundLocationService.class.getSimpleName(); // the notification id for the foreground notification public static final int GPS_NOTIFICATION = 1; // the interval in seconds that gps updates are requested private static final […]

StandBy喜欢活动

我想为我的设备创建一个StandBy活动,到目前为止,我创建了一个活动,在调用时将关闭我的显示。 代码如下: public class MainActivity extends Activity { private SensorManager mSensorManager; private PowerManager mPowerManager; private WindowManager mWindowManager; private WakeLock mWakeLock; private Button button; private TextView textView; /** Called when the activity is first created. */ @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); try { // Get an instance of the SensorManager mSensorManager = (SensorManager) […]