Android 四大组件 service

前言

在Android系统中,Service 是一个用来执行长时间运行的操作而不提供用户界面的应用组件。它可以在后台执行任务,即使用户切换到其他应用也不会被中断。

Service 在Android中主要用于在后台执行长时间运行的任务,例如播放音乐、执行文件下载、处理网络请求等。尽管Service运行在后台,但它仍然属于应用程序的一部分,因此不会影响用户对前台应用的交互。

Service的类型

在Android中,Service 可以分为三种类型:

前台Service

前台Service 是用户可见的服务,它会在系统的通知区域显示一个通知,表示正在运行的服务。这种类型的Service被视为用户当前活跃的一部分,因此系统不太可能在内存不足时终止它。前台Service 常用于音乐播放或GPS导航等需要用户明确知道并持续运行的功能。

后台Service

后台Service 在用户不可见的情况下执行操作,通常用于执行不需要与用户交互的任务。但从Android Oreo(API 级别 26)开始,后台服务的使用受到了严格限制,以减少对系统性能的影响和提升电池寿命。

绑定Service

绑定Service 是一种允许应用组件(如Activity)绑定到Service并与之交互的服务。组件可以发送请求、接收响应,甚至进行进程间通信(IPC)。绑定的Service 只在其他应用组件与其绑定时运行,不会无限期运行。

Service的实现

实现Service 主要涉及以下几个步骤:

  • 定义Service: 在Java或Kotlin文件中扩展Service基类,并重写其生命周期方法如onCreate(), onStartCommand(), onBind(), 和onDestroy()

  • 配置Manifest: 在AndroidManifest.xml中声明Service,并设置适当的权限和属性。

  • 启动和绑定Service: 通过startService(Intent)方法启动服务,或者使用bindService(Intent, ServiceConnection, int)绑定服务。前者适用于执行单一操作或执行不返回结果的操作,后者适用于与服务进行交互。

如下是一个例子:创建一个服务,允许用户在后台播放音乐,即使他们离开了应用,音乐仍然可以继续播放:

public class MusicService extends Service {private MediaPlayer mediaPlayer;@Overridepublic void onCreate() {super.onCreate();// 初始化 MediaPlayer 对象mediaPlayer = MediaPlayer.create(this, R.raw.sample_music);mediaPlayer.setLooping(true); // 设置音乐循环播放}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {mediaPlayer.start(); // 开始播放音乐return START_STICKY; // 系统如果终止服务后,会尝试重新创建服务并调用 onStartCommand()}@Overridepublic void onDestroy() {super.onDestroy();if (mediaPlayer != null) {mediaPlayer.stop();mediaPlayer.release();}}@Overridepublic IBinder onBind(Intent intent) {return null; // 不提供绑定功能}
}
<service android:name=".MusicService" />
public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button startButton = findViewById(R.id.startButton);Button stopButton = findViewById(R.id.stopButton);startButton.setOnClickListener(v -> startService(new Intent(this, MusicService.class)));stopButton.setOnClickListener(v -> stopService(new Intent(this, MusicService.class)));}
}

管理Service的生命周期

主要包括:

  • onCreate(): 当服务第一次创建时调用。
  • onStartCommand(): 每次通过 startService() 方法启动服务时调用。
  • onBind(): 当其他组件想要与服务绑定时调用。
  • onUnbind(): 当所有组件都与服务解绑时调用。
  • onDestroy(): 当服务不再使用且将被销毁时调用。

与服务通信

Binder

对于在同一应用内运行的服务,可以通过定义一个 Binder 类并在服务中返回这个 Binder 的实例,从而实现与服务的通信。客户端(如 Activity)可以绑定到服务并获得这个 Binder 对象,通过这个对象调用服务中的方法。

