2011-01-10 5 views
3

Ich habe eine Aktivität mit einem Kontrollkästchen: Wenn die Chekbox nicht markiert ist, dann stoppe den Dienst. Dies ist ein Ausschnitt aus meiner Aktivitätscode:Wie man einen Parameter von einer Aktivität an einen Dienst weitergibt ... wenn der Benutzer den Dienst stoppt

Intent serviceIntent = new Intent(); 
    serviceIntent.setAction("com.android.savebattery.SaveBatteryService"); 

    if (*unchecked*){ 
     serviceIntent.putExtra("user_stop", true); 
     stopService(serviceIntent); 

, wenn ich den Dienst beenden passiere ich einen Parameter „user_stop“ im Dienst zu sagen, dass es einen Benutzer zu stoppen es gewesen ist und nicht das System (für Low-Memory) .

jetzt habe ich die Variable "user_stop" in Leerer onDestroy meines Dienstes zu lesen:

public void onDestroy() { 
super.onDestroy(); 

Intent recievedIntent = getIntent(); 
boolean userStop= recievedIntent.getBooleanExtra("user_stop"); 

    if (userStop) { 
     *** notification code **** 

, aber es funktioniert nicht! Ich kann getIntent() nicht in onDestroy verwenden!

irgendein Vorschlag?

dank

Simone

Antwort

6

Ich sehe zwei Möglichkeiten dies zu tun:

  1. Mit Gemeinschafts-Einstellungen.
  2. Verwenden lokaler Übertragungen.

Der erste Ansatz ist eine einfache und unkomplizierte Weise. Aber es ist nicht sehr flexibel. Grundsätzlich tun Sie:

  • a. Setzen Sie die freigegebene Benutzereinstellung "user stop" auf "true".
  • b. Stoppen Sie Service
  • c. Überprüfen Sie in Ihrem Dienst in onDestroy, was der Wert der Einstellung "Benutzerstopp" ist.

Der andere Ansatz ist ein besserer Weg, aber mehr Code erfordert.

  • a. Definieren Sie eine String-Konstante in Ihnen Serviceklasse:
final public static string USER_STOP_SERVICE_REQUEST = "USER_STOP_SERVICE".
  • b.Erstellen Sie eine innere Klasse BroadcastReceiver-Klasse:

    public class UserStopServiceReceiver extends BroadcastReceiver 
    { 
        @Override 
        public void onReceive(Context context, Intent intent) 
        { 
         //code that handles user specific way of stopping service 
        } 
    } 
    
  • c. Registrieren Sie diesen Receiver in onCreate oder onStart Methode:

    registerReceiver(new UserStopServiceReceiver(), newIntentFilter(USER_STOP_SERVICE_REQUEST));
  • d. Von jedem Ort möchten Sie Ihren Dienst beenden:

    context.sendBroadcast(new Intent(USER_STOP_SERVICE_REQUEST));

Beachten Sie, dass alle benutzerdefinierten Argumente durch Intent mit diesem Ansatz passieren kann.

+0

Awesome Ansatz mit den lokalen Broadcasts, zwischen, wissen Sie, ob wir an laufende Dienste binden können? (für 2-Wege-Kommunikation) –

1

Ich glaube nicht auf onDestroy verlassen() ist eine gute Sache. Es gibt einige Ansätze, die Sie ergreifen können.

  1. vorschlagen, den Dienst zu binden, so dass Sie Ihre userstop Benachrichtigung in onUnbind http://developer.android.com/guide/topics/fundamentals.html#servlife

  2. Andere Option schreiben konnte (nicht sicher, ob dies funktioniert) wird Ihre Variable SharedPreferences zu schreiben und sie von onDestroy zu erhalten (). [Sie müssen prüfen, ob dies im Debug-Modus oder in LogCat-Nachrichten funktioniert.

-1

Ich habe das gleiche Setup in meiner App mit CheckBoxPreference in meiner Aktivität und getSharedPreference in Service Class onCreate. Durch Aktivieren des Kontrollkästchens wird der Dienst gestartet. Durch die Deaktivierung wird der Dienst gestoppt.

Hören und Vorlieben Klick in meine Aktivität behandeln:

getPreferenceManager().findPreference("prefEnable").setOnPreferenceClickListener(new OnPreferenceClickListener() 
    { 
     // not used: Intent intent = new Intent(this, MyService.class); 
     @Override 
     public boolean onPreferenceClick(Preference preference) { 
      CheckBoxPreference cb = (CheckBoxPreference) preference; 
      if (cb.isChecked()) { 
       Log.d(TAG, "User enabled service"); 
       // code to start service 
      } else { 
       Log.d(TAG, "User disabled service"); 
       // code to stop service 
      } 
      return true; 
     } 
    }); 

Holen Sie sich meine "prefEnable" Präferenz in meinem Dienst onCreate:

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); 
    Boolean isEnabled = preferences.getBoolean("prefEnable", false); 

Vielleicht in Ihrem onDestroy, können Sie erneut Zweck dieser und sagen:

if (isEnabled==false) { 
    *** notification code *** 
+0

Und dieses Arbeitsbeispiel wurde 3 Jahre nach meiner Veröffentlichung abgelehnt, warum? – capitalf

-1

// Sie können den Parameter auf diese einfache Weise übergeben: -

Intent serviceIntent = new Intent(this,ListenLocationService.class); 
    serviceIntent.putExtra("From", "Main"); 
    startService(serviceIntent); 
//and get the parameter in onStart method of your service class 

    @Override 
public void onStart(Intent intent, int startId) { 
    super.onStart(intent, startId); 
    Bundle extras = intent.getExtras(); 
if(extras == null) 
    Log.d("Service","null"); 
else 
{ 
    Log.d("Service","not null"); 
    String from = (String) extras.get("From"); 
    if(from.equalsIgnoreCase("Main")) 
     StartListenLocation(); 
} 

} 
Enjoy :) 
Verwandte Themen