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();
}
}
(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();
}
}
相关文章推荐
- Android中通过Messenger与Service实现进程间双向通信
- Android中通过Messenger与Service实现进程间双向通信
- Android开发之Messenger信使和service实现跨进程
- Android--Service+Messenger(信使)-实现不同应用程序间的通信
- Android Service之Messenger实现通信
- Android 音乐播放器的开发教程(七)运用Broadcast实现service与activity的通信 ----- 小达
- Android开发入门之网络通信(通过HTTP协议实现文件上传)
- Android开发笔记(五十一)通过Messenger实现进程间通信
- android开发之使用Messenger实现service与activity交互
- android开发之使用Messenger实现service与activity交互
- android开发之使用Messenger实现service与activity交互
- android开发之使用Messenger实现service与activity交互
- Android Service之Messenger实现通信
- 通过messenger实现activity与service的相互通信
- Android开发之通过AIDL服务实现进程间的通信
- 【Android】安卓开发之通过本地广播实现子线程和UI线程的通信
- 通过messenger实现activity与service的相互通信
- 【Android开发】线程与消息处理-通过实现Runnable接口来创建线程
- 两部android设备通过服务器转发实现通信简单demo
- 【Android开发经验】移动设备的“声波通信/验证”的实现——SinVoice开源项目介绍(三)