2010-12-17 62 views
1

我有服務與線程,從活動我打電話啓動服務(從Activity :: onDestroy())和停止服務(活動:: onCreate())。Android ::服務OnDestroy調用非常晚

StopService()立即返回,但是我的Service :: OnDestroy在很多時間後調用,很晚,​​爲什麼?如何在調用StopService()時立即調用Service :: OnDestroy。

Activity類

MyActivity::OnDestroy() 
{ 
    System.out.println("MyActivity-OnDestroy Start"); 
    // we are leaving activity so start service 
    Intent svcIntent = new Intent(this,MyService.class); 
    svcIntent.putExtra("SomeData", m_iData); 
    startService(svcIntent); 
    System.out.println("MyActivity-OnDestroy, startservice called"); 
    .. 
    .. 
    System.out.println("MyActivity-OnDestroy, End"); 
} 
MyActivity::OnCreate() 
{ 
    System.out.println("MyActivity-onCreate Start"); 
    // if service running stop it. 
    if (m_bCalledFromNotification) 
    { 
    System.out.println("Stopping Service"); 
    boolean b = stopService(new Intent(this,AudioService.class)); 
    System.out.println("Stopping Service, Status="+b); 
    } 
    System.out.println("MyActivity-onCreate End");  
} 

服務類

@Override 
public IBinder onBind(Intent intent) 
{ 
    return null; 
} 

// When service is created 
@Override 
public void onCreate() 
{ 
    // initialize service data 
    System.out.println("MyService Created");  
} 

@Override 
public void onDestroy() 
{ 
    System.out.println("In MyService::onDestroy"); 
    m_UIUpdater.interrupt(); 
    System.out.println("In MyService::onDestroy, updater thread interrupted"); 
    .. 
    System.out.println("My Service Stopped"); 
} 

// This is the old onStart method that will be called on the pre-2.0 
// platform. On 2.0 or later we override onStartCommand() so this 
// method will not be called. 
@Override 
public void onStart(Intent intent, int startId) 
{ 
    StartupHandler(intent,startId); 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) 
{ 
    StartupHandler(intent,startId); 
    // We want this service to continue running until it is explicitly 
    // stopped, so return sticky. 
    return START_STICKY; 
} 

public void StartupHandler(Intent intent, int startid) 
{ 
    // send notification 
    System.out.println("In MyService::StartupHandler, Sending notification"); 

    // start thread 
    m_UIUpdater = new Thread(new Runnable() 
     { 
     public void run() 
     { 
      System.out.println("In MyService::Thread::Run"); 
      while (!Thread.interrupted()) 
      { 
       // check update 
       System.out.println("In MyService::Thread::Run::got update and loop for next update"); 
      } 
     } 
    } 
} 

現在,這裏是logcat的輸出,其顯示的OnDestroy多晚的MyService ::調用。

12-17 09:25:44.462: INFO/System.out(314): MyActivity-OnDestroy Start 
.. 
12-17 09:25:44.493: INFO/System.out(314): MyActivity-OnDestroy, startservice called 
.. 
12-17 09:25:51.102: INFO/System.out(314): MyActivity-OnDestroy, End 
12-17 09:25:51.153: INFO/System.out(314): MyService Created 
12-17 09:25:51.172: INFO/System.out(314): In MyService::StartupHandler, Sending notification 
12-17 09:25:51.273: INFO/System.out(314): In MyService::Thread::Run 
12-17 09:25:51.302: INFO/System.out(314): In MyService::Thread::Run::got update and loop for next update 
.. 
.. 
.. 
12-17 09:25:59.903: INFO/System.out(314): MyActivity-onCreate Start 
.. 
12-17 09:26:00.461: INFO/System.out(314): Stopping Service 
12-17 09:26:00.471: INFO/System.out(314): Stopping Service, Status=true 
12-17 09:26:01.363: INFO/System.out(314): MyActivity-onCreate End 
12-17 09:26:01.421: INFO/System.out(314): In MyService::OnDestroy 
12-17 09:26:01.421: INFO/System.out(314): In MyService::OnDestroy, updater interrupted 
12-17 09:26:01.591: INFO/System.out(314): My Service Stopped 

我是否正確實施了服務代碼?

我該如何等待服務優雅地銷燬,以便在服務已經銷燬之後,我可以做剩餘的進程,就像讀取數據服務已經停止一樣。

感謝,

回答

2

在我看來,當GC回收服務onDestroy被調用。

在您的onStop中嘗試m_UIUpdater.interrupt();

+0

也許嘗試調用stopService()後手動System.gc()? – mad 2010-12-17 12:40:27

+0

感謝,但從http://developer.android.com/guide/topics/fundamentals.html 服務的活動生命週期開始於調用onStart()。此方法傳遞給傳遞給startService()的Intent對象。音樂服務會打開Intent以發現要播放的音樂,並開始播放。 服務停止時沒有等效的回調 - 沒有onStop()方法。 – JRC 2010-12-20 04:10:33

+0

@Markus,謝謝。我試過System.gc(),但MyService :: OnResume完成後仍然調用MyService :: OnDestroy。如何等待停止服務? – JRC 2010-12-20 04:37:00

相關問題