How can Android service update the UI of the activ

2019-03-15 04:41发布

问题:

I'm new to Android programming, so I'm facing some general problems about choosing the best way to design my app.

What I want to do is basically a media player. I want the media player to run on a service because I want it to play also when the activity is not displayed.

My question is, how can I update the UI on my activity depending on the service working flow (for example, the song changes and I want its name to be displayed)?

I guess I could use a Local Broadcast Manager in order to send intents from my service to my activity and invoke UI updates (does it seem right?)

BUT... I will want my service to do some stuff while playing music (like querying/updating the DB). For this reason I was thinking on running the service on a different process (or thread?).

SO.. I guess, running service on a different process, I won't be able to use local broadcast manager (is this right?).

I hope I explained what are my doubts... anyone can help?

thanks a lot!

回答1:

Use an async task in your service to handle the work you need done in the background. When you need to update the UI use the progressUpdate method of async task to send a broadcast back to any interested activities.

Pseudo example.

Activity

onCreate -> startService and create new broadcastReceiver. Make sure to override the onReceive method and test for the specific intent.

    mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);

    broadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if(intent.getAction().equals(yourActionType)) {
                //do work here
            } 
        }
    };

onResume -> register as a broadcast receiver

    IntentFilter filter = new IntentFilter();
    filter.addAction(yourActionType);
    mLocalBroadcastManager.registerReceiver(broadcastReceiver, filter);

Service

onCreate -> create broadcast manager.

   mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);

onStartCommand -> create and execute a new async task if necessary. (onStart could be called multiple times)

Async Task

doInBackground -> Start whatever background task you need. In this case playing music. Make periodic calls to publishProgress

onProgressUpdate -> sendBroadcast indicating updated status

    Intent broadcastIntent = new Intent(yourActionType);
    broadcastIntent.putExtra(whateverExtraData you need to pass back);
    mLocalBroadcastManager.sendBroadcast(broadcastIntent);

onPostExecute -> sendBroadcast indicating task ended