ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

android-手机未充电时,应用服务停止

2019-10-09 17:29:10  阅读:247  来源: 互联网

标签:timertask android service background-process


我的活动通过调用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),该服务将按预期工作.无论应用程序是否在后台运行,Logcat都会在大约每10秒显示一次调试信息.但是当我拔掉电话的电源后,该服务会在一段时间后停止运行.应用程序(启动服务的活动)处于活动状态时的事件.请注意,服务不会被破坏,只是被搁置,或类似的东西.

因为当我再次插入手机时,计时器继续运行,并且计数器的值从我刚刚拔下手机的位置开始增加.因此,如果服务已被破坏,则值将再次为零. (也调试了服务的生命周期,看不到onStartCOmmand()和onDestroy()会被调用)

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

解决方法:

如果您的服务必须在后台运行,则需要锁定

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,因为使服务始终保持运行状态将耗尽电池并浪费系统资源.

标签:timertask,android,service,background-process
来源: https://codeday.me/bug/20191009/1880811.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有