Android Service全解析(一)

Android Service与BroadcastReceiver深度解析:从零到一的实现与优化 本文深入解析Android Service与BroadcastReceiver的核心机制,涵盖从基础实现到性能优化的全流程。重点探讨前台Service的合理使用、后台任务调度(JobScheduler/WorkManager)、广播通信的安全与效率(LocalBroadcastManager),以及Android 14+系统限制的适配策略。通过实际案例分析常见问题(如内存泄漏、ANR)及解决方案,帮助开发者构建稳定、高效的后台服务与事件响应体系。 阅读详情

Service全解析(一)

==1.Service基本介绍==
==2.启动模式下的Service==
==3.绑定模式下的Service==

==4.与Remote Service数据交互==

  首先看一下Service的生命周期,启动模式(startService()/stopService)下的生命周期为:
onCreate() —-> onStartCommand() —-> onDestroy() ;
绑定模式下:onCreate() —-> onBind() —->onBind() —-> onDestroy() ;
  启动模式下不会执行onStartCommand()方法,所以逻辑处理放在onCreate()中。
需要注意的一点是5.0版本以上的隐式启动,Intent需要setPackage,否则会报错;


绑定模式下Service的onBind()方法会返回一个 Binder对象,在调用bindService()方法的地方得到这个Binder对象,从而实现与Service的交互。
Binder 继承 IBinder。

代码分析(省略了部分无关方法)

public class CountSumService extends Service {

    private ServiceBinder serviceBinder = new ServiceBinder();

    @Override
    public IBinder onBind(Intent intent) {
        Log.v("out","onBind()");
        return serviceBinder;
    }

    public void test(){
        Log.v("out","service test demo");
    }

    public class ServiceBinder extends Binder{
        public CountSumService getService(){
            return CountSumService.this;
        }
    }
}

Service内部创建了一个 了Binder的类,然后在onBind()方法中返回了这个类的实例,这个实例在创建ServiceConnection的onServiceConnected()方法中可以拿到。


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mContext = this;
        setContentView(R.layout.activity_service_demo);
        conn = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                Log.v("out",name.toString());
                IBinder temp = service;
                if(service!=null) {
                    countSumService = ((CountSumService.ServiceBinder) service).getService();
                }
            }

            @Override
            public void onServiceDisconnected(ComponentName name) {
                countSumService = null;
            }
        };
        mContext.bindService(new Intent(ServiceDemoActivity.this,CountSumService.class) ,conn,BIND_AUTO_CREATE);
        //countSumService.test();
        Log.v("out","断点");
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (countSumService==null){
                    if(countSumService!=null){
                        countSumService.test();
                    }
                }
            }
        }).start();
    }

创建ServiceConnection的onServiceConnected()方法得到Service中返回的Binder对象。
这里有一个坑:得到这个Binder对象是异步的不是同步的,所以你bindService()后不能直接得到binder对象,一般都是在onServiceConnected()方法中使用;如果非得在外面使用,可以像我这样开一个线程来获取。

Remote Service
上面讲的都是与本地Service交互,那么远程Service呢,与Remote Service交互涉及到IPC, 通常有这3种方式实现:
==1.广播==
==2.AIDL==
==3.Message==
这里主要讲后两张方法。
先看AIDL方式的实现:
(1)创建一个Remote Service,AndroidManifest.xml文件配置Service属性:两种方式,第一:android:process = “remote”,这种方式创建的Service会运行在一个新进程中,但是这一个新的进程是公有的,也就是说其他的应用也可以运行在这个进程中;第二:android:process=”:任意字符”,(注意:号)这样创建的是一个私有新程。
(2)与本地Service不同的地方在于,本地Service我们自己创建一个继承与Binder的类,而远程Service需要通过创建.aidl文件来自动为我们生成一个Binder类。
(3)下面介绍在AS中创建aidl文件:
 a.切换到Project状态
b.右键c/in/java目录,new —-> AIDL文件,生成的aidl文件会自动放到与java同级的AIDL文件夹下。

import com.wangliang160616.androidtest.model.student;
interface IMyAidlInterface {

    void setStuInfo(in student stu);
    void setAge(int age);

}

