在一个service中我们使用stopselfresult()时的一些问题,当我在service中创建一个如下的函数:

 public void Print(){
    for(int i=0;i<100;i++){
        try {
            Thread.sleep(1000);
            if(i==11){
                Log.i("Logcat", "qianmian de i="+i);
                boolean b=stopSelfResult(mStartId);
                boolean b1=false;
                Log.i("Logcat", ""+b);
                Log.i("Logcat", "houmian de i="+i);
                Thread.sleep(20000);
            }
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Log.i("Logcat", "i="+i);
    }
}

这个函数的功能很简单,然后我们在onstartcommand()方法中调用,我们采用如下两种方式,第一种
是直接调用

  @Override
   public int onStartCommand(Intent intent, int flags, int startId) {
    // TODO Auto-generated method stub
    mStartId=startId;
    Log.i("Logcat", ""+mStartId);
    Print();
    return super.onStartCommand(intent, flags, startId);
}

同时为了验证效果,我们在ondestroy()方法中写一条log语句,

 @Override
public void onDestroy() {
    // TODO Auto-generated method stub
    Log.i("Logcat", "onDestroy");
    super.onDestroy();

}

然后我们看结果,这个程序的输出结果的主要部分是:

...
i=10
qianmian de i=11
true
houmian de i=11
i=11
i=12
...
onDestroy

而如果我们采用第二种方式就是创建一个新线程的方式,在onstartCommand()中调用这个函数,方式如下:

 @Override
public int onStartCommand(Intent intent, int flags, int startId) {
    // TODO Auto-generated method stub
    mStartId=startId;
    Log.i("Logcat", ""+mStartId);
    Thread t=new Thread(new Runnable() {
        @Override
        public void run() {
            // TODO Auto-generated method stub
            Print();
        }
    });
    t.start();
    return super.onStartCommand(intent, flags, startId);
}

这个结果如下:

...
i=10
qianmian de i=11
true
houmian de i=11
onDestroy
i=11
i=12
...

也就是说,创建一个新的子线程中调用和在主线程中调用结果不同,在子线程中是会直接调用ondestroy()
方法,然后接着执行onstartCommand()方法,在主线程中是继续执行onstartCommand()方法,再去执
ondestroy()方法。为什么呢?等我看完主线程与子线程再来解决这个问题。同时,这里还得提一点,
看到这个输出结果,有人可能会说执行onDestroy()方法是需要时间的,因为输出语句true在houmian de i=11
前面,而houmian de i=11这条输出语句在onDestroy前面,也就是说这时stopselfResult()方法已经执行
完了,而ondestroy()方法还在执行一段时间后再打印ondestroy语句。也就是说onDestroy()方法是需要时
间来执行的。其实不是,你可以使用在activity中调用stopService()方法的方式来终止服务,你会发现
onDestroy在你按下的时候马上就打印出来了,也就是说onDestroy()方法并不会耗费时间,那么这个输出结果
是怎么回事呢?感觉可能是stopselfResult()方法和ondestroy()方法之间的调用花了时间。