我写了个小例子来测试Service的生命周期
通过主界面的一个button来启动servcie:
Intent intent = new Intent(LabAct.this, TaskService.class);
LabAct.this.startService(intent);
LogOut.out("Click Button and Start a Service:count=" + count++);
启动servcie后,就是隔一秒打印一次“Running count”,打印20次。现在我经常发现,比如我按4次按钮去startServcie,Service并不是真正的只运行4次,而是不可控的,运行过程中还会被突然中止,甚至隔一段时间后再次被启动,感觉很奇怪,求解 ...谢谢...楼下是打印出来的log
通过主界面的一个button来启动servcie:
Intent intent = new Intent(LabAct.this, TaskService.class);
LabAct.this.startService(intent);
LogOut.out("Click Button and Start a Service:count=" + count++);
启动servcie后,就是隔一秒打印一次“Running count”,打印20次。现在我经常发现,比如我按4次按钮去startServcie,Service并不是真正的只运行4次,而是不可控的,运行过程中还会被突然中止,甚至隔一段时间后再次被启动,感觉很奇怪,求解 ...谢谢...楼下是打印出来的log
10-26 11:43:33.980: DEBUG/[sodino](1385): Click Button and Start a Service:count=1
10-26 11:43:34.080: DEBUG/[sodino](1393): TaskService onCreate(): this.toString=lab.sodino.TaskService@43fe5660
10-26 11:43:34.080: DEBUG/[sodino](1393): TaskService.onStartCommand()
10-26 11:43:34.080: DEBUG/[sodino](1393): isRunning = false
10-26 11:43:34.080: DEBUG/[sodino](1393): Running:20 //第一次开始输出计时
10-26 11:43:35.091: DEBUG/[sodino](1393): Running:19
10-26 11:43:36.092: DEBUG/[sodino](1393): Running:18
10-26 11:43:37.090: DEBUG/[sodino](1393): Running:17
10-26 11:43:38.093: DEBUG/[sodino](1393): Running:16
10-26 11:43:39.094: DEBUG/[sodino](1393): Running:15
10-26 11:43:40.090: DEBUG/[sodino](1393): Running:14
10-26 11:43:41.095: DEBUG/[sodino](1393): Running:13
10-26 11:43:42.095: DEBUG/[sodino](1393): Running:12
10-26 11:43:43.091: DEBUG/[sodino](1393): Running:11
10-26 11:43:44.096: DEBUG/[sodino](1393): Running:10
10-26 11:43:45.097: DEBUG/[sodino](1393): Running:9
10-26 11:43:46.091: DEBUG/[sodino](1393): Running:8
10-26 11:43:46.370: DEBUG/[sodino](1385): Click Button and Start a Service:count=2
10-26 11:43:47.098: DEBUG/[sodino](1393): Running:7
10-26 11:43:48.098: DEBUG/[sodino](1393): Running:6
10-26 11:43:49.091: DEBUG/[sodino](1393): Running:5
10-26 11:43:50.091: DEBUG/[sodino](1393): Running:4
10-26 11:43:51.091: DEBUG/[sodino](1393): Running:3
10-26 11:43:52.050: DEBUG/[sodino](1385): Click Button and Start a Service:count=3
10-26 11:43:52.091: DEBUG/[sodino](1393): Running:2
10-26 11:43:53.100: DEBUG/[sodino](1393): Running:1
10-26 11:43:54.101: DEBUG/[sodino](1393): TaskService.onStartCommand()
10-26 11:43:54.101: DEBUG/[sodino](1393): isRunning = true
10-26 11:43:54.101: DEBUG/[sodino](1393): Running:20 //第二次开始输出计时
10-26 11:43:55.102: DEBUG/[sodino](1393): Running:19
10-26 11:43:56.102: DEBUG/[sodino](1393): Running:18
10-26 11:43:56.120: DEBUG/[sodino](1385): Click Button and Start a Service:count=4//共按下4次按钮来startService()
10-26 11:43:57.103: DEBUG/[sodino](1393): Running:17
10-26 11:43:58.103: DEBUG/[sodino](1393): Running:16
10-26 11:43:59.104: DEBUG/[sodino](1393): Running:15
10-26 11:44:00.104: DEBUG/[sodino](1393): Running:14
10-26 11:44:01.105: DEBUG/[sodino](1393): Running:13
10-26 11:44:02.105: DEBUG/[sodino](1393): Running:12
10-26 11:44:03.106: DEBUG/[sodino](1393): Running:11
10-26 11:44:04.106: DEBUG/[sodino](1393): Running:10
10-26 11:44:05.107: DEBUG/[sodino](1393): Running:9
10-26 11:44:06.107: DEBUG/[sodino](1393): Running:8
10-26 11:44:07.108: DEBUG/[sodino](1393): Running:7
10-26 11:44:08.100: DEBUG/[sodino](1393): Running:6
10-26 11:44:09.101: DEBUG/[sodino](1393): Running:5
10-26 11:44:10.101: DEBUG/[sodino](1393): Running:4
10-26 11:44:11.102: DEBUG/[sodino](1393): Running:3
10-26 11:44:12.111: DEBUG/[sodino](1393): Running:2
10-26 11:44:13.111: DEBUG/[sodino](1393): Running:1
10-26 11:44:14.112: DEBUG/[sodino](1393): TaskService.onStartCommand()
10-26 11:44:14.112: DEBUG/[sodino](1393): isRunning = true
10-26 11:44:14.112: DEBUG/[sodino](1393): Running:20 //第三次开始输出计时
10-26 11:44:15.113: DEBUG/[sodino](1393): Running:19
10-26 11:44:16.113: DEBUG/[sodino](1393): Running:18 //第三次输出突然中断
10-26 11:45:05.310: DEBUG/[sodino](1400): TaskService onCreate(): this.toString=lab.sodino.TaskService@43fe57a8
10-26 11:45:05.310: DEBUG/[sodino](1400): TaskService.onStartCommand()
10-26 11:45:05.310: DEBUG/[sodino](1400): isRunning = false
10-26 11:45:05.310: DEBUG/[sodino](1400): Running:20 // 第四次输出计时
10-26 11:45:06.321: DEBUG/[sodino](1400): Running:19
10-26 11:45:07.322: DEBUG/[sodino](1400): Running:18
10-26 11:45:08.322: DEBUG/[sodino](1400): Running:17
10-26 11:45:09.323: DEBUG/[sodino](1400): Running:16
10-26 11:45:10.323: DEBUG/[sodino](1400): Running:15
10-26 11:45:11.324: DEBUG/[sodino](1400): Running:14
10-26 11:45:12.324: DEBUG/[sodino](1400): Running:13
10-26 11:45:13.321: DEBUG/[sodino](1400): Running:12
10-26 11:45:14.325: DEBUG/[sodino](1400): Running:11
10-26 11:45:15.326: DEBUG/[sodino](1400): Running:10
10-26 11:45:16.326: DEBUG/[sodino](1400): Running:9
10-26 11:45:17.327: DEBUG/[sodino](1400): Running:8
10-26 11:45:18.327: DEBUG/[sodino](1400): Running:7
10-26 11:45:19.328: DEBUG/[sodino](1400): Running:6
10-26 11:45:20.328: DEBUG/[sodino](1400): Running:5
10-26 11:45:21.321: DEBUG/[sodino](1400): Running:4
10-26 11:45:22.321: DEBUG/[sodino](1400): Running:3
10-26 11:45:23.322: DEBUG/[sodino](1400): Running:2
10-26 11:45:24.322: DEBUG/[sodino](1400): Running:1
10-26 11:45:25.330: DEBUG/[sodino](1400): TaskService.onStartCommand()
10-26 11:45:25.330: DEBUG/[sodino](1400): isRunning = true
10-26 11:45:25.330: DEBUG/[sodino](1400): Running:20 // 第五次输出计时
10-26 11:48:40.810: DEBUG/[sodino](1407): TaskService onCreate(): this.toString=lab.sodino.TaskService@43fe5660
10-26 11:48:40.810: DEBUG/[sodino](1407): TaskService.onStartCommand()
10-26 11:48:40.810: DEBUG/[sodino](1407): isRunning = false
10-26 11:48:40.810: DEBUG/[sodino](1407): Running:20 // 第六次输出计时
10-26 11:48:41.815: DEBUG/[sodino](1407): Running:19
10-26 11:48:42.815: DEBUG/[sodino](1407): Running:18
10-26 11:48:43.816: DEBUG/[sodino](1407): Running:17
10-26 11:48:44.816: DEBUG/[sodino](1407): Running:16
10-26 11:48:45.817: DEBUG/[sodino](1407): Running:15
10-26 11:48:46.818: DEBUG/[sodino](1407): Running:14
10-26 11:48:47.818: DEBUG/[sodino](1407): Running:13
10-26 11:48:48.811: DEBUG/[sodino](1407): Running:12
10-26 11:48:49.811: DEBUG/[sodino](1407): Running:11
10-26 11:48:50.812: DEBUG/[sodino](1407): Running:10
10-26 11:48:51.812: DEBUG/[sodino](1407): Running:9
10-26 11:48:52.821: DEBUG/[sodino](1407): Running:8
10-26 11:48:53.821: DEBUG/[sodino](1407): Running:7
10-26 11:48:54.822: DEBUG/[sodino](1407): Running:6
10-26 11:48:55.822: DEBUG/[sodino](1407): Running:5
10-26 11:48:56.823: DEBUG/[sodino](1407): Running:4
10-26 11:48:57.823: DEBUG/[sodino](1407): Running:3
10-26 11:48:58.824: DEBUG/[sodino](1407): Running:2
10-26 11:48:59.824: DEBUG/[sodino](1407): Running:1
555...
终于有人回帖了...但是我不想关闭service啊。
又与其他service有什么关系???
怎么判断service是否在运行呢??
我不是要每次都要运行onCreate或者onStart,我只是想弄明白,为什么在onStart()中,有时会出现:任务还没有完成(20到1的降序未全部输出)service就被强制中断了,不定时间后,又会被重启?
是的,<service android:name="***.java" android:process=":remote"/>
查查API吧,看Service怎么解释这些方法的调用。
06-03 22:47:39.960: ERROR/ActivityManager(1632): Reason: Executing service lab.sodino.service/.MyService
06-03 22:47:39.960: ERROR/ActivityManager(1632): Load: 0.11 / 0.31 / 0.48
06-03 22:47:39.960: ERROR/ActivityManager(1632): CPU usage from 33969ms to 0ms ago with 99% awake:
06-03 22:47:39.960: ERROR/ActivityManager(1632): 0.4% 179/omap2_mcspi: 0% user + 0.4% kernel
06-03 22:47:39.960: ERROR/ActivityManager(1632): 0.2% 1632/system_server: 0% user + 0.1% kernel / faults: 13 minor 3 major
06-03 22:47:39.960: ERROR/ActivityManager(1632): 0.2% 1376/battd: 0% user + 0.2% kernel / faults: 18 minor
06-03 22:47:39.960: ERROR/ActivityManager(1632): 0% 3374/lab.sodino.service: 0% user + 0% kernel / faults: 20 minor
06-03 22:47:39.960: ERROR/ActivityManager(1632): 0% 182/cpcap_irq/0: 0% user + 0% kernel
06-03 22:47:39.960: ERROR/ActivityManager(1632): 0% 511/qtouch_obp_ts_w: 0% user + 0% kernel
06-03 22:47:39.960: ERROR/ActivityManager(1632): 0% 587/als_wq: 0% user + 0% kernel
06-03 22:47:39.960: ERROR/ActivityManager(1632): 0% 1374/gkisystem: 0% user + 0% kernel
06-03 22:47:39.960: ERROR/ActivityManager(1632): 0% 3027/cn.dolphin.browser: 0% user + 0% kernel / faults: 10 minor 2 major
06-03 22:47:39.960: ERROR/ActivityManager(1632): +0% 3382/flush-31:0: 0% user + 0% kernel
06-03 22:47:39.960: ERROR/ActivityManager(1632): 1.1% TOTAL: 0.1% user + 0.9% kernel + 0% irq
06-03 22:47:39.960: ERROR/ActivityManager(1632): CPU usage from 420ms to 938ms later:
06-03 22:47:39.960: ERROR/ActivityManager(1632): 3.8% 1632/system_server: 0% user + 3.8% kernel
06-03 22:47:39.960: ERROR/ActivityManager(1632): 3.8% 1644/ActivityManager: 0% user + 3.8% kernel
06-03 22:47:39.960: ERROR/ActivityManager(1632): 3.8% TOTAL: 0% user + 3.8% kernel
正确的方法是将可能导致长时间延时的操作在新开的Thread中执行。 public void onStart(Intent intent, int startID) {
super.onStart(intent, startID);
new Thread() {
public void run() {
int count = 0;
while (true) {
Log.d("ANDROID_LAB", "COUNT=" + count++);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}.start();
}