注意:import需要手动写。
你以为这就完了,too yang too simple
传递基本数据类型和String,CharSequence,List,Map这些是ok的,但是如果是自己定义的Model,比如我码中的student类,要跨进程传递,应该这样做:
(1)自定义的类继承Parcelable
(2)在你放这个model的包上右键new aidl,先随便起一个名字,等他自动生成后将名字改成与你这个Model同名的名字。
(3)Build –> make project ,AS自动生成java文件,这个java 文件在哪呢,资料上都说在gen目录下,但是在AS下面根本没有gen目录,在app/build/generate/source/aidl,题外话,R文件app/build/generate/source/r下面
(4)回到Service,onBind()方法返回根据AIDL文件自动生成的java类中的Stup对象即可。看代码:

public class RemoteService extends Service {

    private student data;
    private int age;

    private IMyAidlInterface.Stub mBinder = new IMyAidlInterface.Stub(){

        @Override
        public void setStuInfo(student stu) throws RemoteException {
            if(stu!=null){
                data = stu;
            }
            Log.v("out","当前Service pid:"+android.os.Process.myPid());
            Log.v("out","姓名:"+data.getStuName()+"/id:"+data.getStuId());
        }

        @Override
        public void setAge(int age) throws RemoteException {
            data.setStuId(age);
            Log.v("out","姓名:"+data.getStuName()+"/id:"+data.getStuId());
        }
    };

    public RemoteService() {
    }

    @Override
    public IBinder onBind(Intent intent) throws UnsupportedOperationException{
        return  mBinder;
    }
}

(5)在activity中这样
IMyAidlInterface Service = IMyAidlInterface.Stub.asInterface(service);
得到Binder对象。

==还有有一种通过Messenger方式来通信的,在(二)中我会介绍这种方法。==

Android安卓进程保活(二)设置前台Service(1),万字解析 都说三年是程序员的一个坎,能否晋升或者提高自己的核心竞争力,这几年就十分关键。技术发展的这么快,从哪些方面开始学习,才能达到高级工程师水平,最后进阶到Android架构师/技术专家?我总结了这 5大块;我搜集整理过这几年阿里,以及腾讯,字节跳动,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 PDF(实际上比预期多花了不少精力),包含知识脉络 + 分支细节。Java语言与原理;大厂,小厂。Android面试先看你熟不熟悉Java语言高级UI与自定义view。 阅读详情

相关推荐

Service要点全解析

1、Service概述 Service的主要作用是,让系统可以在后台干一些不与用户交互的操作,这些操作可能会比较耗时,比如去下载一些网络资源等;也可能是一项长期运行的工作,比如说监听电话来电、播放音乐等。初听起来,Service与线程Thread很像,但Service和Thread完全是两个不同的东西啊。 (1)Service不是运行在一个独立的进程中,它和我们的应用程序在同一个进程中

开心阳 8713

一看就懂———Android组件之Service全解析

每日一言:这一秒不放弃,下一秒就会有希望。 欢迎一起讨论和学习,QQ:732258496  QQ群:478720016 一.Service作用       它主要用于在后台处理一些耗时的逻辑,或者去执行某些需要长期运行的任务。必要的时候我们甚至可以在程序退出的情况下,让Service在后台继续保持运行状态。 二.基本用法      代码注意点:1.Service都必须在AndroidMa...

u010194271的博客 203

安卓后台保活服务Service与自动重启APP策略解析

Android的Service是一种用于执行后台操作而没有用户界面的组件。它可以在后台执行长时间运行的操作,而不需要用户与应用直接交互。然而,随着Android系统的不断升级,对后台服务的限制也越来越严格,特别是从Android8.0(Oreo)开始,引入了更加严格的电池管理和后台任务限制,这对后台服务的保活提出了更高的挑战。

2401_89048135的博客 1398

Android Service 全解析:从基础原理到实战优化

Android Service开发全解析 摘要:本文深入剖析Android四大组件之一的Service,系统讲解其核心概念、生命周期、启动方式及最佳实践。内容涵盖启动型、绑定型和前台Service的实现原理,IntentService的自动任务管理机制,以及跨进程通信的AIDL解决方案。针对开发中的常见问题(如内存泄漏、系统回收等)提供应对策略,并对比WorkManager等现代替代方案。通过15+实战案例,帮助开发者掌握音乐播放、后台下载等典型场景的实现技巧,理解Service与其他组件的协同工作方式,提

weixin_37794278的博客 1701

安卓面经_Android面试题解析大全(2/30)之Service全解析

Service是Android四大组件之一,其中Service和Activity是面试官最喜欢问的。

