2014-09-02 40 views
0

这些方法在扩展Service的类中实现。每次按下按钮时都会启动一项新服务。多线程生命周期中的多服务

如果按下按钮一次,LogCat会输出我期望的内容,其中包括“Service onDestroy”的最终输出。但是,当按钮被按下两次时,第一次服务结束之前的第二次“Service onDestroy”。第一项服务完成后仅显示一次,第二项服务打印出“服务正在运行”日志的其余部分,但不打印“Service onDestroy”。

有谁能告诉我为什么?谢谢!

public int onStartCommand(Intent intent,int flags, int startId) { 
    Log.i(TAG,"Service onStartCommand " + startId); 

    final int currentId = startId; 

    Runnable r = new Runnable() { 
     public void run() { 
      for (int i = 0; i < 3; i++) { 
       long endTime = System.currentTimeMillis() + 10*1000; 
       while (System.currentTimeMillis() < endTime) { 
        synchronized(this) { 
         try { 
          wait(endTime - System.currentTimeMillis()); 
         }catch (Exception e) { 

         } 
        } 
       } 
       Log.i(TAG,"Service running"); 
      } 
      stopSelf(); 
     } 
    }; 

    Thread t = new Thread(r); 
    t.start(); 


    return Service.START_STICKY; 
} 


@Override 
public IBinder onBind(Intent intent) { 
    // TODO Auto-generated method stub 
    Log.i(TAG,"Service onBind"); 

    return null; 
} 



@Override 
public void onDestroy() { 
    Log.i(TAG,"Service onDestroy"); 
} 

回答

0

在服务指南中,他们使用服务时不使用stopSelf(),而是使用stopSelf(startId)。第一个stopSelf()可以停止执行你的服务。

在这里看到:http://developer.android.com/guide/components/services.html

编辑:也是一种服务只创建和销毁一次,即使有它的几个执行运行它仍然是一个单一的服务。在你的情况下(绑定服务),只有在最后一次执行完成时才会被销毁。为了记录每次执行结束,您可以尝试覆盖stopSelf(int startId)方法。