八、服务详解

微服务详解(八):最佳做法和一般原则 微服务详解(一):概述 微服务详解(二):解决方案 微服务详解(三):设置开发环境 微服务详解(四):领域驱动设计 微服务详解(五):实现微服务 微服务详解(六):部署与测试 微服务详解(七):微服务的安全性 微服务详解(八):最佳做法和一般原则 微服务详解(九):故障排除指南 1.概述和心态 把整体式的生产系统更新到微服务的时候,比起从零开始构建一个系统,将需要更好的规划; ... 阅读详情

1. 服务和进程优先级

1.1 什么是服务?

windows下的服务:没有界面、长期运行在后台的应用程序;

android下的服务:应用程序的一个组件,没有界面activity,长期运行在后台;

进程:是应用程序运行的载体。

进程与应用程序之间的关系: linux操作系统创建一个进程,这个进程负责运行dalvik虚拟机,Android的应用程序都是运行在dalvik虚拟机上的。

1.2 进程的生命周期:

(1)应用程序一启动的时候就创建了进程;

(2)当应用程序退出的时候进程并没有退出;

(3)只有手工停止这个进程,进程才会结束;

操作系统尽量长时间的运行应用程序的进程,为了保证内存空间不被大量占用,它会按照进程的优先级,从低到高一级一级的杀死进程,直到内存空间被清理的差不多。

1.3 进程的等级:

(1)Foreground process(前台进程)

应用程序,用户正在操作,activity的onresume方法被执行了,可以相应点击事件。

(2)Visible process (可视进程)

应用程序的ui界面,用户还可以看到,但是不能操作了。

(3)Service process (服务进程)

应用程序没有界面,但是有一个后台的服务还处于运行状态

(4)Background process(后台进程)

应用程序没有服务处于运行状态,应用程序被最小化了,activity执行了onstop方法

(5)Empty process (空进程)

没有任何组件运行,所有的activity都关闭了,任务栈清空了

2. 服务的特点

  • 服务的特点:

    服务被创建时调用onCreate、onStartCommand;

    服务只能被创建一次,可以开启多次onStartCommand;

    服务只能被停止一次;

    没有onPause、onStop、onResume、onRestart方法,因为service没有界面,长期运行在后台。

  • 生命周期的方法:

    onCreate:服务被创建的时候调用这个方法;

    onStartCommand :开启服务

    onDestroy:销毁服务

3. 电话窃听器的模板代码(重点)

  • 示例代码:

(1)在工程中添加一个服务Service,重新onCreate方法:

public class DHQTService extends Service {
    /**
     * 当服务被创建的时候调用这个方法
     */
    @Override
    public void onCreate() {
        System.out.println("=========onCreate=========");
        super.onCreate();

        TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);

        tm.listen(new MyListener(), PhoneStateListener.LISTEN_CALL_STATE);

    }
}

(2)在清单文件中配置服务:

<service android:name="com.itheima.dhqtq.DHQTService"></service>

(3)在activity中开启服务:

service = new Intent(this, DHQTService.class);
// 开启服务
startService(service);

(4)在onCreate方法中使用TelephonyManager监听电话的状态:

/**
 * 当服务被创建的时候调用这个方法
 */
@Override
public void onCreate() {
    System.out.println("=========onCreate=========");
    super.onCreate();

    TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);

    tm.listen(new MyListener(), PhoneStateListener.LISTEN_CALL_STATE);
}


/**
 *自定义一个电话状态监听器,监听电话
 */
private class mylistener extends phonestatelistener {

    private MediaRecorder r;

