博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
定义一个健壮的Android Service (IntentService)类
阅读量:6257 次
发布时间:2019-06-22

本文共 1733 字,大约阅读时间需要 5 分钟。

hot3.png

    我们的app经常会包含一些继承自Service或者IntentService的类。这些类的经常会用来处理系统或者app自身产生的一些Intent事件。

    这是一种很方便的事件驱动模型。这里我定义了一个IntentService的子类。这个类用来接收一个由AlarmManager产生的定时事件。这个类工作的很好。直到有一天,我很惊讶的发现这个类有的时候会很诡异的不工作,或者刚开始进入处理逻辑就退出了。于是就花了一些时间去定位和寻找原因。现在原因已经基本清楚了。

    先上一段代码:

    

public class EventService extends IntentService {    private static final String TAG = "EventService";    private PowerManager.WakeLock wl;    public SchedulerEventService(String name) {        super(name);    }    public SchedulerEventService() {        super(TAG);    }    @Override    public void onCreate() {        Log.d(TAG, " EventService onCreate.");        super.onCreate();        PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);        wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "EventService");        wl.acquire();    }    @Override    public void onDestroy() {        Log.d(TAG, " EventService onDestroy.");        super.onDestroy();        wl.release();    }        @Override    public int onStartCommand(Intent intent, int flags, int startId) {        super.onStartCommand(intent, flags, startId);        return (START_REDELIVER_INTENT);    }    @Override    protected void onHandleIntent(Intent intent) {        Log.d(TAG, "event received at: " + new Date().toString());        if (intent != null) {                        executeTask();        }    }}
    

    当我的测试手机在玩一个游戏的时候,问题出来了。这个EventService在开始真正执行任务的时候:executeTask,诡异的退出来了。

    最终发现了问题:当游戏的前台运行的时候,非常耗费内存。当我的APP在后台试图启动EventService的时候因为内存吃紧,被Android 系统杀死了。

    这里有几个链接也说明了类似问题:

    

    

    

    解决的一个办法是对OnStartCommand方法的Override。当这个方法返回

START_REDELIVER_INTENT

    的时候,系统重新启动service之后会把最后一个intent重新再传递给我们的service来处理。

    如果碰到这种service被系统杀死的情况,通过这种方式可以给service一个机会重新再把最后一次没做的事情做完。

转载于:https://my.oschina.net/u/145002/blog/123874

你可能感兴趣的文章
Struts(二十八):自定义拦截器
查看>>
安装Jenkins getting started卡住
查看>>
金软PDF转换(x-PDFConper)
查看>>
喵哈哈村的魔法考试 Round #15 (Div.2) 题解
查看>>
使用架构(XSD)验证XML文件
查看>>
Android开发之httpclient文件上传实现
查看>>
极客头条使用心得
查看>>
CSS解决无空格太长的字母,数字不会自己主动换行的问题
查看>>
日志打印longging模块(控制台和文件同时输出)
查看>>
这些年我们一起搞过的持续集成~Jenkins+Perl and Shell script
查看>>
php新版本号废弃 preg_replace /e 修饰符
查看>>
Android:Unable to resolve target ‘android-8’问题解决
查看>>
cocos2D(七)---- CCScene
查看>>
【DeepLearning】汉字手写体识别
查看>>
2017年中国大学生程序设计竞赛-中南地区赛暨第八届湘潭市大学生计算机程序设计大赛题解&源码(A.高斯消元,D,模拟,E,前缀和,F,LCS,H,Prim算法,I,胡搞,J,树状数组)...
查看>>
PostgreSQL 10首个测试版本发布
查看>>
ORACLE拼日期
查看>>
使用eclipse创建android项目的时候为什么会生成两个项目
查看>>
常见内存错误的几点总结
查看>>
Extjs的各版本下载
查看>>