a763450633的博客 802

解决鸿蒙/荣耀设备GMS应用调试中的“Play保护机制认证”报错

本文详细解析了在鸿蒙或荣耀设备上调试GMS应用时,遇到“Play保护机制认证”报错的根本原因与解决方案。核心在于获取设备的GMS Device ID,并通过Google官方渠道完成临时注册,从而绕过认证限制。文章提供了无需Root和ADB查询两种具体方法,并分享了授权后的故障排查与实战经验,帮助开发者高效解决问题。

weixin_29288313的博客 296

Android Service的解析

应用内或应用间数据通信,Android每个应用程序都在自己的dalvik虚拟机中运行,一个应用是不允许访问其他应用的内存信息的,为此Android引入了Content Provider在不同应用间共享数据,BroadcastReceiver广播信息给不同应用程序,但Content Provider更多用于数据的共享,BroadcastReceiver广播的信息会被所有应用接收较耗费系统资源,对于两个应用间动态的进行交互还需要通过Service来完成。如果设置为true,则能够被实例化,否则不能被实例化。

double222222的博客 1508

蓝桥杯单片机省一经验分享1:基础篇.含详细代码与应试技巧

含详细代码、驱动修改与应试技巧

qq_53529450的博客 1万+

Android Service 全解析

Service的种类    按运行地点分类: 类别 区别 优点 缺点 应用 本地服务(Local) 该服务依附在主进程上, 服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外Local服务因为是在同一进程因此不需要IPC,也不需要AIDL。相

张勤一 2612

深入解析Incapsula reese84的生成机制与绕过策略

本文深入解析了Incapsula reese84的生成机制与绕过策略。reese84是一种基于客户端JavaScript挑战的Web安全防护,通过动态算法收集浏览器指纹并生成令牌Cookie。文章详细拆解了其两步验证流程,并提供了使用无头浏览器、逆向JS模拟请求以及Token维护等实战绕过方法,帮助开发者和安全研究人员应对自动化访问拦截。

weixin_29256771的博客 442

图解联合概率密度、边缘概率密度、条件概率密度之间的关系

简要图解联合概率密度、边缘概率密度、条件概率密度之间的关系

一个搬运知识的笨小孩 2万+

Android Service全面解析

在 Android 四大组件(Activity、Service、BroadcastReceiver、ContentProvider)中,Service 是负责的核心组件。它没有可视化界面,却支撑着音乐播放、文件下载、数据同步等核心场景的实现。

. 1100

解锁RK1126与SC132GS摄像头适配密码:技术与代码全解析

本文详细介绍了瑞芯微RK1126芯片与SC132GS摄像头的适配方法。首先分析了RK1126的四核Cortex-A7处理器、Mali-T860 GPU等硬件特性,以及SC132GS的130万像素、全局快门等技术参数。重点阐述了基于MIPI CSI接口的硬件连接原理和基于V4L2框架的软件驱动设计,并提供了完整的初始化、数据采集和图像处理代码实现。针对常见连接和图像质量问题给出了解决方案,展现了该组合在智能安防、工业检测等领域的应用潜力,为开发者提供了实用的技术参考。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 1498

Android中的Service使用全解析

