我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android 两个Service的相互监视实现代码

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android 两个Service的相互监视实现代码

两个Service之间相互监视的实现

在实际开发中可能需要用到两个Service相互监视的情况,本示例就是实现此功能以作参考。

服务A:


public class ServiceA extends Service {
  private static final String TAG = ServiceA.class.getSimpleName();
  MyBinder mBinder;
  MyServiceConnection mServiceConnection;
  PendingIntent mPendingIntent;
  @Override
  public void onCreate() {
    super.onCreate();
    if(mBinder==null)
    {
      mBinder=new MyBinder();
    }
    mServiceConnection=new MyServiceConnection();
  }
  @Override
  public int onStartCommand(Intent intent, int flags, int startId) {
    ServiceA.this.bindService(new Intent(ServiceA.this,ServiceB.class),mServiceConnection, Context.BIND_IMPORTANT);
    mPendingIntent=PendingIntent.getService(this,0,intent,0);
    Notification.Builder builder=new Notification.Builder(this);
    builder.setTicker("守护服务A启动中")
        .setContentText("我是来守护服务B的")
        .setContentTitle("守护服务A")
        .setSmallIcon(R.mipmap.ic_launcher)
        .setContentIntent(mPendingIntent)
        .setWhen(System.currentTimeMillis());
    Notification notification=builder.build();
    startForeground(startId,notification);
    return START_STICKY;
  }
  @Override
  public IBinder onBind(Intent intent) {
    return mBinder;
  }
  public class MyBinder extends IBridgeInterface.Stub {
    @Override
    public String getName() throws RemoteException {
      return "name:"+TAG;
    }
  }
  class MyServiceConnection implements ServiceConnection {
    @Override
    public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
      String name=null;
      try {
        name= IBridgeInterface.Stub.asInterface(iBinder).getName();
      } catch (RemoteException e) {
        e.printStackTrace();
      }
      Toast.makeText(ServiceA.this,name+"连接成功",Toast.LENGTH_SHORT).show();
    }
    @Override
    public void onServiceDisconnected(ComponentName componentName) {
      Toast.makeText(ServiceA.this,TAG+"断开连接",Toast.LENGTH_SHORT).show();
      ServiceA.this.startService(new Intent(ServiceA.this,ServiceB.class));
      ServiceA.this.bindService(new Intent(ServiceA.this,ServiceB.class),mServiceConnection, Context.BIND_IMPORTANT);
    }
  }
}

服务B:


public class ServiceB extends Service {
  private static final String TAG = ServiceB.class.getSimpleName();
  private PendingIntent mPendingIntent;
  private MyBinder mBinder;
  private MyServiceConnection mServiceConnection;
  @Override
  public IBinder onBind(Intent intent) {
    return mBinder;
  }
  @Override
  public void onCreate() {
    super.onCreate();
    if (mBinder == null) {
      mBinder = new MyBinder();
    }
    mServiceConnection = new MyServiceConnection();
  }
  @Override
  public int onStartCommand(Intent intent, int flags, int startId) {
    this.bindService(new Intent(ServiceB.this, ServiceA.class), mServiceConnection, Context.BIND_IMPORTANT);
    mPendingIntent = PendingIntent.getService(this, 0, intent, 0);
    Notification.Builder builder = new Notification.Builder(this);
    builder.setTicker("守护服务B启动中")
        .setContentText("我是来守护服务A的")
        .setContentTitle("守护服务B")
        .setSmallIcon(R.mipmap.ic_launcher)
        .setContentIntent(mPendingIntent)
        .setWhen(System.currentTimeMillis());
    Notification notification = builder.build();
    startForeground(startId, notification);
    return START_STICKY;
  }
  public class MyBinder extends IBridgeInterface.Stub {
    @Override
    public String getName() throws RemoteException {
      return "name:"+TAG;
    }
  }
  class MyServiceConnection implements ServiceConnection {
    @Override
    public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
      String name=null;
      try {
        name=IBridgeInterface.Stub.asInterface(iBinder).getName();
      } catch (RemoteException e) {
        e.printStackTrace();
      }
      Toast.makeText(ServiceB.this, name + "连接成功", Toast.LENGTH_SHORT).show();
    }
    @Override
    public void onServiceDisconnected(ComponentName componentName) {
      Toast.makeText(ServiceB.this, TAG + "断开连接", Toast.LENGTH_SHORT).show();
      ServiceB.this.startService(new Intent(ServiceB.this, ServiceA.class));
      ServiceB.this.bindService(new Intent(ServiceB.this, ServiceA.class), mServiceConnection, Context.BIND_IMPORTANT);
    }
  }
}

