使用Messenger实现Service的双向通信

 更新时间:2021年05月21日 10:21:00   作者:antimage08  
这篇文章主要为大家详细介绍了使用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>

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

您可能感兴趣的文章:

相关文章

  • Android 中ActionBar+fragment实现页面导航的实例

    Android 中ActionBar+fragment实现页面导航的实例

    这篇文章主要介绍了Android 中ActionBar+fragment实现页面导航的实例的相关资料,希望通过本文能帮助到大家实现这样的功能,需要的朋友可以参考下

    2017-09-09

  • Android实现不同apk间共享数据的方法(2种方法)

    Android实现不同apk间共享数据的方法(2种方法)

    这篇文章主要介绍了Android实现不同apk间共享数据的方法,介绍了apk自定义借口实现数据共享与基于User id的数据共享,并重点介绍了基于User id的数据共享实现技巧,非常简单实用,需要的朋友可以参考下

    2016-01-01

  • android电源信息查看(电量、温度、电压)实例代码

    android电源信息查看(电量、温度、电压)实例代码

    这篇文章主要介绍了android电源信息查看方法,以实例形式较为详细的分析了Android实现电源电量、电压、温度等信息查看的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下

    2015-10-10

  • Android 本地广播和强制下线功能的实现代码

    Android 本地广播和强制下线功能的实现代码

    这篇文章主要介绍了Android 本地广播和强制下线功能的实现代码,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

    2020-07-07

  • Android实现Flip翻转动画效果

    Android实现Flip翻转动画效果

    这篇文章主要介绍了Android实现Flip翻转动画效果,对Android程序设计人员有很好的参考借鉴价值,需要的朋友可以参考下

    2014-08-08

  • Android实现带进度条的WebView

    Android实现带进度条的WebView

    这篇文章主要介绍了Android实现带进度条的WebView,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    2019-11-11

  • Android时间选择器、日期选择器实现代码

    Android时间选择器、日期选择器实现代码

    这篇文章主要为大家分别介绍了Android时间选择器、日期选择器实现代码,感兴趣的小伙伴们可以参考一下

    2016-04-04

  • Android面试笔记之常问的Context

    Android面试笔记之常问的Context

    Android技术面试确实常常被问到Context,大概问题就是说说你对Context的理解吧,当时脑袋里浮现了是原来看到的文章片段乱说一通,这样还是不行的。平时还是多积累知识,深刻理解Context,在项目开发过程中也能避免一些陷入坑中。下面就来看看个人的一些总结吧。

    2016-12-12

  • Android列表控件Spinner简单用法示例

    Android列表控件Spinner简单用法示例

    这篇文章主要介绍了Android列表控件Spinner简单用法,结合实例形式分析了Android列表控件Spinner的布局与功能实现技巧,需要的朋友可以参考下

    2017-12-12

  • Android Shape控件美化实现代码

    Android Shape控件美化实现代码

    本文主要介绍Android Shape 控件的美化, 大家在开发Android程序的时候对系统自带的控件进行修改,这里给大家一个实例,供大家参考

    2016-07-07

最新评论

声明:本站(华域联盟www.cnhackhy.com)所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。