Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android: IntentService: How to: pass callback into IntentService from Activity?

I would like to pass callback to IntentService. Here are my current codes:

My callback interface

import android.os.Message;

public interface SampleCallback {

    public void doSomethingFromCurrentThread();

    public void doSomethingFromUIThread(final Message msg);
}

My IntentService

import android.app.IntentService;
import android.content.Intent;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

public class SampleCallbackIntentService extends IntentService {
    private final String LOG_LOGCAT_TAG = "SampleCallbackIntentService";
    private final SampleCallback _callback;
    private Handler _handler;

    public SampleCallbackIntentService(String name, SampleCallback callback) {
        super(name);
        _callback = callback;
    }

    @Override
    public void onCreate() {
        super.onCreate();

        // initialize variables for pause & resume thread
        _mPauseLock = new Object();
        _mPaused = false;
        _mFinished = false;

        // initialize handler to switch to UI/Main thread
         _handler = new Handler()
            {
                @Override
                public void handleMessage(final Message msg)
                {
                    _callback.doSomethingFromUIThread(msg);
                }
            };
    }

    private final int CALLBACK_MESSAGE = 1;
    @Override
    protected void onHandleIntent(Intent arg0) {
        Log.i(LOG_LOGCAT_TAG, "loop started");
        while (!_mFinished) {
            // do stuff here
            _callback.doSomethingFromCurrentThread();

            // process and create the result to pass
            String someResult = "some result here";
            _handler.sendMessage(_handler.obtainMessage(CALLBACK_MESSAGE, someResult));

            synchronized (_mPauseLock) {
                while (_mPaused) {
                    try {
                        Log.i(LOG_LOGCAT_TAG, "loop paused");
                        _mPauseLock.wait();
                        Log.i(LOG_LOGCAT_TAG, "loop resumed");
                    } catch (InterruptedException e) {
                        Log.e(LOG_LOGCAT_TAG, "error occured on pause", e);
                    }
                }
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                Log.e(LOG_LOGCAT_TAG, "error occured on sleep", e);
            }
        }
        Log.i(LOG_LOGCAT_TAG, "loop ended");
    }

    private Object _mPauseLock;
    private boolean _mPaused;
    private boolean _mFinished;

    /**
     * Call this on pause.
     */
    public void pause() {
        Log.i(LOG_LOGCAT_TAG, "pause() called");
        synchronized (_mPauseLock) {
            _mPaused = true;
        }
    }

    /**
     * Call this on resume.
     */
    public void resume() {
        Log.i(LOG_LOGCAT_TAG, "resume() called");
        synchronized (_mPauseLock) {
            _mPaused = false;
            _mPauseLock.notifyAll();
        }
    }
}

Any guidance on how to pass my callback is appreciated.

like image 487
eros Avatar asked Aug 26 '11 04:08

eros


2 Answers

You might be looking for a ResultReceiver. It implements Parcelable so you can pass it to an intent service.

Sorry for giving you an answer 4 years later.

like image 157
midnightstar Avatar answered Nov 17 '22 20:11

midnightstar


Here's a good answer about notifying an activity from a service: Notify activity from service. As for me, Activity.createPendingResult() is a great way to call parent activity.

That's not actually a callback but AFAIK there's no good way to implement such a callback without bound service.

like image 34
Michael Avatar answered Nov 17 '22 22:11

Michael