【问题标题】:How to make Android Service run even when the device is not awake?即使设备未唤醒,如何使 Android 服务运行?
【发布时间】:2010-05-21 22:38:34
【问题描述】:

我的应用程序目标是每隔 20 分钟保存一次位置更新。

我使用了服务,它工作正常,但是当我锁定屏幕或自动锁定时,服务停止运行。 当我解锁它时,服务再次运行。

突出显示我的代码:

服务()

onCreat(){
   call timer();
 }

timer(){
   code
 }

如何让我的代码在所有条件下始终运行?

【问题讨论】:

    标签: android android-service android-location


    【解决方案1】:

    是的,使用 AlarmManager 每 10 分钟启动一次服务,例如使用下面的 setRepeating。去掉服务中的计时器,让服务在 oncreate 或 onCommand 中运行任务开始完成。

        int SECS = 1000;
        int MINS = 60 * SECS;
        Calendar cal = Calendar.getInstance();
        Intent in = new Intent(context, YourService.class);
        PendingIntent pi = PendingIntent.getService(context, 0, in, PendingIntent.FLAG_UPDATE_CURRENT);
    
        AlarmManager alarms = (AlarmManager)context.getSystemService(
                Context.ALARM_SERVICE);
        alarms.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 
                10 * MINS, pi);
    

    您可以创建一个 Activity 以将该代码包含在从按钮启动服务的 onclick 处理程序中。如果您想在启动时运行,您需要将它放在广播接收器中,以便在设备启动时收到通知,但这本身就是另一个主题。

    设备休眠时服务和计时器不起作用的原因是 cpu 已关闭并且您的代码没有唤醒锁。 AlarmManager 会稍微唤醒 cpu 以运行您的服务。

    【讨论】:

      【解决方案2】:

      安排您的服务按计划完成工作(例如,“call timer()”)(包括唤醒设备)的正确方法是使用AlarmManager,可能与我的WakefulIntentService 一起使用或类似的东西。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多