    @Override
    public void onCallStateChanged(int state, String incomingNumber) {

        try {
            // super.onCallStateChanged(state, incomingNumber);
            System.out.println("====state===============" + state);
            switch (state) {
                case TelephonyManager.CALL_STATE_IDLE: // 闲置状态
                        System.out.println("关闭录音机,上传音频文件..................");
                    if(r != null){
                        r.stop();
                        r.release();
                        r = null;
                        // 上传文件
                    }
                break;

                case TelephonyManager.CALL_STATE_RINGING: // 闲置状态
                    System.out.println("准备好录音机,准备录音..................");

                    r = new MediaRecorder();
                    r.setAudioSource(MediaRecorder.AudioSource.MIC);
                    r.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);

                    // r.setOutputFile("/mnt/sdcard/info.3gp");
                    r.setOutputFile(Environment.getExternalStorageDirectory()+"/info.3gp");
                    r.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                    r.prepare(); 

                break;

                case TelephonyManager.CALL_STATE_OFFHOOK: // 闲置状态
                    System.out.println("开始录音..................");
                    r.start();
                break;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

(5)在清单配置文件中添加权限:

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

4. start开启服务的生命周期(重点)

  • 服务的特点:

    (1)服务被创建时调用onCreate、onStartCommand;

    (2)服务只能被创建一次,可以开启多次onStartCommand;

    (3)服务只能被停止一次;

    (4)没有onPause、onStop、onResume、onRestart方法,因为service没有界面,长期运行在后台。

  • 生命周期的方法:

    onCreate:服务被创建的时候调用这个方法;

    onStartCommand :开启服务

    onDestroy:销毁服务

5. bind方式开启服务的生命周期(重点)

bindService绑定服务、unBindService解除绑定的服务;

服务是在被绑定的时候被创建,调用oncreate、onbind方法;
服务只能被绑定一次;
服务只能被解除一次,解除绑定的时候调用onUnbind、onDestrory方法,如果多次解除绑定会抛出异常;

推荐的方式:

startService:开启并创建一个服务,服务长期运行在后台;
bindService:绑定服务,可以调用服务里面的方法;
unBindService:解除服务,停止服务里面的方法;
stopService:停止服务,销毁服务对象;

为什么要引入bindservice的API ?

为了调用服务中的业务逻辑方法。

6. 绑定服务调用服务方法的过程

通过bindservice方式实现调用服务里面业务逻辑方法:

步骤:

(1)在服务类中创建一个中间人MyBinder,继承了Binder,Binder实现了IBinder接口:

public class MyBinder extends Binder{

}

(2)在服务类里面创建了一个MyBinder的成员变量:

private MyBinder myBinder;

(3)在MyBinder类中写一个方法用于调用服务的业务逻辑方法:

public class MyBinder extends Binder{

    // 使用中间人调用服务里的方法
    public void callMethodInService(){
        methodInService();
    }
}

(4)在activity中bindService时,定义了ServiceConnection,在这个连接中实现了两个:

private class MyConn implements ServiceConnection {
    /**
     * 服务连接成功时调用这个方法
     */
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        // 得到服务绑定成功后返回的中间人MyBinder对象
        myBinder = (MyBinder) service;
    }

    /**
     * 服务断开成功时调用这个方法
     */
    @Override
    public void onServiceDisconnected(ComponentName name) {
        System.out.println("-------onServiceDisconnected-------");
    }
}

(5)通过在activity中通过中间人条用服务的业务逻辑方法:

myBinder.callMethodInService();

7. 绑定服务抽取接口(重点)

接口(interface):对外开放暴露的功能,但是不会暴露功能实现的细节;

让中间人实现服务接口的目的:只对外暴露接口里面业务逻辑方法,隐藏中间人里面的其他方法;

步骤:

(1)创建一个服务的接口类,里面包含需要对外暴露的业务逻辑方法:

public interface IService {
    public void callMethodInService();
}

(2)让服务中的中间人实现了服务的接口类:

private class MyBinder extends Binder implements IService{

    // (实现服务接口中的方法)使用中间人调用服务里的方法
    public void callMethodInService(){
        methodInService();
   }
}

(3)在activity中声明接口的成员变量:

private IService myBinder;

(4)强制转换成服务的接口类型

private class MyConn implements ServiceConnection {

    /**
     * 服务连接成功时调用这个方法
     */
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        // 强制转换成服务的接口类型
        myBinder = (IService) service;
    }

(5)在activity中通过接口的成员变量调用服务的业务逻辑方法:

public void call(View view){
    myBinder.callMethodInService();
}

8. 绑定服务的应用场景

应用场景:

(1)需要在后台运行一定的业务逻辑,而且需要与服务器端交互数据,都是写在服务里面的。

(2)天气预报、股票行情软件;

9. 利用服务注册广播接收者

操作频繁的广播事件,如果只是在清单配置文件配置,是不生效的。需要使用代码注册才能生效;

步骤:

// 注册广播接收者

// 1、得到广播接收者的对象

ScreenBroadCastReceiver screenReceiver = new ScreenBroadCastReceiver();

// 2、创建一个intentFilter对象
IntentFilter filter = new IntentFilter();

// 3、注册接收的事件类型
filter.addAction("android.intent.action.SCREEN_ON");
filter.addAction("android.intent.action.SCREEN_OFF");

// 4、注册广播接收者
this.registerReceiver(screenReceiver, filter);

10. 远程服务aidl的写法(重点)

本地服务:写在自己的应用程序的工程里的服务 ,使用自己应用程序的进程运行这个服务;

远程服务:写在别的应用程序的工程里的服务,使用别的应用程序的进程运行这个服务(安装在同一个手机上的应用程序);

IPC: Inter Process Communication(进程间的通讯);

aidl: Android Interface definition language 安卓接口定义语言;

aidl的接口类里面不需要public 、protected、private 等修饰符,默认是公开共享;

步骤:

(1)创建一个服务的接口类,里面包含需要对外暴露的业务逻辑方法:

(2)让服务中的中间人实现了服务的接口类:

(3)修改并拷贝接口文件:

(4)在本地服务的工程中的activity里,绑定服务:

(5)通过接口调用远程服务的方法:

UDS详解(八)——14服务、22服务、2E服务、23服务、3D服务 介绍UDS服务中的14、22、2E、23、3D 阅读详情

相关推荐

UDS诊断服务基础详解之八—19 04服务(快照数据)

本文分享快照数据与 19 04 服务学习心得。快照数据即 DTC 快照,分全局与局部,能还原故障时刻状态,助定位偶发故障。19 04 服务可按 DTC 号报快照信息,含特定请求、正响应格式,正响应有实例;支持 0x12、0x13、0x31 等否定响应码,也有应用实例。文章强调快照数据对汽车故障诊断的重要性,及保证其准确性的必要性。​

车载网络小D的博客 2889

安卓期末复习题库

参考答案 :对 33、通过ListView中的android:dividerHeight属性可以设置分割线的高度。参考答案 :错 Fragment是被嵌入到Activity中使用的,因此他的生命周期的状态直接受其所属Activity的生命周期状态影响。

qq_62480054的博客 5748

Centos7安装Tesseract5.5.0+SpringBoot集成部署(离线版)

Java 中实现 OCR(光学字符识别)功能,可以使用 Tesseract OCR,这是一个开源的 OCR 引擎,支持多种语言,并且可以在 Java 中通过 Tesseract API 进行集成。

Leopard锋的博客 2320

Android 第八天_重置版_服务service

##01_服务和进程优先级 * 什么是服务?         windows下的服务:没有界面、长期运行在后台的应用程序;            android下的服务:应用程序的一个组件,没有界面activity,长期运行在后台;                 进程:是应用程序运行的载体。            进程与应用程序之间的关系: linux操作系统创建一个进程,这

a_salt_fish的博客 750

利用Virtuoso IC 618进行LDO稳定性分析与补偿设计

本文详细介绍了如何利用Virtuoso IC 618进行LDO稳定性分析与补偿设计。通过搭建仿真环境、运行STB分析诊断环路问题,并深入探讨密勒补偿、调零电阻等关键技术,帮助工程师在Virtuoso平台中高效完成LDO的稳定性优化与验证,确保芯片在各种工艺角下的鲁棒性。

weixin_29170327的博客 162

ESP32-CAM与TFT屏幕实时图像传输:Arduino环境下的OV2640驱动实践

本文详细介绍了在Arduino环境下实现ESP32-CAM与TFT屏幕实时图像传输的完整实践方案。重点解析了OV2640摄像头的驱动配置、硬件引脚连接、TFT屏幕初始化及图像显示优化技巧,帮助开发者快速构建稳定的实时图像显示系统,适用于物联网监控、门禁系统等场景。

cuda7parallel的博客 115

期末安卓习题--第八章

第八章安卓第八章选择题判断题填空题 安卓第八章 选择题 Context.startService方式的service生命周期下面正确的描述是(A ). • A、启动时 onCreate() –> onStartCommand() • B、停止时,onStop()–> onDestroy() • C、启动时 onCreate()–>onStart()->onResume() • D、停止时,onStop() 以下关于Service的说法,正确的是(C ) •

万事胜意 6325

win11本地部署openclaw实操第1集

OpenClaw 是一款开源、本地优先、可自托管的 AI 智能体(AI Agent)网关 / 自动化框架,核心是让 AI 从 “只聊天、给建议” 变成 “能在你电脑上真做事” 的数字助手。

weixin_44626085的博客 7128

Service

1.服务是运行在后台的,可以用来做一些耗时的操作,后台并不是子线程,服务运行在主线程. public class MainActivity extends AppCompatActivity { ServiceConnection mConnection = new ServiceConnection() { @Override public void

viking_xhg的博客 485

《QGIS快速入门与应用基础》021:插件仓库 URL 获取与添加

详细介绍了在QGIS中添加第三方插件仓库的方法。首先强调必须从官方推荐、开源社区等可靠渠道获取插件仓库URL以确保安全性,并列出了4类可信获取渠道。文章分步骤讲解了URL添加流程,包括打开插件管理器设置面板、填写仓库信息、刷新缓存验证等操作。针对常见问题如URL格式错误、连接失败等提供了具体解决方案。最后总结指出,成功添加第三方仓库后即可直接搜索安装各类专业插件,从而扩展QGIS功能边界。全文注重实操指导,特别适合需要安装行业专用插件的QGIS用户参考。

LuckyHanMo的博客 466

2026年全国青少年信息素养大赛复赛真题(算法应用主题赛C++初中组:带解析)(7月4日试卷一)【文末附答案和解析】

2026年全国青少年信息素养大赛复赛真题(算法应用主题赛C++初中组:带解析)(7月4日试卷一)【文末附答案和解析】

王老师青少年编程 1739

【K8s】专题八:Kubernetes 服务调度详解

Kubernetes 专题 - 服务调度详解

运维、实施交付领域知识交流 2477

122、Android Camera HAL3 框架:Request、Result、Metadata 的异步管道模型

本文深入剖析了Android Camera HAL3框架中的异步管道模型,围绕Request、Result和Metadata三个核心要素展开。作者通过实际案例(黑屏闪退问题)切入,揭示了异步模型中常见的帧序错乱陷阱。文章详细阐释了三个角色的交互机制,指出HAL3采用生产者-消费者模式的关键特征:Request与Result一一对应但不保证顺序。针对开发实践,总结了三个必须加锁的场景和回调函数的锁使用禁忌,并给出解决帧序问题的具体方案(独立帧号生成器)。最后提出五项经验性建议,强调异步模型带来的灵活性与复杂性

sundong_81的博客 214

Android Service详解(八)---前台服务详解

Android Service详解(八)---前台服务详解 这是第八篇文章主要讲的是如何实现一个前台服务 回顾可以到第一篇文章从头了解Service: Android Service详解(一)---概述和StartService 一、首先我们要知道什么是前台服务 前台服务被认为是用户主动意识到的一种服务,因此在内存不足时,系统也不会考虑将其终止。 前台

SuperBigLw的博客 1万+

【软考高级架构】案例题考前突击6——大数据架构

前一类的数据主要由流量方以接口的方式提供(比如对接的腾讯广点通平台),后一类则是某网特有的数据,通过买家的浏览、下单、付款日志算出来。1. 在数据层面只维护一张包含所有指标的MySQL表,表中的stday字段作为索引,stday=当天的保存实时数据,stday<当天的保存离线数据。典型的大数据架构,除了Lambda架构之外,还有kappa架构,这两个架构的区别如下标所示,请补充表中空(1)-(4)第二,实时数据只对接了内部的kafka消息,没有实时的获取第三方的曝光、点击、浏览数据。

qq837993702的博客 67

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

SpringCloud微服务框架的原理及应用详解(八)

​ Spring Cloud是一个基于Spring Boot实现的服务治理工具包,在微服务架构中用于管理和协调服务。它提供了一系列框架和组件,如服务发现、配置管理、熔断器、智能路由等,用于简化分布式系统的开发。Spring Cloud通过提供一系列开箱即用的组件和工具,帮助开发者快速构建和部署微服务架构的系统。 本文将跟随《SpringCloud微服务框架的原理及应用详解(七)》的进度,继续介绍Spring Cloud框架。希望通过本系列文章的学习,您将能够更好地理解Spring Cl

凛鼕将至的博客 1747

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

vuepress入门详解(八)vuepress 部署到服务器

vuepress 部署到服务器 部署之前首先要使用命令npm run build进行编译,假设编译好的文件都放在dist文件夹里面。 编译好的文件就是一堆静态html页面和样式等文件。任何可以部署web应用的容器都可以部署 使用tomcat部署 使用tomcat部署的话,直接把编译好的文件夹放到webapp目录下就可以了。 发布到github上面 我没有使用这个功能,感兴趣的可以参考官网部署到GitHub 后记 vuepress入门讲解差不多就到这里了,只是记录了一些最简单的内容,他的功能还很强大,感兴趣的

牛魔王的专栏 4353

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

android7之前启动前台服务,Android Service详解(八)---前台服务详解

这是第八篇文章主要讲的是如何实现一个前台服务回顾可以到第一篇文章从头了解Service:Android Service详解系列一、首先我们要知道什么是前台服务前台服务被认为是用户主动意识到的一种服务,因此在内存不足时,系统也不会考虑将其终止。 前台服务必须为状态栏提供通知,放在“正在进行”标题下方,这意味着除非服务停止或从前台移除,否则不能清除通知。二、什么时候使用前台服务?例如,应该将通过服务播...

weixin_35541666的博客 497

SSH 服务详解 (八)-- vscode 通过 SSH 远程连接 linux 服务器

开发过程中,代码和编译器一般放在 linux 服务器中,但是平常使用的系统又是 window,所以本文通过 vscode 来连接远程 linux 服务器,这样,在 windows 的 vscode 中就可以查看,修改及编译代码,本文将介绍如何通过 vscode 连接到 linux 服务器有一点需要注意的是,SSH 客户端和服务器需要在同一局域网中,或者有公网 IP,楼主当前使用的开发环境为,windows10 + vmware ubuntu 虚拟机。

tyustli 2821

CentOS8服务器进阶(八)SSH远程密钥登录详解

导读: 尊敬的读者朋友,请您带着问题去阅读这篇文章,因为我想分享给你的是应对问题的方法,而不仅仅局限于解决问题的步骤。本文是《CentOS8服务器进阶》系列的第七篇,稍后还会持续更新该系列的文章,旨在为您解决开发中遇到的疑难杂症。上一期博文地址:https://www.jianshu.com/p/5b4a4918430b 一、实验环境 1.Windows10电脑 2.Vmware虚拟机 3.Cen...

qq_32241101的博客 3877

玩转企业常见应用与服务系列(八):开源代理服务软件 Squid 详解

点击下方名片,设为星标!回复“1024”获取2TB学习资源!前面介绍了企业常用服务NFS、FTP、DHCP、DNS、Samba、lsyncd、Postfix相关的知识点,今天我将详细的为大家介绍代理服务 Squid相关知识,希望大家能够从中收获多多!如有帮助,请点在看、转发朋友圈支持一波!!!Squid 简介Squid是Linux系统中最常用的一款开源代理服务软件,可以很好地实...

民工哥的博客 1057

深入详解美团点评CAT跨语言服务监控(八)报表持久化

上一篇:CAT跨语言服务链监控(七)消息分析器与报表(二)        下一篇:CAT跨语言服务链监控(九)CAT管理平台MVC框架 周期结束     我们从消息分发章节知道,RealtimeConsumer在初始化的时候,会启动一个线程,每隔1秒钟就去从判断是否需要开启或结束一个周期(Period),如下源码,如果 value &lt; 0 的时候,就会启动一个周期结束线程,线程会调用...

caohao0591的专栏 3008

微服务之springCloud-hystrix参数详解(八)

简介上节我们讨论了hystrix+feign+ribbon,但是可能很多人都知道hystrix还有线程隔离,信号量隔离,等等各种参数配置,在这几就记录下hystrix的参数,一、hystrix参数使用方法通过注解@HystrixCommand的commandProperties去配置,如下就是hystrix命令超时时间命令执行超时时间,为1000ms和执行是不启用超时@RestController...

qq_40435659的博客 254
上一篇: 八、服务详解
下一篇: 九、内容提供者详解
CoderLiLe
博客等级 码龄11年 2粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值