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

6
我想将回调传递给IntentService。这是我的当前代码:
我的回调接口
import android.os.Message;

public interface SampleCallback {

    public void doSomethingFromCurrentThread();

    public void doSomethingFromUIThread(final Message msg);
}

我的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();
        }
    }
}

任何有关如何通过我的回调的指导都将不胜感激。

我看过这个链接 => https://dev59.com/rFHTa4cB1Zd3GeqPOhrW 但没有明确的答案。因此,我提供我的源代码作为起点。 - eros
我的下一个问题是如何调用pause()和resume()。我会发布另一个问题来解决这个问题。谢谢。 - eros
2个回答

9
您可能在寻找一个ResultReceiver。它实现了Parcelable接口,因此您可以将其传递给IntentService。

抱歉四年后才回答您的问题。


但是在执行此操作时要小心,因为可能会意外泄露视图。观看此视频以获取更多信息。尝试使用弱引用来帮助防止泄漏。 - midnightstar

3
以下是翻译的结果:

关于如何从服务通知活动,这里有一个不错的答案:通知服务中的活动。 对我来说,Activity.createPendingResult() 是调用父活动的好方法。

实际上这并不是回调函数,但据我所知,没有好的方法在没有绑定服务的情况下实现此类回调。


我该如何使用绑定服务来实现它?网络上有没有实际的例子?如果有,能否请您分享URL。谢谢。 - eros
哦,我忘记添加我所说的链接了。已经修复了。 - Michael
我建议不要使用绑定服务。如果你告诉我你想做什么,我会尝试给你提供一个链接或代码示例。 - Michael
抱歉回复晚了。我正在评估一个名为Skyhook的位置API,它具有回调接口。在调用getLocation(auth,_callback)时将使用回调方法。如果成功,将调用_callback.handleSuccess(location)。如果失败,将调用_callback.handleError(location)。然后,想要在服务内重复调用getLocation。我以前尝试过Web应用程序中的Java,但在阅读Android文档后,我意识到它是完全不同的方法,尽管它使用Java作为编程语言。问候。 - eros
2
这里有一个不错的教程:http://mindtherobot.com/blog/37/android-architecture-tutorial-developing-an-app-with-a-background-service-using-ipc/ - Michael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接