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,
vielleicht versuchen, System.gc() manuell nach dem Aufruf von stopService()? – mad
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
@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