一、概述Service是后台服务,没有用户界面,适合用于去执行长期运行的任务。Service不是一个单独的进程,除非单独指定,否则将会应用程序运行在同一个进程当中。Service不是一个线程,需要在Service中开启线程去执行耗时操作。Service的分类: 启动Service(Service不能够与Activity很好的交互) 绑定Service(Service相对于服务端Activity相对于

MAGIC 1423

华为OD机试 - 矩形绘制 - 数组、坐标偏移(Python/JS/C/C++ 双机位C卷 100分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。实现一个简单的绘图模块,绘图模块仅支持矩形的绘制和擦除。 当新绘制的矩形与已有图形重叠时,对图形取并集; 当新擦除的矩形与已有图形重叠时,对图形取差集。 给定一系列绘制和擦除操作,计算最终图形的面积。第一行为操作数N,接下来的N行格式为:d x1

学Java,找哪吒 835

【第13话:感知算法】库位与可行驶区域检测:自主泊车场景中的检测及语义分割方法

本文提出了一种自动泊车系统中的泊车库位线检测方法,通过逆透视映射(IPM)将车辆摄像头图像转换为鸟瞰视图,消除透视变形。该方法结合目标检测和语义分割模型,先定位库位线候选区域,再生成像素级精确掩码。后处理步骤将掩码转换为结构化输出,包括停车位边界多边形和可行驶区域掩码。整个流程采用深度学习模型和计算机视觉技术,可实现高精度的泊车环境感知,为自动泊车系统提供可靠支持。

一碗白开水一 1160

Android Service最全面的解析

刘明渊 的博客地址:http://blog.youkuaiyun.com/vanpersie_9987 Service Service是Android中一个类,它是Android四大组件之一,使用Service可以在后台执行长时间的操作( perform long-running operations in the background ),Service并不与用户产生U

scott2017的博客 4万+

【TC3xx芯片】TC3xx芯片看门狗复位的默认行为分析

TC3xx芯片看门狗复位的默认行为分析

qq_36056498的博客 350

Service使用全解析

Service 使用全解析什么是ServiceService是Android 的四大组件之一,主要处理一些耗时的后台操作逻辑,或者轮询操作等需要长期在后台运行的任务。甚至在程序退出之后,可以让Service继续在后台运行。Service的启动方式有三种:三种方式对应着三种不同的生命周期。 startService启动服务。(简单使用) bindService绑定服务的方式启动服务。 先启动服务之后绑

茅屋 4359

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Android Service完全解析

Service 是一个可以在后台执行长时间运行操作而不使用用户界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。 此外,组件可以绑定到服务,以与之进行交互,甚至是执行进程间通信 (IPC)。 例如,服务可以处理网络事务、播放音乐,执行文件 I/O 或与内容提供程序交互,而所有这一切均可在后台进行 生命周期 官方图解 onStartCommand() 当另

戎码人生 1万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【安卓笔记】全面解析Service组件

service,android四大组件之一,是一个长期运行在应用后台的android组件,它没有与用户交互的界面。 service的特点是: 1.长期运行在后台; 2.其他组件可以通过绑定操作与service进行交互; 3.默认运行在UI线程上; 4.无用户界面。 下面总结了service常见的知识点,帮助大家理解和复习service。 service分类简介:

RowandJJ 3733

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Android Service解析

Android Service是一个可以在后台执行长时间运行操作而不提供用户界面的应用组件,它分为两种工作状态,一种是启动状态,主要用于执行后台计算;另一种是绑定状态,主要用于其他组件和Service的交互。需要注意的两点: 两种状态是共存的,即Service可以是启动状态也可以同时是绑定状态 防止ANR风险,主线程运行的Service在执行耗时操作,则应在服务内创建新线程来完成这项工作,这可以...

fomin 970

Android插件化-Service篇

在Android中Service主要是用于执行后台任务,比如应用在后台通过Service播放音乐或者进行文件下载,更或者说是启动一个前台Service以达到保活目的等等。

2401_85112887的博客 1995

Android Service原理分析之startService(一)

目录 Service概述 Service分类 startService时序图 源码解析 ActivityManagerService中的处理 ActiveServices中的处理 Service.onCreate的执行 Service.onStartCommand的执行 总结 1. Service概述 Service作为Android四大组件之一,在开发过程中非常常用,它虽然没有ui,但...

人生如逆旅 2449

【Android FrameWork】第三天:init进程对service的解析

Android Init进程解析Service的过程分析 本文分析了Android系统中init进程对service配置的解析过程,主要包括以下关键点: 配置文件加载:init进程读取init.rc等配置文件,预处理注释和换行符。 service块识别:当遇到"service"关键字时,进入专用解析模式。 基本信息解析: 检查服务名称唯一性 创建Service对象并初始化名称、路径和启动参数 切换解析状态处理后续属性 详细属性解析: 通过关键字映射表处理不同属性(user、group等)

u012739527的博客 1815

Android Service源码解析

Android Service 是 Android 应用中用于执行长时间运行操作而不提供用户界面的组件。Service 可以在后台执行各种任务,如下载文件、播放音乐、执行位置更新等。在解析 Android Service 的源码时,有几个核心类和核心方法值得注意,它们共同构成了 Service 的基础架构和功能。这个类包含了Service的基本框架和生命周期方法,以及用于与ActivityManager交互以管理服务状态的内部机制。通过继承这个类并实现必要的方法(如onCreate()onBind()

望佑 2065
上一篇: Serializable探究一二
下一篇: Android Service完全解析(二)
HHcoco
博客等级 码龄13年 46粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值