Messenger信使(跨进程通信)
2018-06-10 本文已影响15人
五万年前走丢了
由Handler发送接收
服务器
Service
public class MyService extends Service {
public MyService() {
}
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Log.i("tagserver","--------从客户端传递的数据---------");
Log.i("tagserver","what==="+msg.what+",arg1==="+msg.arg1+",arg2==="+msg.arg2);
Messenger clientMessenger = msg.replyTo;
Message message = Message.obtain();
message.what = 2;
message.arg1 = 999;
message.arg2 = 8888;
try {
clientMessenger.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
};
//创建服务器端信使对象
Messenger serverMessenger = new Messenger(handler);
@Override
public IBinder onBind(Intent intent) {
//通过getBinder的方法能够返回连接通道的对象,就是IBinder
return serverMessenger.getBinder();
}
}
清单注册
<service
android:name=".MyService"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.qf.server"></action>
</intent-filter>
</service>
客户端
Mainactivity
public class MainActivity extends AppCompatActivity {
private Messenger serverMessenger;
private Messenger clientMessenger;
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Log.i("tagclient","----从服务器端传来的消息----");
Log.i("tagclient","msg.what=="+msg.what+",arg===="+msg.arg1+",arg2----"+msg.arg2);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
clientMessenger = new Messenger(handler); //客户端的信使
}
//ServiceConnection是一个接口,继承和实现内部类都可以.
ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
serverMessenger = new Messenger(service); //服务端的信使
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
//绑定服务的要求: 在android5.0之前,使用隐示和显示意图都可以,5.0之后,google官方建议不要使用隐式意图,
//如果直接使用,会报错。
@Override
protected void onStart() {
super.onStart();
Intent intent = new Intent();
intent.setAction("com.qf.server");
//为了能够让5.0之后的版本,服务可以使用隐士意图必须要加上的语句
// Service Intent must be explicit: Intent { act=com.qf.server }
intent.setPackage("com.qianfeng.server");
bindService(intent,connection,BIND_AUTO_CREATE);
}
public void onClick(View view) {
Message message = Message.obtain();
message.what = 1;
message.arg1 = 98;
message.arg2 = 100;
message.replyTo = clientMessenger;
try {
serverMessenger.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.qianfeng.client.MainActivity">
<Button
android:id="@+id/btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="向服务器发送消息"
android:onClick="onClick"/>
</RelativeLayout>