আমার পদ্ধতি:
/ থেকে পরিষেবা / ক্রিয়াকলাপ থেকে বার্তা প্রেরণ এবং গ্রহণ পরিচালনা করতে শ্রেণি:
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);
এটি কীভাবে কাজ করে:
আপনি যে ক্রিয়াকলাপটি শুরু করেন বা পরিষেবা বাঁধেন সেই ক্রিয়াকলাপে পরিষেবা "অনবাইন্ড" পদ্ধতিগুলি তার মেসেজ ম্যানেজারকে বাইন্ডারটি ফিরিয়ে দেয়, "পরিষেবা সংযোগ" ইন্টারফেস পদ্ধতি প্রয়োগের মাধ্যমে "ক্রিয়াকলাপের মধ্যে" "অন সার্ভিস সংযুক্ত" আপনি এই আইবিন্ডারটি পেয়ে থাকেন এবং এটি ব্যবহার করে আপনাকে মেসেজম্যানেজারের উদ্যোগ দেয়। ক্রিয়াকলাপটি তার মেসেজ ম্যানেজারটি মেসেজহ্যান্ডলার প্রেরণ করার পরে পরিষেবাটিতে হ্যান্ডশেক প্রেরণ করে যাতে এটি তার "মেসেজহ্যান্ডলার" প্রেরককে ("ব্যক্তিগত বার্তাব্যাপী এমএমএসজিএসেন্ডার;" মেসেজ ম্যানেজারে) সেট করতে পারে। পরিষেবাটি করাটি তার বার্তা কে প্রেরণ করে তা জানেন।
আপনি মেসেজ ম্যানেজারে "প্রেরক" এর মেসেঞ্জারের একটি তালিকা / সারি ব্যবহার করে এটি বাস্তবায়ন করতে পারেন যাতে আপনি বিভিন্ন ক্রিয়াকলাপ / পরিষেবাদিতে একাধিক বার্তা প্রেরণ করতে পারেন বা আপনি বার্তা ম্যানেজারে "রিসিভার" মেসেঞ্জারের একটি তালিকা / সারিতে ব্যবহার করতে পারেন যাতে আপনি একাধিক গ্রহণ করতে পারেন বিভিন্ন ক্রিয়াকলাপ / পরিষেবা থেকে প্রাপ্ত বার্তা message
"মেসেজ ম্যানেজার" ইভেন্টে আপনার কাছে প্রাপ্ত সমস্ত বার্তার একটি তালিকা রয়েছে।
আপনি যেমন "ক্রিয়াকলাপের মেসেঞ্জার" এবং "সার্ভিস মেসেঞ্জার" এর মধ্যে এই "মেসেজ ম্যানেজার" উদাহরণটি ব্যবহার করে সেটি স্বয়ংক্রিয়ভাবে দেখতে পাচ্ছেন, এটি "অন সার্ভিস সংযুক্ত" পদ্ধতি এবং "হ্যান্ডশেক" ব্যবহারের মাধ্যমে করা হয়।
আশা করি এটি আপনার জন্য সহায়ক :) আপনাকে অনেক ধন্যবাদ! বাই: ডি
busy-wait
কার্যকলাপ করতে পারি ? আপনি দয়া করে ব্যাখ্যা করতে পারেন?