I have a service with an following constructor:
public ShimmerService(Context context, Handler handler) {
mHandler = handler;
}
I want
Dont pass the Handler to the Service, Handler doesnt implement Parcelable, or Serializable, so I dont think thats possible.
Create the Handler in the Service, and pass any data you need to create the Handler via Intent Extras to the Service.
Service extends Context, so you don't really need it as a parameter in your constructor, since you can use that same instance.
If you have any other parameters that you would like to pass in to the service, i would recommend adding them to the startService intent as extras and getting them in the service.onStartCommand method.
You should not construct services (or activities, or broadcast receivers) explicitly. The Android system does that internally. The proper way to construct a service is via startService()
with an intent; feel free to add extra parameters to that intent.
EDIT: or bindService()
. Then you have options - either build a custom interface with AIDL, or use raw transact()
.
intent service = new Intent(current context, your service name.class);
`service.putExtra(key,value);`// put your sightly variable type
`service.setAction("StartDownload");`// action that will detect in onStartCommand
current context.startService(service);
in service, in onStartCommand:
if (intent.getAction().equals("StartDownload")) {
`intent.getExtras().getString(key)`;// string in this sample should be your variable type as you used in your code
//do what you want
}`
You need to have a no-argument constructor for your Service class, otherwise the systems doesn't know how to instantiate it.
Instead of passing Handler (or whatever object) to the service (what is not possible by the way), you create and register BroadcastReceiver in your Activity class. When you need to invoke Handler functions (or whatever functions in another object) then send broadcast on registered receiver (sendBroadcast). You can also put additional extra parameters to the intent and you can handle all needed code directly from Activity according parameters.
Maybe, in this case your handler will be completely removed (Depends what you actually need.). With broadcast receivers, I don't know to imagine situation when you would need to pass some object to the Service. On the other hand, you doing something not good and you should review the design of the application.
If we want something pass to the Service, we can only start Service with extra parameters in Intent. Service handles state according this parameters inside.
The idea is that Service may run independently from other parts of applications e.g Activities. We may control it with extra parameters when we start Service or with sending broadcasts for invoking outside code.