使用Messenger实现Service的双向通信

Android体系架构中有一个解决方案:利用Android Messenger实现Service进程间双向通信。

MainActivity 类:

package com.example.messengeservicetest;

import android.app.Activity;
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
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.text.style.IconMarginSpan;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {

 private Messenger sender;

 private ServiceConnection conn;

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

  Button bind = (Button)findViewById(R.id.bind);
  Button start = (Button)findViewById(R.id.start);
  Button send = (Button)findViewById(R.id.send);

  bind.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
    getStart();
   }
  });

  start.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
    Intent intent = new Intent(MainActivity.this, MessengerService.class);
    startService(intent);
   }
  });

  send.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
    sendCount();
   }
  });
 }

 // 用于启动 MessengerService
 private void getStart(){

  conn = new ServiceConnection() {

   @Override
   public void onServiceDisconnected(ComponentName name) {

   }

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

    sender = new Messenger(service);
   }
  };

  Intent intent = new Intent(this, MessengerService.class);

//  startService(intent);
  bindService(intent, conn, Service.BIND_AUTO_CREATE);

 }

 // 传递数值
 private void sendCount(){

  Message msg = new Message();
  msg.arg1 = 20;
  msg.arg2 = 20;

  try {
   sender.send(msg);
  } catch (RemoteException e) {
   e.printStackTrace();
  }

 }

 @Override
 protected void onDestroy() {
  super.onDestroy();
  unbindService(conn);
 }

}

MessengerService.java 类:

package com.example.messengeservicetest;

import android.app.Service;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.util.Log;

public class MessengerService extends Service {

 Messenger messenger;
 Handler handler;
 int a, b;
 int sum = 0;

 @Override
 public IBinder onBind(Intent intent) {
  return messenger.getBinder();
 }

 @Override
 public void onCreate() {
  super.onCreate();

  handler = new Handler(){

   @Override
   public void handleMessage(Message msg) {
    super.handleMessage(msg);

    a = msg.arg1;
    b = msg.arg2;
   }

  };
  messenger = new Messenger(handler);
 }

 @Override
 public int onStartCommand(Intent intent, int flags, int startId) {

  int sum = subSum(a, b);
  System.out.println(sum + "");
  return super.onStartCommand(intent, flags, startId);
 }

 private int subSum(int a, int b){
  int sum = a + b;
  return sum;
 }
}

在 AndroidManifest.xml 中注册:

<service android:name=".MessengerService"></service>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android Messenger实现进程间双向通信

    简介 Messenger是安卓进程间通信 (IPC) 最为简单的方式,可以实现进程间双向通信.详见官网介绍 代码实现 服务端应用实现 MessengerService接收客户端发送的消息: package com.test.messengerservice; import android.app.Service; import android.content.Intent; import android.os.Handler; import android.os.IBinder; import

  • 使用Messenger实现Service的双向通信

    Android体系架构中有一个解决方案:利用Android Messenger实现Service进程间双向通信. MainActivity 类: package com.example.messengeservicetest; import android.app.Activity; import android.app.Service; import android.content.ComponentName; import android.content.Intent; import and

  • android使用Messenger绑定Service的多种实现方法

    如果你需要在不同进程间通信,你可以在Service中使用Messenger来实现进程中通信. 如果使用这种方式,Service中需要定义一个Handler对象(负责对客户端发送过来的Message进行响应). Messenger可以共享给client一个IBinder对象,client通过这个IBinder对象向Service发送Message,而前面提到的Handler对象是这一切的基础. 注:使用这种方式进行通信是不支持多线程的. 那就让我们来看看使用这种方式进行通信吧! 注:Service

  • Android使用Messenger实现service与activity交互

    service与activity交互的方式有多种,这里说说使用Messenger来实现两者之间的交互. Service程序: public class MessengerService extends Service { final Messenger mMessenger = new Messenger(new IncomingHandler()); @Override public IBinder onBind(Intent intent) { return mMessenger.getBi

  • Android bindService的使用与Service生命周期案例详解

    Android中有两种主要方式使用Service,通过调用Context的startService方法或调用Context的bindService方法,本文只探讨纯bindService的使用,不涉及任何startService方法调用的情况.如果想了解startService相关的使用,请参见<Android中startService的使用及Service生命周期>. bindService启动服务的特点 相比于用startService启动的Service,bindService启动的服务

  • Android中Messenger原理及基本用法详解

    这边博客主要记录一下Android中Messenger的基本原理和用法. 简单来讲,Messenger其实就是Binder通信的包装器,是一种基于消息传递的进程间通信工具. //Messenger实现了Parcelable接口,因此可以跨进程传输 public final class Messenger implements Parcelable { ............... } 通常情况下,我们可以在A进程中创建一个Messenger,然后将该Messenger传递给B进程. 于是,B进

  • Android检测Activity或者Service是否运行的方法

    需求:假设我们的APP有3个页面AActivity,BActivity,CActivity,我们的APP需要一直运行在前台(特殊设备),要求实现一个监控服务,来监视APP是否运行,如果有3个页面都不运行了就说明这个APP已经挂掉了,否则说明APP在运行状态,不做处理,挂掉之后,我们需要重新启动App来让它继续处理运行状态,对外暴露一个来停止监控服务的广播,这样我们想停止监控服务时,发送一个广播即可. 思路:实现一个双进程的监控服务,服务中写一个定时器 Timer 来重复进行检测是否正在运行,如果

  • 详解Android中Intent的使用方法

    一.Intent的用途 Intent主要有以下几种重要用途: 1. 启动Activity:可以将Intent对象传递给startActivity()方法或startActivityForResult()方法以启动一个Activity,该Intent对象包含了要启动的Activity的信息及其他必要的数据. 2. 启动Service:可以将Intent对象传递给startService()方法或bindService()方法以启动一个Service,该Intent对象包含了要启动的Service的

  • Android中bindService基本使用方法概述

    Android中有两种主要方式使用Service,通过调用Context的startService方法或调用Context的bindService方法,本文只探讨纯bindService的使用,不涉及任何startService方法调用的情况.如果想了解startService相关的使用,请参见<Android中startService基本使用方法概述>. bindService启动服务的特点 相比于用startService启动的Service,bindService启动的服务具有如下特点:

  • Android IPC机制利用Messenger实现跨进程通信

    写作原因:跨进程通信的实现和理解是Android进阶中重要的一环.下面博主分享IPC一些相关知识.操作及自己在学习IPC过程中的一些理解.这一章使用Messenger实现跨进程通信,其中bindService基础部分参见Android IPC机制绑定Service实现本地通信. 跨进程简介 在介绍使用Messenger跨进程通信之前先要了解以下问题:为什么需要跨进程通信?只有有了需求才有学习的价值.我个人将不同进程简单的理解为不同的应用程序(当然也有例外,比如可以在同一个应用程序中开启两个或多个

随机推荐