《第一行代码》第二版学习笔记(9)——服务

文章目录

  • 一、线程
  • 二、解决异步消息处理机制
    • 1、消息组成
    • 2、AsyncTask
  • 三、Service
    • 1、启动和停止服务
    • 2、活动和服务通信
    • 3、服务的生命周期
    • 4、创建前台服务
    • 5、使用IntentService
  • 四、服务的最佳实践

一、线程

android不允许在子线程中更新IU操作

二、解决异步消息处理机制

1、消息组成

  • Message:在线程之间传递消息
  • Handler:发送(SendMessage)和处理消息(handleMessage())
  • MessageQueue:存放所有通过Handler发送的消息
  • Looper:每个线程中MessageQueuede的管家,调用Looper的loop()方法后,就会进入到一个无线循环中,每当MessageQueue有消息时将它取出,传递到Handler的handleMessage()方法当中。

2、AsyncTask

AsyncTask是一个抽象类,子类继承AsyncTask时指定为3个泛型参数(也可以传void):

  • param:在执行AsyncTask时需要传入的参数,可用于在后台任务中使用
  • Progress:后台任务执行时,如果需要在界面上显示当前的进度,则使用这里指定泛型作为进度单位
  • Result:指定的泛型作为返回值

经常需要重写的方法

  • onPreExecute:后台任务开始执行调度之前,用于进行界面上的初始化操作。
  • doInBackground:这个方法中的所有代码都会在子线程中执行,在这处理所有耗时的任务。这个方法中不可以进行UI操作
  • onProgressUpdate:在这个方法中可以对UI进行操作
  • onPostExecute(Result):当后台任务执行完毕通过return语句返回时,这个方法很快就会被调用。执行一些任务的收尾工作。

三、Service

1、启动和停止服务

  • 定义服务
    在这里插入图片描述
if (v.getId() == R.id.start_service){Intent startIntent = new Intent(this,MyService.class);startService(startIntent);}else if (v.getId() == R.id.stop_service){Intent stopIntent = new Intent(this,MyService.class);stopService(stopIntent);}

2、活动和服务通信

比如希望在服务里提供一个下载文件的功能

  • 在服务中新建一个DownloadBinder类继承Binder,在这个类的内部提供一个下载和显示进度的方法。
 class DownloadBinder extends Binder{public void startDownload(){Log.d(TAG,"startDownload executed");}public int getProgress(){Log.d(TAG,"getProgress executed");return 0;}}
  • 在服务中创建这个类的实例,然后在onBind方法中返回这个实例
   @Overridepublic IBinder onBind(Intent intent) {// TODO: Return the communication channel to the service.//throw new UnsupportedOperationException("Not yet implemented");return mBinder;}
  • 在活动中创建ServiceConnection 匿名类,在类的onServiceConnected方法中通过向下转型得到了DownloadBinder的实例。
//    服务和活动绑定的解绑的时候用private ServiceConnection connection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {downloadBinder = (MyService.DownloadBinder) service;downloadBinder.startDownload();downloadBinder.getProgress();}@Overridepublic void onServiceDisconnected(ComponentName name) {}};
  • 在活动中定义一个 ServiceConnection 对象和一个 boolean 变量用于跟踪服务是否已绑定, MyService.LocalBinder是服务中的类,可以通过这个类在活动中调用服务中的方法
private MyService myService;
private boolean isServiceBound = false;private ServiceConnection serviceConnection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName componentName, IBinder iBinder) {MyService.LocalBinder binder = (MyService.LocalBinder) iBinder;myService = binder.getService();isServiceBound = true;}@Overridepublic void onServiceDisconnected(ComponentName componentName) {isServiceBound = false;}
};
  • 接下来,在活动的 onCreate() 方法中绑定服务:
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 创建意图以绑定服务Intent intent = new Intent(this, MyService.class);bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
}
  • 最后,在活动销毁时解绑服务:
@Override
protected void onDestroy() {super.onDestroy();if (isServiceBound) {unbindService(serviceConnection);isServiceBound = false;}
}

3、服务的生命周期

在Android中,服务(Service)是一种可以在后台执行长时间运行操作的组件,它没有用户界面。服务的生命周期包括以下几个关键方法:

  • onCreate():在服务被创建时调用。该方法只会被调用一次,用于进行一次性的初始化操作。
  • onStartCommand():在每次通过 startService() 方法启动服务时调用。该方法是服务的主要入口点,用于处理启动服务的请求,并执行相应的操作。它返回一个整数值,用于指定服务的行为,如何处理请求以及是否在服务被终止后重新启动。
  • onBind():在通过 bindService() 方法绑定服务时调用。该方法返回一个 IBinder 对象,用于提供与活动(或其他组件)进行通信的接口。如果服务不提供绑定功能,可以返回 null。
  • onUnbind():在通过 unbindService() 方法解绑服务时调用。该方法可以执行一些清理操作,如释放资源或取消相关的注册。如果返回 true,表示允许重新绑定该服务;如果返回 false,表示不允许重新绑定。
  • onDestroy():在服务被销毁时调用。该方法在服务即将被销毁时执行一些清理操作,释放资源等。在该方法执行后,服务将不再可用。

注:根据Android系统的机制,一个服务只要被启动或者绑定了之后,就会一直处于运行状态,必须要让两种条件同时不满足,服务才会被销毁。

4、创建前台服务

