Messenger(信使(跨应用传递对象(数据)))的简单使用

论坛 期权论坛 脚本     
匿名技术用户   2021-1-2 03:21   103   0

首先有2个应用1个服务端(接收数据)1个客户端(发送数据)


服务端步骤:


1、创建一个服务继承Service


代码


public class MyMessengerService extends Service {

//1、接收其他应用发送过来的消息
private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 1:

Log.i("data", "打印的文本数据:" + msg.getData().getString("txt"));
break;

case 2:

Log.i("data", "打印的图片数据长度:" + msg.getData().getByteArray("bitmap").length);

break;
}
};
};

// 2、创建一个信使和handler关联起来
private Messenger messenger = new Messenger(handler);

@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
Log.i("data", "====");
return messenger.getBinder();//3、通过创建的信使对象.getBinder方法返回一个IBinder对象
}

}

2、在配置清单注册服务


代码


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.messenger.service"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="21" />

<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<!-- 注册服务(隐式) -->
<service android:name=".MyMessengerService"
android:enabled="true"
android:exported="true">
<intent-filter >
<action android:name="com.examp.messenger.service.MyMessengerService"/>
</intent-filter>
</service>

</application>

</manifest>

================================================


客户端步骤:


UI界面效果图:

123255_p8OK_2542711.png

结果:

123739_rUM2_2542711.png

//这里就不写布局代码了


1、MainActivity.java类


代码


public class MainActivity extends Activity {

private Messenger messenger;
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}

@Override
public void onServiceConnected(ComponentName name, IBinder service) {

// 通过创建Messenger 把返回来的IBinder对象转换成Messenger对象
messenger = new Messenger(service);
}
};

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

//按钮的点击事件监听
public void onclickButton(View view) {
switch (view.getId()) {
case R.id.bt_remote_bindservice:// 绑定服务

//这里的意图:为服务端注册时在配置清单里设置的action(相当于访问路径)
boolean result = bindService(new Intent(
"com.examp.messenger.service.MyMessengerService"),
connection, Context.BIND_AUTO_CREATE);

if(result){
Toast.makeText(this, "使用Messenger跨进程服务绑定成功", 100).show();
}else{
Toast.makeText(this, "使用Messenger跨进程服务绑定失败", 100).show();
}
break;

case R.id.bt_printtxt:// 打印文本

Message message = Message.obtain();//创建一个Message对象
try {
message.what = 1;

Bundle data = new Bundle();
data.putString("txt", "客户端要求打印的文本");
message.setData(data );
messenger.send(message);//使用信使对象发送Message
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;

case R.id.bt_printimg:// 打印图片
Message message2 = Message.obtain();//创建一个Message对象
try {
message2.what = 2;

Bundle data = new Bundle();

//发送字节
data.putByteArray("bitmap", new byte[(int) (Math.random()*1024)]);
message2.setData(data );
messenger.send(message2);//使用信使对象发送Message
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
}
}
}

最后先部署好服务端(运行服务端),然后在运行客户端 点击按钮 在日志猫观察打印结果

转载于:https://my.oschina.net/u/2542711/blog/618172

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP