【问题标题】:Service of an app stops when phone is not being charged手机不充电时应用服务停止
【发布时间】:2013-02-17 18:07:47
【问题描述】:

我的活动通过调用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 显示调试信息,无论应用程序是否在后台。但是当我拔掉电话时,服务会在一段时间后停止运行。应用程序(启动服务的活动)处于活动状态时的事件。请注意,服务没有被破坏,只是被搁置,或者类似的东西。

因为当我再次插入手机时,计时器会继续,并且计数器的值会从我刚刚拔下手机时的值增加。因此,如果服务已被销毁,那么价值将再次为零。 (我也在调试服务的生命周期,看不到onStartCOmmand()onDestroy() 会被调用)

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

【问题讨论】:

    标签: android service background-process timertask


    【解决方案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,因为保持服务一直运行会耗尽电池并浪费系统资源。

    【讨论】:

    • 我的问题与充电有关吗?那么拔掉电源时,系统会停止服务吗? (不是破坏)
    • 当手机使用电池运行时,系统可能会尝试保留资源。如果您的应用不听charge status,我看不到任何其他连接。
    • 那么我在哪里可以找到有关此服务状态的信息?没有被破坏,只是放在“空闲”中,如果应用程序在前台,它可能正在运行,我会测试它 - 如果是这样,它可能与进程连接,因为如果没有为服务
    • @laplasz: “所以拔掉电源后,系统会停止服务吗?” -- 不,CPU 断电(也就是设备进入睡眠模式)。
    • @CommonsWare 好的,我发现你的 answer 与睡眠模式有关
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    相关资源
    最近更新 更多