一.今天做基站信息,整了整个上午,不论是用context.stopService(service)还是service.this.stopself(),服务总是停不了,最后发现了问题根源,停止服务的时候一定要把其中有关的线程或监听器也停止掉!!!
1.比如在我的写入文件的Service中,存在这么个计时器
updateDataTask = new TimerTask(){
@Override
public void run() {
向文件中存数据
}
};
timer = new Timer();
timer.schedule(updateDataTask, 10*1000, 10*1000);
它每隔10秒钟就写入文件中一次,即使你调用了context.stopService(service),也调用了服务中的destory()函数,但是每隔十秒钟timer还是会请求,服务又自启了。
2.还比如在我的监听信号强度的Service中,一开始注册了监听函数
telMgr.listen(phoneLis, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
它是实时监听的,到最后服务中的destory()函数中一定要停止
telMgr.listen(phoneLis, PhoneStateListener.LISTEN_NONE);
3.在我的定位的Service中,起初private LocationClient mLocClient;
mLocClient = new LocationClient(getApplicationContext());
mLocClient.start();
最后服务中的destory()函数中一定要mLocClient.stop();
二.有关Timer
注意timer.cancel()执行后
Timer.cancel()不但结束当前schedule,连整个Timer的线程都会结束掉 所以不能再调用schedule 只能new一个新的再执行
三.无关界面时updateDataTask = new TimerTask(){
@Override
public void run() {
向文件中存数据
}
};
timer = new Timer();
timer.schedule(updateDataTask, 10*1000, 10*1000);
可以直接用,有关界面时一定要用handler和Runnable。Runnable里面写需要做的任务,在task里面用handler.post()进去!