在 targetSdkVersion >= 34 的情况下,必须为应用内的每个前台服务(Foreground Service)指定至少一种前台服务类型。
使用时需要在 Manifest 文件中申请 android.permission.FOREGROUND_SERVICE 权限。service标签中的属性foregroundServiceType要和该权限对应。

   <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/><!-- android14前台常住服务权限--><uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE"/><serviceandroid:name=".MyService"android:foregroundServiceType="specialUse"android:enabled="true"android:exported="true" />

在这里插入图片描述
让该服务变为一个前台服务:

 startForeground(1,notification);

5、使用IntentService

IntentService 让服务在子线程中运行

四、服务的最佳实践

报错:使用书籍提供的下载链接启动下载就失败,貌似是无权限访问,更换一个下载链接即可。

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

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

相关文章

【Three.js基础学习】14.Galaxy Generator

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 课程知识点 1. 实现星际编辑器 2. 创建粒子 1000&#xff0c; 在随机位置 3. 创建材质 PointsMaterial 4. Points() 接收 5. 放到gui 中调试 但是会发现调整size 等 属…

【机器学习-15】决策树(Decision Tree,DT)算法介绍:原理与案例实现

前言 决策树算法是机器学习领域中的一种重要分类方法&#xff0c;它通过树状结构来进行决策分析。决策树凭借其直观易懂、易于解释的特点&#xff0c;在分类问题中得到了广泛的应用。本文将介绍决策树的基本原理&#xff0c;包括熵和信息熵的相关概念&#xff0c;以及几种经典的…

linux(ubuntu18.04.2) Qt编译 MySQL(8.0以上版本)链接库 Qt版本 5.12.12及以上 包含Mysql动态库缺失问题

整理这篇文档的意义在于&#xff1a;自己走了很多弯路&#xff0c;淋过雨所以想为别人撑伞&#xff0c;也方便回顾&#xff0c;仅供参考 一、搭建开发环境&#xff1a; 虚拟机&#xff08;ubuntu-20.04.6-desktop-amd64&#xff09;&#xff1a;Mysql数据库 8.0.36Workbench …

透明屏幕的亮度如何?在强光环境下是否仍然清晰可见?

透明屏幕的亮度是一个重要的指标&#xff0c;决定了屏幕在明亮环境中的可视程度。在透明屏幕领域&#xff0c;高亮度的屏幕可以确保在强光环境下仍然能够清晰显示内容。 OLED透明屏通常具有较高的亮度&#xff0c;可以达到500尼特以上&#xff0c;这使得它们在明亮的环境中仍然…

中间件研发之Springboot自定义starter

Spring Boot Starter是一种简化Spring Boot应用开发的机制&#xff0c;它可以通过引入一些预定义的依赖和配置&#xff0c;让我们快速地集成某些功能模块&#xff0c;而无需繁琐地编写代码和配置文件。Spring Boot官方提供了很多常用的Starter&#xff0c;例如spring-boot-star…

图:广度优先遍历(BFS)和深度优先遍历(DFS)

1.工具类&#xff1a;队列和字典 export class DictionNary {// 字典的封装constructor() {this.items {}}set(key, value) {// 添加键this.items[key] value}has(key){// 判断键是否存在return this.items.hasOwnProperty(key)}get(key){// 获取键的valuereturn this.has(k…

H3C ripng实验(ipv6)

H3C ripng实验&#xff08;ipv6&#xff09; 实验需求 按照图示为路由器配置IPv6地址 所有路由器运行ripng&#xff0c;进行ipv6网段的互通 查询路由表后&#xff0c;​进行全网段的ping测试&#xff0c;实验目的RTD可以ping通RTA 实验解法 按照图示为路由器配置IPv6地址 …

Simple ThFHE with poly ratio via Rényi Divergence

参考文献&#xff1a; [Renyi61] Rnyi A. On measures of entropy and information[C]//Proceedings of the fourth Berkeley symposium on mathematical statistics and probability, volume 1: contributions to the theory of statistics. University of California Press,…

【Transformer系列(5)】vision transformer(ViT)带来的思考?

一、ViT的意义 Vision Transformer&#xff08;ViT&#xff09;是一种基于Transformer架构的图像分类模型&#xff0c;它通过将图像划分为一系列的图像块&#xff08;patches&#xff09;&#xff0c;并将这些块转换为向量序列&#xff0c;然后通过Transformer的自注意力机制对…

某站戴师兄——Excel实战

1、设置下拉选项&#xff1a;数据——数据验证——设置 如下设置&#xff1a; 2、If、sumif、index、match综合应用&#xff1a; sumif(条件区域&#xff0c;条件&#xff0c;目标区域&#xff09; sumifs(目标区域,条件区域1&#xff0c;条件1,条件区域2&#xff0c;条件2) …

[渗透利器]某大佬公开自用红队渗透工具

前言 看到群里大佬发的文章&#xff0c;公开了自用的工具&#xff0c;前来拜膜一下。 使用方式 该工具首先需要初始化数据库&#xff0c;Windows推荐使用PHP Study&#xff0c;搭建更方便。 修改默认root密码后新建数据库&#xff0c;账号密码随便填&#xff0c;公网环境注意…

知识库工具:付费的HelpLook AI知识库比免费的牵牛易帮好在哪里

在知识管理的领域中&#xff0c;选择合适的知识库工具对于企业来说很重要。市面上有很多知识库产品&#xff0c;有付费的和免费的&#xff0c;但是还是有很多企业会选择使用付费的&#xff0c;而不是免费的。这是为什么呢&#xff1f;这就是今天要探讨的问题&#xff0c;下面就…