IBridgeInterface.aidl


1 interface IBridgeInterface {
2   String getName();
3 }

界面:


public class MainActivity extends Activity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    startService(new Intent(this, ServiceA.class));
    startService(new Intent(this, ServiceB.class));
  }
}

AndroidManifest.xml


<service android:name=".services.ServiceA" />
    <service
      android:name=".services.ServiceB"
       android:process=":remote" />

由于涉及到跨进程,onServiceConnected() 方法中使用

IBridgeInterface.Stub.asInterface(iBinder).getName();
而不能直接类型转换

((ServiceA.MyBinder)iBinder).getName(); 

onStartCommand

onStartCommand() 方法必须返回整型数。整型数是一个值,用于描述系统应该如何在服务终止的情况下继续运行服务。

返回的值必须是以下常量之一:

START_NOT_STICKY

  如果系统在 onStartCommand() 返回后终止服务,则除非有挂起 Intent 要传递,否则系统不会重建服务。

START_STICKY

  如果系统在 onStartCommand() 返回后终止服务,则会重建服务并调用 onStartCommand(),但绝对不会重新传递最后一个 Intent。相反,除非有挂起 Intent 要启动服务(在这种情况下,将传递这些 Intent ),否则系统会通过空 Intent 调用 onStartCommand()。这适用于不执行命令、但无限期运行并等待作业的媒体播放器(或类似服务)。

START_REDELIVER_INTENT

  如果系统在 onStartCommand() 返回后终止服务,则会重建服务,并通过传递给服务的最后一个 Intent 调用 onStartCommand()。任何挂起 Intent 均依次传递。这适用于主动执行应该立即恢复的作业(例如下载文件)的服务。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

您可能感兴趣的文章:Android中Service与Activity之间通信的几种方式Android实现微信自动向附近的人打招呼(AccessibilityService)Android AccessibilityService实现微信抢红包插件Android Service服务不被停止详解及实现Android Service中使用Toast无法正常显示问题的解决方法Android基于service实现音乐的后台播放功能示例Android Activity 与Service进行数据交互详解浅谈Android Activity与Service的交互方式Android Service中方法使用详细介绍Android 如何保证service在后台不被kill


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android 两个Service的相互监视实现代码

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android 两个Service的相互监视实现代码

