2010-12-17 59 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

相关问题