当手机锁屏时,Android服务停止工作。

7
我有一个应用程序,它启动了一个服务。该服务具有计时器并每30秒弹出一次通知。我注意到以下行为:
  • 如果屏幕开着,通知会正常显示(即使应用在后台)
  • 如果屏幕关闭(通过电源按钮或自动关闭),则通知不会显示
  • 如果屏幕关闭但我正在运行调试,则通知会出现
如何使服务在屏幕关闭时运行。
(实际应用程序仅检查是否应检查通知,每30秒钟进行一次检查,但出于测试目的,上述场景是可以的)
谢谢!
3个回答

5

我曾经也遇到过同样的问题。

你可以使用WakeLock来解决这个问题!就像这样:

PowerManager pm = (PowerManager)getApplicationContext().getSystemService(
          getApplicationContext().POWER_SERVICE);
WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
wl.acquire();

然后使用这个:
wl.release();

释放唤醒锁。
不要忘记在清单文件中添加:

<uses-permission android:name="android.permission.WAKE_LOCK" />


2
不要使用它,因为这会无谓地耗费电池。相反,请按照另一个答案中所示使用AlarmManager。 - Marius
@Marius,我们可以使用AlarmManager每30秒唤醒吗? - aF.
1
是的,只需将PendingIntent设置为(例如)启动服务,然后让AlarmManager每30秒重复一次即可。 - Marius

1

不要这样做。这会很快耗尽手机的电池。如果手机正在睡眠,请让它保持睡眠状态,除非你有一个好的理由不这样做(在这种情况下,你可以使用AlarmManager在未来进行一次唤醒调用)。

我不知道你想要实现什么,但你需要使用完全不同的方法。例如,网络触发可能是一个好主意,假设你可以接受你的应用程序只支持2.2+。


@EdoMike 我正在使用以下代码: Context c = getApplicationContext(); AlarmManager alarm = (AlarmManager) c.getSystemService(Context.ALARM_SERVICE); Intent i = new Intent(c, AlarmProxy.class); PendingIntent sender = PendingIntent.getBroadcast(c, 0, i, PendingIntent.FLAG_CANCEL_CURRENT); alarm.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 0, 10000, sender); registerReceiver(alarmBroadcast, new IntentFilter(Intent.ACTION_TIME_TICK)); 但是定时器并没有每10秒钟调用一次,我该怎么做? - Viktor Apoyan

1
如果您确实希望在设备锁定时每30秒运行服务,那么您必须使用类型为ELAPSED_REALTIME_WAKEUP的闹钟来安排。但请注意,这肯定会迅速耗尽设备的电池!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接