Stoppen Sie den Dienst in Android

78

Hier habe ich ein einfaches Serviceprogramm ausprobiert. Der Startdienst funktioniert einwandfrei und generiert Toast, der Stoppdienst jedoch nicht. Der Code dieses einfachen Dienstes lautet wie folgt:

public class MailService extends Service {
    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }
    public void onCreate(){
        super.onCreate();
        Toast.makeText(this, "Service Started", Toast.LENGTH_SHORT).show();
    }
    public void onDestroyed(){
        Toast.makeText(this, "Service Destroyed", Toast.LENGTH_SHORT).show();
        super.onDestroy();
    }
}

Der Code der Aktivität, von der aus dieser Dienst aufgerufen wird, lautet wie folgt:

public class ServiceTest extends Activity{
    private Button start,stop;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.service_test);

        start=(Button)findViewById(R.id.btnStart);
        stop=(Button)findViewById(R.id.btnStop);

        start.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                startService(new Intent(ServiceTest.this,MailService.class));
            }
        });
        stop.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                stopService(new Intent(ServiceTest.this,MailService.class));
            }
        });
    }
}

Helfen Sie mir, den Dienst mit dieser Stopp-Schaltfläche zu beenden, die Toast in der onDestroy () -Methode generiert. Ich habe hier bereits viele Posts zum Thema Stop-Service-Problem gesehen, die jedoch nicht zufriedenstellend sind. Hoffe auf zufriedenstellende Antwort.

Ravi Bhatt
quelle
6
Funktioniert stopService(serviceIntent)nicht
Chris Cashwell
"Denken Sie auch daran, dass der genaue Zeitpunkt der Zerstörung des Dienstes bei Android liegt und möglicherweise nicht unmittelbar ist." Von: stackoverflow.com/questions/2176375/android-service-wont-stop/…
bigstones
1
@chris: Ich denke, die oben implementierte Methode stopService (serviceIntent) hat nicht funktioniert, da Toast bei onDestroy () beim Klicken auf die Schaltfläche zum Stoppen nicht aufgetreten ist.
Ravi Bhatt
@bigstone: Bedeutet das, dass meine Methoden stopService () und onDestroy () korrekt funktionieren, aber nicht sofort, wenn ich die Stopp-Taste drücke?
Ravi Bhatt
@ Ravi: Ja. Android entscheidet möglicherweise, dass genügend Ressourcen vorhanden sind, um den Dienst im Speicher zu halten, sodass er bereit ist, wenn er erneut benötigt wird.
Bigstones

Antworten:

48
onDestroyed()

ist falscher Name für

onDestroy()  

Haben Sie nur in dieser Frage oder auch in Ihrem Code einen Fehler gemacht?

Kreker
quelle
Ja, später habe ich meinen Code von Grund auf neu erstellt und es hat gut funktioniert. Jedes Ja kann das Problem in meinem früheren Code sein, das andere und ich auch nicht bemerkt haben. Wie auch immer, danke :) Da es auch anderen hilft.
Ravi Bhatt
2
@ RaviBhatt Haben Sie es also geschafft, einen Dienst zu beenden? Wenn ja, können Sie uns dann mitteilen, wie es geht?
Suraj
@suraj was ist mit docs?
Kreker
3
@suraj Wenn Sie meinen Code referenziert haben, müssen Sie in Aktivität eine Absicht wie " intent = new Intent(ServiceTest.this,MailService.class) Start" verwenden und dieselbe Absicht zum Starten und Stoppen des Dienstes wie "startService (Absicht)" und "stopService" (Absicht) verwenden.
Ravi Bhatt
11
Deshalb sollten Sie immer @OverrideAnmerkungen verwenden.
Pavel
16

Dieser Code funktioniert für mich: Überprüfen Sie diesen Link
Dies ist mein Code, wenn ich den Dienst in Aktivität stoppe und starte

case R.id.buttonStart:
  Log.d(TAG, "onClick: starting srvice");
  startService(new Intent(this, MyService.class));
  break;
case R.id.buttonStop:
  Log.d(TAG, "onClick: stopping srvice");
  stopService(new Intent(this, MyService.class));
  break;
}
}
 }

Und in der Serviceklasse:

  @Override
public void onCreate() {
    Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show();
    Log.d(TAG, "onCreate");

    player = MediaPlayer.create(this, R.raw.braincandy);
    player.setLooping(false); // Set looping
}

@Override
public void onDestroy() {
    Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();
    Log.d(TAG, "onDestroy");
    player.stop();
}

GLÜCKLICHE CODIERUNG!

Dondondon
quelle
Wie gehe ich während einer Ausnahme innerhalb des Dienstes damit um? Ich bezweifle, dass onDestory () dann aufgerufen wird.
Srihari Karanth
14

Um den Dienst zu beenden , müssen wir die folgende Methode verwenden stopService():

  Intent myService = new Intent(MainActivity.this, BackgroundSoundService.class);
  //startService(myService);
  stopService(myService);

dann heißt die Methode onDestroy()im Dienst:

  @Override
    public void onDestroy() {

        Log.i(TAG, "onCreate() , service stopped...");
    }

Hier finden Sie ein vollständiges Beispiel, wie Sie den Dienst beenden können.

Jorgesys
quelle