2010-12-17 7 views
1

Ich habe Dienst mit Thread, Von Aktivität Ich rufe Startdienst (von Activity :: onDestroy()) und stoppe Dienst (activity :: onCreate()).Android :: Service OnDestroy genannt sehr spät

StopService() zurückgegeben sofort, aber mein Service :: OnDestroy rief nach so viel Zeit, ziemlich spät, Warum? Wie man Service :: OnDestroy sofort beim Aufruf von StopService() aufrufen kann.

Aktivitätsklasse

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");  
} 

Service-Klasse

@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"); 
      } 
     } 
    } 
} 

hier Jetzt Ausgabe von logcat ist die zeigen, wie spät MyService :: OnDestroy genannt.

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 

Wurde der Servicecode korrekt implementiert?

Wie kann ich warten, dass der Dienst ordnungsgemäß zu zerstören, so dass ich den verbleibenden Prozess tun kann, nachdem der Dienst zerstört hat, wie das Lesen von Datendienst gestoppt hat.

Danke,

Antwort

2

Es scheint mir, dass onDestroy aufgerufen wird, wenn GC den Dienst reklamiert.

Versuchen Sie m_UIUpdater.interrupt(); in Ihrem onStop.

+0

vielleicht versuchen, System.gc() manuell nach dem Aufruf von stopService()? – mad

+0

danke aber von http://developer.android.com/guide/topics/fundamentals.html Die aktive Lebenszeit eines Dienstes beginnt mit einem Aufruf von onStart(). Diese Methode erhält das Intent-Objekt, das an startService() übergeben wurde. Der Musikdienst öffnet die Absicht, die anzuzeigende Musik zu finden und beginnt mit der Wiedergabe. Es gibt keinen gleichwertigen Rückruf für das Beenden des Diensts - keine onStop() -Methode. – JRC

+0

@Markus, danke. Ich habe versucht, System.gc(), aber immer noch MyService :: OnDestroy aufgerufen, nachdem MyActivity :: OnResume abgeschlossen. Wie kann ich auf Stop-Service warten? – JRC