How do I get data within an Android Service that was passed from an invoking Activity?
How do I get data within an Android Service that was passed from an invoking Activity?
This is how I pass data from Activity to IntentService.
One of my application has this scenario.
1) Send Data (Activity code)
Intent intent = new Intent(MusicActivity.class, DownloadSongService.class);
String songUrl = "something";
intent.putExtra(YOUR_KEY_SONG_NAME, songUrl);
startService(intent);
2) Get data in Service (IntentService code)
You can access the intent in the onHandleIntent() method
public class DownloadSongService extends IntentService {
@Override
protected void onHandleIntent(@Nullable Intent intent) {
String songUrl = intent.getStringExtra("YOUR_KEY_SONG_NAME");
// Download File logic
}
}
private void startFloatingWidgetService() {
startService(new Intent(MainActivity.this,FloatingWidgetService.class)
.setAction(FloatingWidgetService.ACTION_PLAY));
}
instead of :
private void startFloatingWidgetService() {
startService(new Intent(FloatingWidgetService.ACTION_PLAY));
}
Because when you try 2nd one then you get an error saying : java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.floatingwidgetchathead_demo.SampleService.ACTION_START }
Then your Service be like this :
static final String ACTION_START = "com.floatingwidgetchathead_demo.SampleService.ACTION_START";
static final String ACTION_PLAY = "com.floatingwidgetchathead_demo.SampleService.ACTION_PLAY";
static final String ACTION_PAUSE = "com.floatingwidgetchathead_demo.SampleService.ACTION_PAUSE";
static final String ACTION_DESTROY = "com.yourcompany.yourapp.SampleService.ACTION_DESTROY";
@SuppressLint("LogConditional")
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
String action = intent.getAction();
//System.out.println("ACTION: "+action);
switch (action){
case ACTION_START:
Log.d(TAG, "onStartCommand: "+action);
break;
case ACTION_PLAY:
Log.d(TAG, "onStartCommand: "+action);
addRemoveView();
addFloatingWidgetView();
break;
case ACTION_PAUSE:
Log.d(TAG, "onStartCommand: "+action);
break;
case ACTION_DESTROY:
Log.d(TAG, "onStartCommand: "+action);
break;
}
return START_STICKY;
}
Service: startservice can cause side affects,best way to use messenger and pass data.
private CallBackHandler mServiceHandler= new CallBackHandler(this);
private Messenger mServiceMessenger=null;
//flag with which the activity sends the data to service
private static final int DO_SOMETHING=1;
private static class CallBackHandler extends android.os.Handler {
private final WeakReference<Service> mService;
public CallBackHandler(Service service) {
mService= new WeakReference<Service>(service);
}
public void handleMessage(Message msg) {
//Log.d("CallBackHandler","Msg::"+msg);
if(DO_SOMETHING==msg.arg1)
mSoftKeyService.get().dosomthing()
}
}
Activity:Get Messenger from Intent fill it pass data and pass the message back to service
private Messenger mServiceMessenger;
@Override
protected void onCreate(Bundle savedInstanceState) {
mServiceMessenger = (Messenger)extras.getParcelable("myHandler");
}
private void sendDatatoService(String data){
Intent serviceIntent= new
Intent(BaseActivity.this,Service.class);
Message msg = Message.obtain();
msg.obj =data;
msg.arg1=Service.DO_SOMETHING;
mServiceMessenger.send(msg);
}
If you are using kotlin you can try the following code,
In the sending activity,
val intent = Intent(context, RecorderService::class.java);
intent.putExtra("filename", filename);
context.startService(intent)
In the service,
override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
super.onStartCommand(intent, flags, startId)
if (intent != null && intent.extras != null)
val filename = intent.getStringExtra("filename")
}