一.今天做基站信息,整了整個上午,不論是用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()進去!