First question here, but I've been around for a while.
What do I have:
I'm building an Android app which plays audio streams and online playlists. Everything is working fine now, but I'm having issues in communicating with my service.
The music is playing in a Service, started with startForeground, so it doesn't gets killed.
I need to communicate from my activity with the service, for getting the track name, image, and a couple of things more.
Whats my issue:
I think I need to start my service with bindService (instead of my current startService) so the activity can talk to it.
However, when I do that, my service gets killed after closing the Activity.
How can I get both? Binding and foreground service?
Thanks!
Foreground services show a status bar notification, so that users are actively aware that your app is performing a task in the foreground and is consuming system resources. Devices that run Android 12 (API level 31) or higher provide a streamlined experience for short-running foreground services.
You have to use BroadcastReceiver to receive intents, and when you want to communicate simply make an Intent with appropriate values. This way you should be able to make a 2-way communication between any component.
Foreground services are an advanced Android concept which allows you to display notifications to your users when running long lived background tasks. The notification acts like any other notification, however it cannot be removed by the user and lives for the duration of the service.
No. bindService
will not start a service . It will just bind to the Service
with a service connection
, so that you will have the instance
of the service to access/control it.
As per your requirement I hope you will have the instance of MediaPlayer
in service . You can also start the service from Activity
and then bind
it. If the service
is already running onStartCommand()
will be called, and you can check if MediaPlayer
instance is not null then simply return START_STICKY
.
Change you Activity
like this..
public class MainActivity extends ActionBarActivity { CustomService customService = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // start the service, even if already running no problem. startService(new Intent(this, CustomService.class)); // bind to the service. bindService(new Intent(this, CustomService.class), mConnection, Context.BIND_AUTO_CREATE); } private ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { customService = ((CustomService.LocalBinder) iBinder).getInstance(); // now you have the instance of service. } @Override public void onServiceDisconnected(ComponentName componentName) { customService = null; } }; @Override protected void onDestroy() { super.onDestroy(); if (customService != null) { // Detach the service connection. unbindService(mConnection); } } }
I have similar application with MediaPlayer
service
. let me know if this approach doesn't help you.
Quoting Android documentation:
A bound service is destroyed once all clients unbind, unless the service was also started
And about the difference between started and bound just take a look to https://developer.android.com/guide/components/services.html
So, you have to create the Service using startService
and then bindService
, like @Libin does in his/her example. Then, the service will run until you use stopService
or stopSelf
or until Android decides that it needs resources and kills you.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With