您的位置:首页 > 移动开发 > Android开发

Android开发之Service通过Messenger实现线程间的通信

2014-04-12 17:42 435 查看
        Messenger信使其实在真正使用中用到的并不多,但是面试的时候考官还是十分想要考察一下你的基本功的。那我们现在先来看一下Messenger的使用场景。如果你需要你的Service与远程线程通信,那么您可以使用一个Messenger来为您的Service提供的接口。这种技术允许您执行进程间通信(IPC),而不需要使用AIDL。那关于Messenger的使用有哪些基本总结呢。(1)在Service中,必须继承一个Handler类,来处理回调信息
(2)Messenger类创建的时候所传的参数就是之前提到的我们实现的Handler类(3)在Service 的onbind()方法中返回Messenger.getBind()方法(4)Service接收到的每条信息都是通过handlerMessage()方法处理的。啰嗦了那么多还是来看一下代码吧。

MainActivity的代码

package com.example.f24_service03;

import android.os.Bundle;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;

import android.view.View;

public class MainActivity extends Activity {

private boolean flag = false;
private Messenger messenger;

public void sayHello(View v) {
if (!flag)
return;
// Create and send a message to the service, using a supported 'what'
// value
Message msg = Message.obtain(null, 1, 0, 0);
try {
messenger.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
}

ServiceConnection connection = new ServiceConnection() {

@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
messenger = null;
flag = false;
}

@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
//当绑定成功时,我们就可以用Messenger来实现线程间的通信
messenger = new Messenger(service);
flag = true;
}
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

}

protected void onStart() {
Intent intent = new Intent(this, MyService.class);
bindService(intent, connection, BIND_AUTO_CREATE);
super.onStop();

};

@Override
protected void onStop() {
// TODO Auto-generated method stub
if (flag) {
unbindService(connection);
flag = false;
}
super.onStop();
}

}

MyService的代码
package com.example.f24_service03;

import android.annotation.SuppressLint;
import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.util.Log;
import android.widget.Toast;

public class MyService extends Service {

@SuppressLint("HandlerLeak")
// 该类处理从客户端传入的信息
class incomingHandler extends Handler {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
if (msg.what == 1) {
Toast.makeText(getApplicationContext(),
"Hello ,already recieve Message", Toast.LENGTH_LONG)
.show();
}
super.handleMessage(msg);
}
}

final Messenger messenger = new Messenger(new incomingHandler());

// 当绑定Service,我们将返回一个Messenger通讯接口
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
Log.i("Service", "-------->bind");
return messenger.getBinder();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息