Android:IntentService:如何:从Activity传递回调到IntentService?

ero*_*ros 5 android callback

我想将回调传递给IntentService.这是我目前的代码:

我的回调界面

import android.os.Message;

public interface SampleCallback {

    public void doSomethingFromCurrentThread();

    public void doSomethingFromUIThread(final Message msg);
}
Run Code Online (Sandbox Code Playgroud)

我的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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

任何关于如何通过我的回调的指导表示赞赏.

mid*_*tar 9

您可能正在寻找ResultReceiver.它实现了Parcelable,因此您可以将其传递给intent服务.

很抱歉4年后给你一个答案.


Mic*_*ael 3

这是关于从服务通知活动的一个很好的答案:从服务通知活动。对我来说,Activity.createPendingResult()这是调用家长活动的好方法。

这实际上不是回调,但据我所知,没有好的方法可以在没有绑定服务的情况下实现这样的回调。

  • 这是一个很好的教程:http://mindtherobot.com/blog/37/android-architecture-tutorial-developing-an-app-with-a-background-service-using-ipc/ (2认同)