How to pass a parameter from an activity to a service...when the user stop the service
Solution 1
I see two ways of doing this:
- Using Shared Preferences.
- Using local broadcasts.
The first approach is an easy and straightforward way. But it is not very flexible. Basically you do:
- a. Set "user stop" shared preference to true.
- b. Stop service
- c. In you service in onDestroy check what is the value of "user stop" preference.
The other approach is a better way but requires more code.
- a. Define a string constant in you service class:
final public static string USER_STOP_SERVICE_REQUEST = "USER_STOP_SERVICE".
-
b. Create an inner class BroadcastReceiver class:
public class UserStopServiceReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //code that handles user specific way of stopping service } }
-
c. Register this receiver in onCreate or onStart method:
registerReceiver(new UserStopServiceReceiver(), newIntentFilter(USER_STOP_SERVICE_REQUEST));
-
d. From any place you want to stop your service:
context.sendBroadcast(new Intent(USER_STOP_SERVICE_REQUEST));
Note that you can pass any custom arguments through Intent using this approach.
Solution 2
I don't think relying on onDestroy() is a good thing. There are couple of approaches you can take.
suggest to bind the service so that you could write your userstop notification in onUnbind http://developer.android.com/guide/topics/fundamentals.html#servlife
Other option (not sure if this works) is to post your variable to SharedPreferences and obtain it from onDestroy(). [You need to check if this works in debug mode or LogCat messages.
Simone
Updated on June 26, 2022Comments
-
Simone about 2 years
I have an activity with a checkbox: if the chekbox is unchecked then stop the service. this is a snippet of my activity code:
Intent serviceIntent = new Intent(); serviceIntent.setAction("com.android.savebattery.SaveBatteryService"); if (*unchecked*){ serviceIntent.putExtra("user_stop", true); stopService(serviceIntent);
when I stop the service I pass a parameter "user_stop" to say at the service that has been a user to stop it and not the system (for low memory).
now I have to read the variable "user_stop" in void onDestroy of my service:
public void onDestroy() { super.onDestroy(); Intent recievedIntent = getIntent(); boolean userStop= recievedIntent.getBooleanExtra("user_stop"); if (userStop) { *** notification code ****
but it doesn't work! I can't use getIntent() in onDestroy!
any suggestion?
thanks
Simone