从服务到活动的线程获取处理程序

情况:

  1. activity绑定到已启动的前台服务。
  2. 服务将本地活页夹分发给活动。
  3. activity通过getService()调用获取对服务的引用。
  4. activity希望使用消息直接与服务中运行的线程进行通信。 它从活动中调用mService.getThreadHandler()方法。

问题:

  • 如何从当前运行的线程中获取Handler到活动活动中,以便我可以将消息直接发送到线程messagequeue?

我不知道在服务中使用什么信使,我想直接与活动方面的服务中的线程进行通信。

编辑:活动通过调用以下内容获取服务中线程本身的处理程序:

活动代码:

Handler mServiceThreadHandler; ServiceConnection mServiceConnection; public void onStart() { if (!bindService(new Intent(this, MainService.class), mServiceConnection, Context.BIND_AUTO_CREATE)) { Log.e(TAG, "Client did not bind to Service!"); } super.onStart(); } public class MyLocalServiceConnection implements ServiceConnection { @Override public void onServiceConnected(ComponentName name, IBinder service) { LocalBinder binder = (LocalBinder) service; mService = (MainService) binder.getService(); // the handler of the service is actually a handler of a thread // within the service, and is set automatically within the binding // activity when binding to the service. That way you have a direct // "connection" with the message queue of the thread instead of // a message queue in the service itself (main thread of service) mServiceThreadHandler = mService.getServiceHandler(); if (mServiceThreadHandler == null) { Log.e(TAG, "Service handler is NULL"); } mBoundedToService = true; } @Override public void onServiceDisconnected(ComponentName name) { mServiceThreadHandler = null; mBoundedToService = false; } } 

服务代码:

 private HandlerThread mServiceThread = new MyServiceThread(); public Handler getServiceHandler() { return new Handler(mServiceThread.getLooper()); } 

新的Handler(mServiceThread.getLooper()); 在mServiceThread中返回一个新的Handler或同一个Handler?

编辑2:使用接收消息的serviceThread更新服务代码。

 public class MyService extends Service { private MyHandlerThread serviceThread = new MyHandlerThread("serviceThread"); serviceThread.start(); public Handler getServiceHandler() { // hand out the same handler of the service thread for using it in an activity! // serviceThread.getLooper() is the current looper of the thread // serviceThread is the 'this' which handles the messages (see MyHandlerThread) return new Handler(serviceThread.getLooper(), serviceThread); } // do stuff in Service } public class MyHandlerThread extends HandlerThread implements android.os.Handler.Callback { public MyHandlerThread(String name) { super(name); } public MyHandlerThread(String name, int priority) { super(name, priority); } @Override public boolean handleMessage(Message msg) { // TODO define your own message handling here. return false; } } 

正确?

试试这个(我使用Activity来测试它你将使用Service):

 protected void onCreate(Bundle savedInstanceState) { ht = new HandlerThread("HT"); ht.start(); htHandler = new Handler(ht.getLooper(), htCallback); mainHandler = new Handler(mainCallback); for (int i = 0; i < 10; i++) { htHandler.sendMessageDelayed(htHandler.obtainMessage(99, i, 0), i * 3000); } } private HandlerThread ht; private Handler htHandler; private Handler mainHandler; private Callback htCallback = new Callback() { @Override public boolean handleMessage(Message msg) { Log.d(TAG, "handleMessage **********************"); Log.d(TAG, "handleMessage " + msg); Log.d(TAG, "handleMessage Thread: " + Thread.currentThread()); if (msg.arg1 == 4) { Log.d(TAG, "handleMessage sending back to Main thread"); mainHandler.sendEmptyMessage(101); } return false; } }; private Callback mainCallback = new Callback() { @Override public boolean handleMessage(Message msg) { Log.d(TAG, "handleMessage ########################"); Log.d(TAG, "handleMessage " + msg); Log.d(TAG, "handleMessage Thread: " + Thread.currentThread()); Log.d(TAG, "handleMessage i'm quitting"); ht.quit(); return false; } };