วิธีการของฉัน:
ชั้นเรียนเพื่อจัดการส่งและรับข้อความจาก / ถึงบริการ / กิจกรรม:
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.util.Log;
import java.util.ArrayList;
import java.util.List;
public class MessageManager {
public interface IOnHandleMessage{
// Messages
int MSG_HANDSHAKE = 0x1;
void onHandleMessage(Message msg);
}
private static final String LOGCAT = MessageManager.class.getSimpleName();
private Messenger mMsgSender;
private Messenger mMsgReceiver;
private List<Message> mMessages;
public MessageManager(IOnHandleMessage callback, IBinder target){
mMsgReceiver = new Messenger(new MessageHandler(callback, MessageHandler.TYPE_ACTIVITY));
mMsgSender = new Messenger(target);
mMessages = new ArrayList<>();
}
public MessageManager(IOnHandleMessage callback){
mMsgReceiver = new Messenger(new MessageHandler(callback, MessageHandler.TYPE_SERVICE));
mMsgSender = null;
mMessages = new ArrayList<>();
}
/* START Getter & Setter Methods */
public Messenger getMsgSender() {
return mMsgSender;
}
public void setMsgSender(Messenger sender) {
this.mMsgSender = sender;
}
public Messenger getMsgReceiver() {
return mMsgReceiver;
}
public void setMsgReceiver(Messenger receiver) {
this.mMsgReceiver = receiver;
}
public List<Message> getLastMessages() {
return mMessages;
}
public void addMessage(Message message) {
this.mMessages.add(message);
}
/* END Getter & Setter Methods */
/* START Public Methods */
public void sendMessage(int what, int arg1, int arg2, Bundle msgData){
if(mMsgSender != null && mMsgReceiver != null) {
try {
Message msg = Message.obtain(null, what, arg1, arg2);
msg.replyTo = mMsgReceiver;
if(msgData != null){
msg.setData(msgData);
}
mMsgSender.send(msg);
} catch (RemoteException rE) {
onException(rE);
}
}
}
public void sendHandshake(){
if(mMsgSender != null && mMsgReceiver != null){
sendMessage(IOnHandleMessage.MSG_HANDSHAKE, 0, 0, null);
}
}
/* END Public Methods */
/* START Private Methods */
private void onException(Exception e){
Log.e(LOGCAT, e.getMessage());
e.printStackTrace();
}
/* END Private Methods */
/** START Private Classes **/
private class MessageHandler extends Handler {
// Types
final static int TYPE_SERVICE = 0x1;
final static int TYPE_ACTIVITY = 0x2;
private IOnHandleMessage mCallback;
private int mType;
public MessageHandler(IOnHandleMessage callback, int type){
mCallback = callback;
mType = type;
}
@Override
public void handleMessage(Message msg){
addMessage(msg);
switch(msg.what){
case IOnHandleMessage.MSG_HANDSHAKE:
switch(mType){
case TYPE_SERVICE:
setMsgSender(msg.replyTo);
sendHandshake();
break;
case TYPE_ACTIVITY:
Log.v(LOGCAT, "HERE");
break;
}
break;
default:
if(mCallback != null){
mCallback.onHandleMessage(msg);
}
break;
}
}
}
/** END Private Classes **/
}
ในตัวอย่างกิจกรรม:
public class activity extends AppCompatActivity
implements ServiceConnection,
MessageManager.IOnHandleMessage {
[....]
private MessageManager mMessenger;
private void initMyMessenger(IBinder iBinder){
mMessenger = new MessageManager(this, iBinder);
mMessenger.sendHandshake();
}
private void bindToService(){
Intent intent = new Intent(this, TagScanService.class);
bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);
/* START THE SERVICE IF NEEDED */
}
private void unbindToService(){
/* UNBIND when you want (onDestroy, after operation...)
if(mBound) {
unbindService(mServiceConnection);
mBound = false;
}
}
/* START Override MessageManager.IOnHandleMessage Methods */
@Override
public void onHandleMessage(Message msg) {
switch(msg.what){
case Constants.MSG_SYNC_PROGRESS:
Bundle data = msg.getData();
String text = data.getString(Constants.KEY_MSG_TEXT);
setMessageProgress(text);
break;
case Constants.MSG_START_SYNC:
onStartSync();
break;
case Constants.MSG_END_SYNC:
onEndSync(msg.arg1 == Constants.ARG1_SUCCESS);
mBound = false;
break;
}
}
/* END Override MessageManager.IOnHandleMessage Methods */
/** START Override ServiceConnection Methods **/
private class BLEScanServiceConnection implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
initMyMessenger(iBinder);
mBound = true;
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
mMessenger = null;
mBound = false;
}
}
/** END Override ServiceConnection Methods **/
ในตัวอย่างบริการ:
public class Blablabla extends Service
implements MessageManager.IOnHandleMessage {
[...]
private MessageManager mMessenger;
@Nullable
@Override
public IBinder onBind(Intent intent) {
super.onBind(intent);
initMessageManager();
return mMessenger.getMsgReceiver().getBinder();
}
private void initMessageManager(){
mMessenger = new MessageManager(this);
}
/* START Override IOnHandleMessage Methods */
@Override
public void onHandleMessage(Message msg) {
/* Do what you want when u get a message looking the "what" attribute */
}
/* END Override IOnHandleMessage Methods */
ส่งข้อความจากกิจกรรม / บริการ:
mMessenger.sendMessage(what, arg1, arg2, dataBundle);
มันทำงานอย่างไร:
ในกิจกรรมที่คุณเริ่มหรือผูกบริการ วิธีการบริการ "OnBind" จะส่งคืน Binder ให้กับ MessageManager ของเขาในกิจกรรมผ่านการใช้วิธีการ "อินเตอร์เฟสการเชื่อมต่อบริการ" อินเตอร์เฟส "OnServiceConnected" คุณจะได้รับ IBinder นี้และเริ่มใช้ MessageManager ของคุณ หลังจากกิจกรรมได้เริ่มต้น MessageManager ของเขา MessageHandler ส่งและจับมือกับบริการเพื่อให้สามารถตั้งค่าผู้ส่ง "MessageHandler" ของเขา ("ส่วนตัว Messenger mMsgSender;" ใน MessageManager) ทำสิ่งนี้บริการรู้ว่าใครส่งข้อความของเขา
คุณยังสามารถใช้สิ่งนี้ได้โดยใช้ List / Queue ของ Messenger "ผู้ส่ง" ใน MessageManager เพื่อให้คุณสามารถส่งข้อความหลายข้อความไปยังกิจกรรม / บริการที่แตกต่างกันหรือคุณสามารถใช้ List / Queue of Messenger "รับ" ใน MessageManager ข้อความจากกิจกรรม / บริการต่างๆ
ในอินสแตนซ์ "MessageManager" คุณมีรายการข้อความทั้งหมดที่ได้รับ
ในขณะที่คุณสามารถเห็นการเชื่อมต่อระหว่าง "กิจกรรมของ Messenger" และ "บริการ Messenger" โดยใช้อินสแตนซ์ "MessageManager" นี้เป็นไปโดยอัตโนมัติมันจะทำผ่านวิธี "OnServiceConnected" และผ่านการใช้ "จับมือกัน"
หวังว่านี่จะเป็นประโยชน์สำหรับคุณ :) ขอบคุณมาก! ลาก่อน: D
busy-wait
ทำกิจกรรมได้อย่างไร คุณช่วยอธิบายได้มั้ย