Messenger
- Messenger介紹
- 服務端
- 客戶端
- 效果展示
Messenger介紹
Messenger是一種輕量級IPC方案,它的底層實作是AIDL,可以在不能行程之間進行資料傳輸
服務端
創建一個Service,在Handler中處理訊息,在onBind中回傳Messenger物件的Binder
public class MessengerService extends Service {
private static final String TAG = "MessengerService";
public static final int MESSAGE_FROM_CLIENT = 20;
@Nullable
@Override
//回傳Binder
public IBinder onBind(Intent intent) {
return messenger.getBinder();
}
private final Messenger messenger = new Messenger(new MessengerHandle());
private static class MessengerHandle extends Handler{
@Override
public void handleMessage(@NonNull Message msg) {
switch (msg.what){
case MESSAGE_FROM_CLIENT:
//接受來自客戶端的訊息
Log.d(TAG,"" + msg.getData().getString("msg"));
Messenger client = msg.replyTo;
Message RelpyToMessage = Message.obtain(null,MainActivity.MESSAGE_FROM_SERVICE);
Bundle ServiceBundle = new Bundle();
ServiceBundle.putString("reply","Hi! Client");//回傳訊息至客戶端
RelpyToMessage.setData(ServiceBundle);
try{
client.send(RelpyToMessage);
}catch (RemoteException e){
e.printStackTrace();
}
break;
}
super.handleMessage(msg);
}
}
}
在清單檔案中配置Service
<service
android:name=".MessengerService"
android:process=":remote"
android:enabled="true"
android:exported="true"/>
客戶端
首先系結服務端的Service,然后根據IBinder創建一個Messenger物件,然后在系結名稱向客戶端發送訊息,依舊在Handler處理服務端的訊息
public class MainActivity extends AppCompatActivity{
private static final String TAG = "MainActivity";
public static final int MESSAGE_FROM_SERVICE = 10;//客戶端發送給服務端
private Messenger messenger;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(MainActivity.this,MessengerService.class);
bindService(intent,connection,BIND_AUTO_CREATE);
}
@Override
protected void onDestroy() {
unbindService(connection);
super.onDestroy();
}
private Messenger myMessenger = new Messenger(new MessengerHandle());
//連接Service并發送訊息
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
messenger =new Messenger(service);
Message message = Message.obtain(null, MessengerService.MESSAGE_FROM_CLIENT);
Bundle bundle = new Bundle();
//第一次向Service打招呼
bundle.putString("msg","Hi! Service");
message.setData(bundle);
//接收客戶端資訊時,需要把服務端的Messenger通過replyTo引數傳遞給服務端
message.replyTo = myMessenger;
try{
messenger.send(message);
}catch (RemoteException e){
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
//接收Service的訊息
private static class MessengerHandle extends Handler{
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
switch (msg.what){
case MESSAGE_FROM_SERVICE:
Log.d(TAG,msg.getData().getString("reply"));
break;
}
}
}
}
效果展示

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/263851.html
標籤:其他
上一篇:TextView繪制流程