两个Service之间相互监视的实现 在实际开发中可能需要用到两个Service相互监视的情况,本示例就是实现此功能以作参考。 服务A:public class ServiceA extends Service {private stati
2022-06-06

Android实现两个ScrollView互相联动的同步滚动效果代码

本文实例讲述了Android实现两个ScrollView互相联动的同步滚动效果代码。分享给大家供大家参考,具体如下: 最近在做一个项目,用到了两个ScrollView互相联动的效果,简单来说联动效果意思就是滑动其中的一个ScrollView
2022-06-06

Service与Activity的相互通信怎么在Android项目中实现

今天就跟大家聊聊有关Service与Activity的相互通信怎么在Android项目中实现,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在Android中,Activity主要负责
2023-05-31

android图片类型之间相互转换实现代码

本文实例讲述了android图片类型之间相互转换实现代码。分享给大家供大家参考。具体如下: android在处理一写图片资源的时候,会进行一些类型的转换,现在有空整理一下: 1、Drawable → Bitmap Java代码如下:publ
2022-06-06

如何使用php代码实现两个变量值的互换

可以使用一个临时变量来实现两个变量值的互换。具体步骤如下:1. 定义两个变量并赋予初始值。2. 创建一个临时变量,并将其中一个变量的值赋给临时变量。3. 将另一个变量的值赋给第一个变量。4. 最后,将临时变量的值赋给第二个变量。以下是使用P
2023-09-04

Android编程实现两个Activity相互切换而不使用onCreate()的方法

本文实例讲述了Android编程实现两个Activity相互切换而不使用onCreate()的方法。分享给大家供大家参考,具体如下: 这里要实现的目的是: 有3个Activity: A,B,C,从A中可以进入B,B中可以进入C,并且B和C之
2022-06-06

Android Fragment与Activity之间的相互通信实例代码

Android Fragment与Activity之间的相互通信 前言自从Android3.0引入Fragment之后,主要是为了支持动态灵活的界面设计和屏幕的适配问题。Fragmenty不能单独存在,必须依赖Activity作为视图展示的
2022-06-06

Android编程实现两个Activity之间共享数据及互相访问的方法

本文实例讲述了Android编程实现两个Activity之间共享数据及互相访问的方法。分享给大家供大家参考,具体如下: 本人从windows编程转过来学习Android开发,一直在想如果两个Activity之间能够像C#或delphi中的F
2022-06-06

c语言如何实现两个值互相交换的函数

小编给大家分享一下c语言如何实现两个值互相交换的函数,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!c语言中实现两个值互换的函数。1、#include
2023-06-15

Redis shake实现可视化监控的示例代码

使用RedisShake可视化监控示例代码,可轻松实现RedisShake的运行状况和性能监控。该代码涵盖了RedisShakePrometheusExporter的安装、配置和使用,以及在Prometheus和Grafana中设置RedisShake目标、仪表盘和关键监控指标。通过可视化监控,可以实时了解RedisShake的运行状况,及时识别问题并采取纠正措施,从而提高其可用性和可靠性。
Redis shake实现可视化监控的示例代码
2024-04-02

Android实现Activity、Service与Broadcaster三大组件之间互相调用的方法详解

本文实例讲述了Android实现Activity、Service与Broadcaster三大组件之间互相调用的方法。分享给大家供大家参考,具体如下: 我们研究两个问题, 1、Service如何通过Broadcaster更改activity的
2022-06-06

Android自定义相机界面的实现代码

我们先实现拍照按钮的圆形效果哈,Android开发中,当然可以找美工人员设计图片,然后直接拿进来,不过我们可以自己写代码实现这个效果哈,最常用的的是用layout-list实现图片的叠加,我们这个layout命名为btn_take_phot
2022-06-06

android使用IJKPlayer播放视频流的实现代码

最近在做音视频相关的内容,这就无法避开视屏采集和播放的问题了,然后播放器使用的是 ijkplayer,这个东西使用 url 播放倒是没啥问题,只是我们的方案是接收 flv 的视频流进行播放,这需要借助 IAndroidIO 这个接口,也可以
2022-06-07

Android视频悬浮窗口实现的示例代码

前言 本文例子实现了点击显示悬浮窗口,同时窗口可播放视频,拖动位置,点击关闭及返回 APP 页面,通过例子来讲述悬浮窗口实现原理及细节处理,效果图如下所示:悬浮窗口.gif 原理 WindowManager 对 View 视图进行添加、移
2022-06-06

Android 实现监听的四种方法详解实例代码

直接上代码,大家可以参考下 (1)自身类作为事件监听器package cn.edu.gdmec.s07150745.work5; import android.support.v7.app.AppCompatActivity; import
2022-06-06

Android RecyclerView选择多个item的实现代码

模仿网易新闻客户端阅读偏好的频道选择,先看实现的页面: 直接上代码:import android.content.res.Resources; import android.content.res.TypedArray; import an
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录