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

news2024/9/21 15:21:09

文章目录

  • 一、线程
  • 二、解决异步消息处理机制
    • 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方法中返回这个实例
   @Override
    public 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() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            downloadBinder = (MyService.DownloadBinder) service;
            downloadBinder.startDownload();
            downloadBinder.getProgress();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };
  • 在活动中定义一个 ServiceConnection 对象和一个 boolean 变量用于跟踪服务是否已绑定, MyService.LocalBinder是服务中的类,可以通过这个类在活动中调用服务中的方法
private MyService myService;
private boolean isServiceBound = false;

private ServiceConnection serviceConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
        MyService.LocalBinder binder = (MyService.LocalBinder) iBinder;
        myService = binder.getService();
        isServiceBound = true;
    }

    @Override
    public 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"/>

      <service
            android:name=".MyService"
            android:foregroundServiceType="specialUse"
            android:enabled="true"
            android:exported="true" />

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

 startForeground(1,notification);

5、使用IntentService

IntentService 让服务在子线程中运行

四、服务的最佳实践

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

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

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

相关文章

Django框架之请求生命周期流程图

一、引言 WSGI、wsgiref、uwsgi三者是什么关系? WSGI是协议&#xff0c;小写的wsgiref和uwsgi是实现该协议的功能模块 缓存数据库 提前已经将你想要的数据准备好了&#xff0c;需要的时候直接拿就可以&#xff0c;提高了效率和响应时间。 eg:当你在修改你的数据的时候&…

某了么数据获取脚本

某了么数据获取脚本 这段代码定义了一个名为 ElemeH5 的类&#xff0c;继承自 Base 类&#xff0c;用于处理与饿了么平台的API交互。该类包括了多种方法来进行网络请求、数据处理和API接口的动态生成。以下是对主要组成部分的详细解析&#xff1a; 类属性定义&#xff1a; fun…

MQ如何保证可靠性

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;MQ ⛺️稳中求进&#xff0c;晒太阳 消息到达MQ以后&#xff0c;如果MQ不能及时保存&#xff0c;也会导致消息丢失&#xff0c;所以MQ的可靠性也非常重要。 2.数据持久化 为了提高性能&a…

【C语言】文件操作(万字解读超详细解析)

最好的时光&#xff0c;在路上;最好的生活&#xff0c;在别处。独自上路去看看这个世界&#xff0c;你终将与最好的自己相遇。&#x1f493;&#x1f493;&#x1f493; 目录 • ✨说在前面 &#x1f34b;知识点一&#xff1a;什么是文件&#xff1f; • &#x1f330;1.程序…

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

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

表空间的概述

目录 表空间的属性 表空间的类型 永久性表空间(PermanentTablespace) 临时表空间(Temp Tablespace ) 撤销表空间(Undo Tablespace) 大文件表空间(BigfileTablespace) 表空间的状态 联机状态(Online) 读写状态(Read Write) 只读状态(Read) 脱机状态(Offline) Oracle从…

[ 项目 ] tcmalloc简化版—高并发内存池

目录 前言 基本介绍 高并发 内存池 定长内存池 基本介绍 框架设计 具体实现 性能测试 整体框架介绍 申请内存过程 threadcache 1.基本介绍 2.具体实现 centralcache 1.基本介绍 2.具体实现 pagecache 1.基本介绍 2.具体实现 申请内存连通 释放内存过…

百科词条创建机构有哪些?

在互联网时代&#xff0c;百度百科作为我国最大的中文百科全书&#xff0c;已经成为人们获取知识、查询信息的重要途径。随着百度百科影响力的不断扩大&#xff0c;越来越多的人和企业试图通过创建企业词条来提升自身知名度&#xff0c;企业和个人为了在百度百科上占据一席之地…

Java_从入门到JavaEE_09

一、构造方法/构造器 含义&#xff1a;和new一起是创建对象的功能 特点&#xff1a; 与类名相同的方法没有返回项 注意&#xff1a; 当类中没有写构造方法时&#xff0c;系统会默认添加无参构造&#xff08;无参数的构造方法&#xff09;构造方法可以重载的 有参构造好处&…

