《第一行代码》第二版学习笔记(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.mzph.cn/diannao/7073.shtml

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

相关文章

41.乐理基础-拍号-小节、小节线、终止线

小节线&#xff1a;下图红框中的竖线就是小节线 小节、终止线&#xff1a;最后的终止线就是文字意思表示乐谱结束了&#xff0c;后面没有了 下图中 0.5表示0.5拍&#xff08;八分音符&#xff09;、1表示1拍&#xff08;四分音符&#xff09;、0.25表示0.25拍&#xff08;十六分…

编程基础学什么课程内容

编程基础学习的课程内容有&#xff1a;程序设计基础、算法与数据结构、计算机科学原理、面向对象编程、网页开发基础等课程内容&#xff0c;以下是上大学网 (www.sdaxue.com)整理的具体课程或技能领域内容&#xff0c;供大家参考&#xff01; 程序设计基础&#xff08;或计算机…

每日OJ题_DFS解决FloodFill⑦_力扣LCR 130. 衣橱整理(原剑指Offer13机器人的运动范围)

目录 力扣LCR 130. 衣橱整理&#xff08;原剑指Offer13机器人的运动范围&#xff09; 解析代码 力扣LCR 130. 衣橱整理&#xff08;原剑指Offer13机器人的运动范围&#xff09; LCR 130. 衣橱整理 难度 中等 家居整理师将待整理衣橱划分为 m x n 的二维矩阵 grid&#xff…

【精品毕设推荐】基于Javaee的影视创作论坛的设计与实现

点击下载原文及代码 摘 要 随着时代的发展&#xff0c;互联网的出现&#xff0c;给传统影视行业带来的最大便利就是&#xff0c;方便了影视从业人员以及爱好者的交流和互动&#xff0c;而为用户提供一个书写影评&#xff0c;阅读影评以及回复影评的平台&#xff0c;以影评为…

《第一行代码》第二版学习笔记(8)——网络技术

文章目录 一、Http1、HttpURLConnection2、OKHttp 二、解析JSON格式数据1、使用JSONObject2、使用GSON解析JSON数据 一、Http 1、HttpURLConnection public void run() {HttpURLConnection connection null;BufferedReader reader null;try {URL url new URL("http://…

力扣每日一题114:二叉树展开为链表

题目 中等 提示 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同…

2024年CMS市场的份额趋势和使用统计

目前市面上有超过一半的网站都是使用CMS来搭建的&#xff0c;据不完全统计&#xff0c;现在大概有900多种CDM可供选择&#xff0c;以下是最常见的CMS的市场份额和使用率信息&#xff1a; 除了WordPress以外&#xff0c;Shopify和Wix也是比较流行的内容管理系统&#xff0c;尤其…

239 基于matlab的EKF(扩展卡尔曼滤波)_UKF(无迹卡尔曼滤波)_PF(粒子滤波)三种算法的估计结果比较

基于matlab的EKF(扩展卡尔曼滤波)_UKF(无迹卡尔曼滤波)_PF&#xff08;粒子滤波&#xff09;三种算法的估计结果比较&#xff0c;输出估计误差&#xff0c;并单独对粒子滤波进行估计及其置信区间可视化。程序已调通&#xff0c;可直接运行。 239 EKF(扩展卡尔曼滤波) - 小红书 …

一、Redis五种常用数据类型

Redis优势&#xff1a; 1、性能高—基于内存实现数据的存储 2、丰富的数据类型 5种常用&#xff0c;3种高级 3、原子—redis的所有单个操作都是原子性&#xff0c;即要么成功&#xff0c;要么失败。其多个操作也支持采用事务的方式实现原子性。 Redis特点&#xff1a; 1、支持…

【Linux】操作系统

上一篇博客我们从硬件的角度谈了计算机&#xff0c;我们说到了计算机的效率跟操作系统写的好不好有着直接的关系&#xff0c;那么这篇博客我们从软件的角度&#xff0c;就来谈一谈究竟什么是操作系统&#xff0c;为什么要有操作系统&#xff1f; 首先我们来大体的认识一下操作…

某塑料科技公司网络与机房监控运维项目

某塑料科技公司是由日本知名株式会社在中国投资的&#xff0c;以从事橡胶和塑料制品业为主的生产制造企业。随着企业信息化建设提速&#xff0c;信息化运用程度不断提高&#xff0c;对网络基础设施的管理也提出了更高要求&#xff0c;因此公司急需上线一款综合运维平台加强对整…

Go 语言 ORM 框架之 xorm

1、xorm 1.1、xorm 简介 xorm 是一个简单而强大的Go语言ORM库. 通过它可以使数据库操作非常简便。 特性 支持 struct 和数据库表之间的灵活映射&#xff0c;并支持自动同步事务支持同时支持原始SQL语句和ORM操作的混合执行使用连写来简化调用支持使用ID, In, Where, Limit,…

Linux—-vim基础使用

1、基本概念 Vim的工作模式有四种&#xff0c;普通模式&#xff0c;输入模式&#xff0c;命令模式&#xff0c;可视模式。 在终端中打开vim&#xff0c;只需要输入vim 文件&#xff0c;在普通模式下按i就会进入到输入模式&#xff0c;按下:进入命令模式&#xff0c;输入:q就可…

【前端学习——防抖和节流+案例】

定义 【前端八股文】节流和防抖 防抖 连续触发事件但是在设定的一段时间内只执行最后一次 代码实现思路【定时器】 大概意思就是&#xff1a; 每次按起键盘后&#xff0c;都将之前的定时器删除&#xff0c;重新开始计时。 节流 连续触发事件&#xff0c;只执行一次 …

Python从0到100(二十):文件读写和文件操作

一、文件的打开和关闭 有了文件系统可以非常方便的通过文件来读写数据&#xff1b;在Python中要实现文件操作是非常简单的。我们可以使用Python内置的open函数来打开文件&#xff0c;在使用open函数时&#xff0c;我们可以通过函数的参数指定文件名、操作模式和字符编码等信息…

某站戴师兄——Excel实战

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

Telnet的三种配置和SSH配置

Telnet的三种配置 实验配置思路&#xff1a; 配置接口IP地址&#xff1a; R1——配置接口IP地址 R2——配置接口IP地址 认证模式为none的配置 R1——认证模式配置为none R2——测试Telnet连接R1设备 认证模式为passwrd的配置 R1——认证模式配置为password R2——测试Telnet连…

19 内核开发-内核源码编译

19 内核开发-内核源码编译 (1)开始准备 安装好virtual box ubuntu 系统后&#xff0c;即可下载内核代码&#xff0c;进行编译 历史内核源码地址&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/kernel/v5.x/ 下载 linux-5.10.102.tar.gz 的包,可以使用wget 命令 创建编译目…

Linux字符设备驱动(二) - 与设备驱动模型的关系

一&#xff0c;从/dev目录说起 从事Linux嵌入式驱动开发的人&#xff0c;都很熟悉下面的一些基础知识&#xff0c; 比如&#xff0c;对于一个char类型的设备&#xff0c;我想对其进行read wirte 和ioctl操作&#xff0c;那么&#xff1a; 1&#xff09;我们通常会在内核驱动中…