service与activity双向通信

MainActivity

public class MainActivity extends AppCompatActivity {
 
    /*
     标记是否已经绑定Service。
     Marking whether the service has been bound.
     */
    private boolean bServiceConnected;
 
    /*
     这个Messenger用于向Service发送Message。
     This Messenger is used to send message to service.
     */
    private Messenger mSendMessenger;
 
    /*
     这个Messenger用于接收服务器发送的Message。
     This Messenger is used to receive message from service.
     */
    private Messenger mReceiveMessenger;
 
 
    private TextView mMessageText;
 
    /*
     处理从Service收到的Message。
     Handling Messages received from service.
     */
    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case MessageSource.MSG_CREATE_FLOAT:
                    String strI = (String) msg.obj;
                    mMessageText.setText(strI);
                    break;
                case MessageSource.MSG_CREATE_INT:
                    String strF = (String) msg.obj;
                    mMessageText.setText(strF);
                    break;
                case MessageSource.MSG_CREATE_STRING:
                    String strS = (String) msg.obj;
                    mMessageText.setText(strS);
                    break;
                default:
                    break;
            }
        }
    };
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        mMessageText = (TextView) findViewById(R.id.message_from_service);
 
        Button createIntBt = (Button) findViewById(R.id.let_service_create_int);
        createIntBt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                handleButtonClick(MessageSource.MSG_CREATE_INT);
            }
        });
 
        Button createFloatBt = (Button) findViewById(R.id.let_service_create_float);
        createFloatBt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                handleButtonClick(MessageSource.MSG_CREATE_FLOAT);
            }
        });
 
        Button createStringBt = (Button) findViewById(R.id.let_service_create_string);
        createStringBt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                handleButtonClick(MessageSource.MSG_CREATE_STRING);
            }
        });
    }
 
    @Override
    protected void onResume() {
        super.onResume();
        if (!bServiceConnected) {
            bindService();
        }
 
    }
 
    @Override
    protected void onPause() {
        super.onPause();
        unbindService(mServiceConnection);
    }
 
    private void handleButtonClick(int type) {
        if (bServiceConnected) {
            Message msg = new Message();
            msg.what = type;
            msg.replyTo = mReceiveMessenger;
            try {
                mSendMessenger.send(msg);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        } else {
            Toast.makeText(this, "Service has not been bound.", Toast.LENGTH_SHORT).show();
        }
    }
 
    private void bindService() {
        Intent intent = new Intent(getApplicationContext(), MainService.class);
        bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);
    }
 
    private ServiceConnection mServiceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            bServiceConnected = true;
            mSendMessenger = new Messenger(iBinder);
            mReceiveMessenger = new Messenger(mHandler);
        }
 
        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            bServiceConnected = false;
            mSendMessenger = null;
            mReceiveMessenger = null;
        }
    };
}

MainService

public class MainService extends Service {
 
 
    /*
     这个Handler负责接收Activity的Message,收到一个Message时,通过获取Message的replayTo得到一个Messenger实例,
     使用这个Messenger向Activity发送Message。
     This Handler is in charge of receiving Messages sending from Activity. When it receiving a
     Message, get The replayTo which is a Messenger instance from this Message. Using this Messenger
     to send Message to Activity.
     */
    private Handler mActMsgHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case MessageSource.MSG_CREATE_INT:
                    createAndSendInt(msg.replyTo);
                    break;
                case MessageSource.MSG_CREATE_FLOAT:
                    createAndSendFloat(msg.replyTo);
                    break;
                case MessageSource.MSG_CREATE_STRING:
                    createAndSendString(msg.replyTo);
                    break;
                default:
 
 
                    break;
            }
        }
    };
 
 
    /*
      这个Messenger用于向Activity发送Message。
      This Messenger is used to send Message to Activity.
     */
    private Messenger mSendMessenger = new Messenger(mActMsgHandler);
 
 
    /*
     假设有耗时的操作需要异步进行。
     Suppose we have long-running jobs and execute asynchronously.
     */
    private Executor mExecutor = Executors.newCachedThreadPool();
 
 
    public MainService() {
    }
 
 
    @Override
    public IBinder onBind(Intent intent) {
        return mSendMessenger.getBinder();
    }
 
 
    private void createAndSendInt(final Messenger messenger) {
        mExecutor.execute(new Runnable() {
            @Override
            public void run() {
                Random random = new Random();
                int ret = random.nextInt();
                String str = "Give you a int: " + ret;
                send(MessageSource.MSG_CREATE_INT, str, messenger);
 
 
            }
        });
    }
 
 
    private void createAndSendFloat(final Messenger messenger) {
        mExecutor.execute(new Runnable() {
            @Override
            public void run() {
                Random random = new Random();
                float ret = random.nextFloat();
                String str = "Give you a float: " + ret;
                send(MessageSource.MSG_CREATE_FLOAT, str, messenger);
            }
        });
    }
 
 
    private void createAndSendString(final Messenger messenger) {
        mExecutor.execute(new Runnable() {
            @Override
            public void run() {
                int len = MessageSource.STRING_SOURCE_ARRAY.length;
                Random random = new Random();
                int index = random.nextInt(len);
                String ret = MessageSource.STRING_SOURCE_ARRAY[index];
                String str = "Give you a string: " + ret;
                send(MessageSource.MSG_CREATE_STRING, str, messenger);
            }
        });
    }
 
 
    private void send(int type, String str, Messenger messenger) {
        Message msg = new Message();
        msg.what = type;
        msg.obj = str;
        try {
            messenger.send(msg);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
}

还有一个辅助的Class

MessageSource

public class MessageSource {
    public static final int MSG_CREATE_INT = 1;
    public static final int MSG_CREATE_FLOAT = 2;
    public static final int MSG_CREATE_STRING = 3;
 
    public static final String[] STRING_SOURCE_ARRAY = new String[]{"Awake from dreams",
            "I find the locked tower high",
            "Sober from wine", "I see the curtain hanging low",
            "As last year spring grief seems to grow",
            "Amid the falling blooms alone stand I",
            "In the fine rain a pair of swallows fly",
            "I still remember when I first saw pretty Ping",
            "In silken dress embroidered with two hearts in a ring",
            "Revealing lovesickness by touching pipa’s string",
            "The moon shines bright just as last year",
            "It did see her like a cloud disappear"};
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值