public class LocalService extends Service {// Binder 类的实例,用于返回给客户端private final IBinder binder = new LocalBinder();public class LocalBinder extends Binder {LocalService getService() {// 返回当前的 LocalService 实例以供客户端调用公开的方法return LocalService.this;}}@Overridepublic IBinder onBind(Intent intent) {return binder;}// 服务中的一个方法,客户端可以调用public int getRandomNumber() {return new Random().nextInt(100);}
}
public class MainActivity extends AppCompatActivity {private LocalService localService;private boolean isBound = false;private ServiceConnection connection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName className, IBinder service) {LocalBinder binder = (LocalBinder) service;localService = binder.getService();isBound = true;}@Overridepublic void onServiceDisconnected(ComponentName arg0) {isBound = false;}};@Overrideprotected void onStart() {super.onStart();bindService(new Intent(this, LocalService.class), connection, Context.BIND_AUTO_CREATE);}@Overrideprotected void onStop() {super.onStop();if (isBound) {unbindService(connection);isBound = false;}}public void onButtonClick(View v) {if (isBound) {// 调用服务的方法int num = localService.getRandomNumber();Toast.makeText(this, "number: " + num, Toast.LENGTH_SHORT).show();}}
}
Messager

如果服务需要与多个应用组件或其他应用进行跨进程通信,可以使用 Messenger。在这种方式a中,服务使用 Handler 接收消息,并通过 Messenger 对象响应。

public class MessengerService extends Service {static final int MSG_SAY_HELLO = 1;class IncomingHandler extends Handler {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case MSG_SAY_HELLO:Toast.makeText(getApplicationContext(), "Hello!", Toast.LENGTH_SHORT).show();break;default:super.handleMessage(msg);}}}final Messenger messenger = new Messenger(new IncomingHandler());@Overridepublic IBinder onBind(Intent intent) {return messenger.getBinder();}
}
public class ActivityMessenger extends AppCompatActivity {Messenger messenger = null;boolean isBound;private ServiceConnection connection = new ServiceConnection() {public void onServiceConnected(ComponentName className, IBinder service) {messenger = new Messenger(service);isBound = true;}public void onServiceDisconnected(ComponentName className) {messenger = null;isBound = false;}};public void sayHello(View v) {if (!isBound) return;Message msg = Message.obtain(null, MessengerService.MSG_SAY_HELLO, 0, 0);try {messenger.send(msg);} catch (RemoteException e) {e.printStackTrace();}}
}
AIDL

AIDL(Android Interface Definition Language)是一种接口定义语言,用于让客户端和服务之间能够在不同的进程中进行通信。使用 AIDL 是处理复杂数据传输或跨应用通信的标准方式。

定义一个 AIDL 文件,这个文件描述了服务将要公开的接口

interface IRandomNumberService {int getRandomNumber();
}

当构建项目时,Android 构建工具会根据 AIDL 文件生成一个 Java 接口。然后可以创建一个实现这个接口的服务:

IRandomNumberService.Stub 是由 AIDL 文件自动生成的,需要实现这个 Stub 类中的方

public class RandomNumberService extends Service {private final IRandomNumberService.Stub binder = new IRandomNumberService.Stub() {public int getRandomNumber() throws RemoteException {return new java.util.Random().nextInt(100);}};@Overridepublic IBinder onBind(Intent intent) {return binder;}
}

现在,任何其他应用都可以绑定到这个服务并调用 getRandomNumber 方法

