首页 文章

当手机未充电时,应用程序的服务将停止

提问于
浏览
1

我的活动通过调用 startservice() 启动服务 . 为了简化我的问题,可以说服务将是一个计数器,计数器将每10秒增加一次 .

Timer t_counter;
int counter = 0; 

@Override   
public int onStartCommand(Intent intent, int flags, int startId) {

    t_counter = new Timer();
    t_counter.schedule(new TimerTask() { 
        @Override
        public void run() {
            counter++;
            Log.d("counter: ",Integer.toString(counter));
        }}, 0, 10000);

    return Service.START_STICKY;
}

当手机正在充电时(或者在调试模式下 - 因为我可以看到 Logcat ),该服务按预期工作 . 大约每10秒 Logcat 显示调试信息,只要应用程序处于后台或不是 . 但是当我拔掉电话时,服务会在一段时间后停止运行 . 应用程序(启动服务的活动)处于活动状态时的事件 . 请注意,服务未被销毁,只是暂停,或类似的东西 .

因为当我再次插入移动设备时,计时器继续,计数器的值从我刚拔掉电话的值开始增加 . 因此,如果服务已被销毁,那么 Value 将再次为零 . (我也调试了服务的生命周期,看不到 onStartCOmmand()onDestroy() 会被调用)

我已经搜索了它的解决方案,但我认为我没有这个行为的正确答案 . 我知道我应该使用AlarmManager而不是Timer . 或者它也可以工作,如果我把服务foregroundstartForeground() ,或者可能单独的process将解决这个问题 . 但我想知道为什么我的解决方案与充电一起工作 . 另外,我在哪里可以找到有关此服务状态的信息 . (不执行计时器计划,但没有销毁)谢谢!

1 回答

  • 1

    如果您的服务必须在后台运行,则需要保留 lock

    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    PowerManager.WakeLock wl = 
                          pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag");
    wl.acquire();
    // when you done
    wl.release();
    

    更好的方法是使用 AlarmManager 因为保持服务一直运行会耗尽电池并浪费系统资源 .

相关问题