Linux 第二十章

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

Transformer详解:从放弃到入门(一)

Transformer由论文《Attention is All You Need》提出&#xff0c;是一种用于自然语言处理&#xff08;NLP&#xff09;和其他序列到序列&#xff08;sequence-to-sequence&#xff09;任务的深度学习模型架构&#xff0c;在自然语言处理领域获得了巨大的成功&#xff0c;在这个…

自动化运维工具---Ansible

一 Puppet Puppet是历史悠久的运维工具之一。它是一种基础架构即代码(laC)工具&#xff0c;使用户可以定义其基础 架构所需的状态&#xff0c;并使系统自动化以实现相同状态。 Puppet可监视用户的所有系统&#xff0c;并防止任何偏离已定义状态的情况。从简单的工作流程自动…

数据仓库基础理论(学习笔记)

数据仓库基础理论 1.数据仓库概念 2.数据仓库为何而来 3.数据仓库主要特征 4.OLTP、OLAP系统 5.数据仓库与数据库的区别 6.数据仓库与数据集市的区别 7.数据仓库分层架构 7.1为什么要分层&#xff1f; 8.ETL、ELT

NFS共享存储服务配置实践

一、NFS 1.NFS定义 NFS&#xff08;Network File System&#xff09;网络文件服务&#xff1a;基于TCP/IP传输的网络文件系统协议&#xff0c;NFS服务的实现依赖于RPC&#xff08;Remote Process Call&#xff09;远端过程调用&#xff1a;通过使用NFS协议&#xff0c;客户机…

ICode国际青少年编程竞赛- Python-1级训练场-变量入门

ICode国际青少年编程竞赛- Python-1级训练场-变量入门 1、 a 4 Dev.turnRight() Dev.step(a)2、 a 4 Spaceship.step(a) Dev.step(a)3、 a 4 Dev.step(a) Dev.turnLeft() Dev.step(a)4、 a 5 Dev.step(a) Spaceship.step(a) Dev.step(a)5、 a 3 Dev.step(a) Dev.tur…

C语言写的LLM训练

特斯拉前 AI 总监、OpenAI 创始团队成员 Andrej Karpathy 用 C 代码完成了 GPT-2 大模型训练过程&#xff1a;karpathy/llm.c: LLM training in simple, raw C/CUDA (github.com) 下载源码 git clone --recursive https://github.com/karpathy/llm.c.git下载模型 从HF-Mirro…

Burp和Proxifier抓包微信小程序

1、Burp设置代理 2、浏览器下载证书 3、安装证书 4、Proxifier设置代理 5、Proxifier设置Proxification Rule 6、Burp查看抓包数据 打开一个小程序&#xff0c;可以看到WeChatAppEx的流量先经过Proxifier&#xff0c;再经过127.0.0.1:8080到Burp

基于现有语言大模型,定制“人人AI气象”公众号天气助手

最近&#xff0c;月之暗面的Kimi大模型非常受欢迎&#xff0c;尝试用了moonshot(128K)基座模型&#xff0c;通过调用各种公开渠道的API&#xff0c;简易实现了一个天气助手&#xff0c;可以回答天气相关的基础概念、原理、应用等方面的问题&#xff0c;同时也可调用多个插件获取…

音频可视化:原生音频API为前端带来的全新可能!

音频API是一组提供给网页开发者的接口&#xff0c;允许他们直接在浏览器中处理音频内容。这些API使得在不依赖任何外部插件的情况下操作和控制音频成为可能。 Web Audio API 可以进行音频的播放、处理、合成以及分析等操作。借助于这些工具&#xff0c;开发者可以实现自定义的音…

MoonBit 开源之夏重磅来袭!12000元奖金等你来拿!

宣讲视频 MoonBit 开源之夏宣讲视频 关于我们 开源之夏 「开源之夏 (OSPP)」是中科院软件所「开源软件供应链点亮计划」指导下的系列暑期活动&#xff0c;旨在鼓励在校学生积极参与开源软件的开发维护&#xff0c;培养和发掘更多优秀的开发者&#xff0c;促进优秀开源软件社区…