我写了个小例子来测试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

解决方案 »

  1.   


    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
      

  2.   

    你启动了几次service,你就要停止几次service,不然其他service都还在运行
      

  3.   


    555...
    终于有人回帖了...但是我不想关闭service啊。
    又与其他service有什么关系???
      

  4.   

    判断Service的状态,当Service已经启动后,点击无效……
      

  5.   

    如何service是第一次启动的话,会首先运行OnCreate,然后再运行OnStart方法,如果此时又一次启动这个Service的话,此时上个Service并没有停止的话,会直接运行OnStart方法,  即:onCreate 只运行一次,service没有被停止的话。 如果想每次有执行OnVCreate方法的话,就要及时的销毁已经运行的Service。
      

  6.   


    怎么判断service是否在运行呢??
      

  7.   


    我不是要每次都要运行onCreate或者onStart,我只是想弄明白,为什么在onStart()中,有时会出现:任务还没有完成(20到1的降序未全部输出)service就被强制中断了,不定时间后,又会被重启?
      

  8.   

    1.你是不是 还没有等到 “(20到1的降序未全部输出)”运行完毕,你有开启 一次 服务啊是的2.肯定就会被覆盖掉咯丫 然后执行最新的服务请求喽。不会的,你仔细看log,在第一次输出完成之前,我多次startService(),第一次和第二次都完整输出了,第三次才突然被中断
      

  9.   


    是的,<service android:name="***.java" android:process=":remote"/>
      

  10.   

    我说你是不是new一个Thread来执行打印呢?
    查查API吧,看Service怎么解释这些方法的调用。
      

  11.   

    好吧,我承认这个帖子我又没有得到正确答案。楼主将循环输出代码直接写在service中了,没有外加个Thread或Runnable的包装。这样会有不确定时机出现的类似下面的报错:06-03 22:47:39.960: ERROR/ActivityManager(1632): ANR in lab.sodino.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();
            }