使用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之开发消息通知栏

    Android之开发消息通知栏

    本文主要介绍了Android开发消息通知栏的相关知识。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-04-04
  • 基于Android实现一个简易音乐播放器

    基于Android实现一个简易音乐播放器

    在Android平台上开发一个音乐播放器是一项常见的任务,这涉及到对音频文件的处理、用户界面设计以及多媒体框架的运用,本项目基于样例代码进行扩展,虽然功能相对简单,但包含了Android音乐播放器开发的核心知识点,需要的朋友可以参考下
    2024-08-08
  • Android 实现界面刷新的几种方法

    Android 实现界面刷新的几种方法

    这篇文章主要介绍了Android 实现界面刷新的相关资料,这里提供了几种方法及实例代码,具有一定的参考价值,需要的朋友可以参考下
    2016-11-11
  • Android实现跑马灯效果的代码详解

    Android实现跑马灯效果的代码详解

    Android中实现跑马灯效果有多种方式,本文给大家介绍了Android实现跑马灯效果的简单示例,对大家的学习或工作有一定的帮助,感兴趣的朋友可以参考下
    2018-05-05
  • 分享几个Android开发有用的程序代码

    分享几个Android开发有用的程序代码

    本文主要是给大家分享了几个常用而且很实用的程序代码片段,都是个人项目中提取出来的,有需要的小伙伴可以直接拿走使用
    2015-02-02
  • 完美解决Android Studio集成crashlytics后无法编译的问题

    完美解决Android Studio集成crashlytics后无法编译的问题

    下面小编就为大家带来一篇完美解决Android Studio集成crashlytics后无法编译的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Android自定义验证码输入框的方法实例

    Android自定义验证码输入框的方法实例

    这篇文章主要给大家介绍了关于Android自定义验证码输入框的相关资料,文中通过实例代码介绍的非常详细,对各位Android开发者们具有一定的参考学习价值,需要的朋友可以参考下
    2022-02-02
  • Android多线程断点续传下载示例详解

    Android多线程断点续传下载示例详解

    这篇文章主要为大家详细介绍了Android多线程断点续传下载示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • Android图片压缩以及优化实例

    Android图片压缩以及优化实例

    本篇文章主要介绍了Android图片压缩以及优化实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Android开发之基于DialogFragment创建对话框的方法示例

    Android开发之基于DialogFragment创建对话框的方法示例

    这篇文章主要介绍了Android开发之基于DialogFragment创建对话框的方法,结合实例形式分析了DialogFragment创建对话框的具体功能与布局相关实现技巧,需要的朋友可以参考下
    2017-08-08

最新评论