public class ClientActivity extends AppCompatActivity {private IRandomNumberService randomNumberService;private boolean isBound = false;private ServiceConnection connection = new ServiceConnection() {public void onServiceConnected(ComponentName className, IBinder service) {randomNumberService = IRandomNumberService.Stub.asInterface(service);isBound = true;}public void onServiceDisconnected(ComponentName className) {randomNumberService = null;isBound = false;}};@Overrideprotected void onStart() {super.onStart();bindService(new Intent("com.example.myapp.RandomNumberService"),connection, Context.BIND_AUTO_CREATE);}@Overrideprotected void onStop() {super.onStop();if (isBound) {unbindService(connection);isBound = false;}}public void onButtonClick() {if (isBound) {try {int randomNumber = randomNumberService.getRandomNumber();// Use the random number...} catch (RemoteException e) {e.printStackTrace();}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/844499.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习-10-可解释性机器学习库Shapash

可解释性机器学习库Shapash——鸢尾花XGBoost分类解释实现 shapash的GitHub地址 机器学习的可解释性 1 机器学习的可解释性 1.1 可解释性简介 在机器学习的场景中,可解释性(interpretability)就表示模型能够使用人类可认知的说法进行解释和呈现。 机器学习模型被许多人称…

新火种AI|寻求合作伙伴,展开豪赌,推出神秘AI项目...苹果能否突破AI困境?

作者&#xff1a;小岩 编辑&#xff1a;彩云 2024年&#xff0c;伴随着AI技术的多次爆火&#xff0c;不仅各大科技巨头纷纷进入AI赛道展开角力&#xff0c;诸多智能手机厂商也纷纷加紧布局相关技术&#xff0c;推出众多AI手机。作为手机领域的龙头老大&#xff0c;苹果自然是…

学生成绩统计分析系统介绍

学生成绩统计分析系统是一种用于收集、管理和分析学生学业成绩的软件系统。该系统旨在帮助学校和教育机构更好地了解学生的学习情况&#xff0c;进行成绩评估和分析&#xff0c;以支持教学决策和学生发展。学生成绩分析系统 系统专门针对学校/班级成绩管理使用&#xff0c;支持…

F. Longest Strike[双指针详解]

Longest Strike 题面翻译 给你一个长度为 n n n 的序列 a a a 和一个整数 k k k&#xff0c;你要求一个区间 [ l , r ] [l,r] [l,r] 满足&#xff1a; 对于任何整数 x ∈ [ l , r ] x∈[l,r] x∈[l,r]&#xff0c; x x x 在 a a a 中的出现次数不少于 k k k 次。最大…

redis数据类型之Hash,Bitmaps

华子目录 Hash结构图相关命令hexists key fieldhmset key field1 value1 [field2 value2...]hscan key cursor [MATCH pattern] [COUNT count] Bitmaps位图相关命令setbit1. **命令描述**2. **语法**3. **参数限制**4. **内存分配与性能**5. **应用实例**6. **其他相关命令**7.…

19 - grace数据处理 - 补充 - 地下水储量计算过程分解 - 冰后回弹(GIA)改正

19 - grace数据处理 - 补充 - 地下水储量计算过程分解 - 冰后回弹(GIA)改正 0 引言1 gia数据处理过程0 引言 由水量平衡方程可以将地下水储量的计算过程分解为3个部分,第一部分计算陆地水储量变化、第二部分计算地表水储量变化、第三部分计算冰后回弹改正、第四部分计算地下…

07- Redis 中的 HyperLogLog 数据类型和应用场景

1. 介绍 Redis HyperLogLog 是 Redis 2.8.9 版本新增的数据类型&#xff0c;是一种用于【统计基数】的数据集合类型&#xff0c;基数统计就是指统计一个集合中不重复的元素个数。但要注意&#xff0c;HyperLogLog 的统计规则是基于概率完成的&#xff0c;不是非常准确&#xf…

ABAP MD04增强排除MRP元素

场景 MD04跑出来很多MRP元素&#xff0c;用户想手工控制某些MRP元素不参与运算 分析 增强点还蛮好找的&#xff0c;控制MRP元素是否参与运算用下面的se19三代增强点就可以&#xff0c;打个断点看下MD04进的哪个增强点就行 旧版本的用这个&#xff1a;MD_CHANGE_MRP_DATA 新…

《广告数据定量分析》读书笔记之理论/概论

《广告数据定量分析 如何成为一位厉害的广告优化师》 一、理论/概况 1.广告优化中的统计学&#xff1a; &#xff08;1&#xff09;获取推广相关数据&#xff1b; &#xff08;2&#xff09;将数据处理为需要的指标如转化率、roi等进行分析其投放效果&#xff1b; &#x…

flask的一些简要基础问答

1. Flask 中的 blinker&#xff1a; Blinker 是一个用于信号分发的库。在 Flask 中&#xff0c;它主要用于实现事件的发送和接收机制。通过使用 blinker&#xff0c;可以方便地在不同的组件之间进行通信和协调&#xff0c;当特定的事件发生时&#xff0c;可以触发相关的处理函…

NVIDIA Jetson 上编译opencv 4.9.0

直接上命令 cmake .. \ -DCMAKE_C_COMPILER/usr/bin/gcc-7 -DCMAKE_CXX_COMPILER/usr/bin/g-7 \ -DCMAKE_BUILD_TYPERelease \ -DCMAKE_INSTALL_PREFIX/usr/local \ -DOPENCV_ENABLE_NONFREE1 \ -DBUILD_opencv_python21 \ -DBUILD_opencv_python31 \ -DCUDA_TOOLKIT_ROOT_DIR…

C++STL容器系列(三)list的详细用法和底层实现

目录 一&#xff1a;介绍二&#xff1a;list的创建和方法创建list方法 三&#xff1a;list的具体用法3.1 push_back、pop_back、push_front、pop_front3.2 insert() 和 erase()3.3 splice 函数 四&#xff1a;list容器底层实现4.1 list 容器节点结构5.2 list容器迭代器的底层实…

【window 安装 service bus explorer】

安装ServiceBusExplorer 首先需要安装Chocolatey安装 service bus explorer 首先需要安装Chocolatey 参考&#xff1a; https://chocolatey.org/install#install-step2 以管理员身份运行powershell输入Get-ExecutionPolicy回车&#xff0c;若显示 Restricted输入Set-Executio…

CentOS8环境下FTP服务器安装与配置

在本指南中&#xff0c;我们将一步步介绍如何在CentOS 8环境下安装和配置一个FTP服务器。FTP&#xff08;文件传输协议&#xff09;是一种网络传输协议&#xff0c;用于在网络中的计算机之间传输文件。虽然现在有更安全的传输方式&#xff0c;如SFTP或FTP over SSL&#xff0c;…

python -【一】基础语法

python 基础语法 一. 基础数据类型 常用的 6 种数据类型 类型描述说明数字&#xff08;Number&#xff09;int&#xff0c;float&#xff0c;complex(复数)&#xff0c;bool复数&#xff1a;4 3j&#xff0c;j 表示复数字符串&#xff08;String&#xff09;文本&#xff1…

小短片创作-理论知识(三)

1、抗锯齿 1.相机移动的时候出现锯齿 2.当1个像素在三角形边缘的时候&#xff0c;可能取值为白色&#xff0c;也可能取值为黑色&#xff0c;表现出来就是闪烁&#xff0c;或锯齿 3.如果我们通过超采样将1个像素变成4个像素进行计算&#xff0c;得到的结果就会更准确&#x…

Codeforces Round 945 (Div. 2) C. Cat, Fox and Double Maximum 题解 贪心 构造

Cat, Fox and Double Maximum 题目描述 Fox loves permutations! She came up with the following problem and asked Cat to solve it: You are given an even positive integer n n n and a permutation † ^\dagger † p p p of length n n n. The score of another …

电脑显示不出网络

你的电脑是否在开机后显示不出网络&#xff0c;或者有网络消失的现象&#xff1f;今天和大家分享我学到的一个办法&#xff0c;希望对大家有用。 分析出现这类现象的原因&#xff1a;可能是电脑网卡松动了&#xff0c;电脑中存在静电流。 解决办法&#xff1a;先将电脑关机&am…

深度学习(一)

深度学习&#xff08;一&#xff09; 一、实验目的 掌握前馈全连接神经网络&#xff0c;具体包括&#xff1a; (1) 前馈全连接神经网络的网络结构 (2) 前馈神全连接经网络的工作原理 (3) 前馈全连接神经网络的代码实现 二、实验内容 1. 导入常用工具包 2. 数据导入与数据…

大模型对齐方法笔记二:基于Rank的对齐方法RRHF和PRO

文章目录 RRHFPRO将RLHF嫁接到PRO 参考资料 RRHF RRHF(Rank Responses to align Human Feedback)出自2023年4月的论文《RRHF: Rank Responses to Align Language Models with Human Feedback without tears》&#xff0c;是较早提出的不需要使用PPO来对齐人类偏好的方法。 设…