Android组件——Service

news2024/11/19 20:34:02

一、多任务实现的基本原理

  • 默认情况下,同一个应用程序的所有组件都运行在同一个进程中,大部分应用程序是按这种方式运行的
  • 在具体应用中需要通过设置mainifest文件中组件的android:process属性,是该组件运行在不同的进程中
  • 元素也支持android:process属性,用于指定所有组件的默认进程

进程的层次结构

  • 前台进程
  • 可见进程
  • 服务进程
  • 后台进程
  • 空进程

安卓中的线程

Android是单线程的模型,我们创建的Service、Activity均是在一个主线程处理,即UI线程。应用程序默认是一个单任务单线程的程序
UI线程运行着许多重要的逻辑,如事件处理、用户输入输出、Service等
在这里插入图片描述
虽然我们感觉上许多任务在同时运行,但实际上却是通过调度算法进行的串行运行。
因此,我们编写的代码实际上是穿插在主线程运行的,如果我们插入的代码比较耗时,就会阻塞UI线程上其他逻辑的执行,从而造成页面卡顿。如果卡顿超过5秒,系统就会触发ANR错误。所以,执行耗时的操作,需要创建新的线程执行。

注意:Android中的UI toolkit不是线程安全的,不能在非UI线程更新UI,所有对界面的更新都必须在UI线程执行

多任务的实现原理

  • Android中的两种线程:UI主线程和工作线程
  • 通常把耗时的操作放到工作线程执行,操作完成后,再通知主线程做出相应的响应

AsyncTask

  • AsyncTask是android提供的异步处理的辅助类,可以实现耗时任务在其他线程处理,而处理结果在UI线程执行
  • 屏蔽了线程和Handler,进行了高度封装
  • 具有特定功能的回调方法:
    onPreExecute():预处理方法
    publishProgress():更新进度方法
    onPostExecute():返回结果的方法
    

示例代码

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private Button btn;

    private TextView txt;

    private ProgressBar progress;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn = findViewById(R.id.btn);
        txt = findViewById(R.id.txt);
        progress = findViewById(R.id.progress_horizontal);
        btn.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn:
                progress.setVisibility(ProgressBar.VISIBLE);
                MyAsyncTask myAsyncTask = new MyAsyncTask();
                myAsyncTask.execute(1000);
                break;
        }
    }


    private class MyAsyncTask extends AsyncTask<Integer, Integer, String> {

        private final static String TAG = "MyAsyncTask";

        public MyAsyncTask() {
            super();
        }

        @Override
        protected void onPreExecute() {
            Log.d(TAG, "onPreExecute, thread id is: " + Thread.currentThread().getId());
        }

        @Override
        protected void onPostExecute(String s) {
            Log.d(TAG, "onPostExecute, thread id is: " + Thread.currentThread().getId());
            txt.setText(s);
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            Log.d(TAG, "onProgressUpdate, thread id is: " + Thread.currentThread().getId());
            progress.setProgress(values[0]);
        }

        @Override
        protected String doInBackground(Integer... integers) {
            Log.d(TAG, "doInBackground, thread id is: " + Thread.currentThread().getId());
            for (int i = 0; i <= 10; i++) {
                publishProgress(i*10);
                try {
                    Thread.sleep(integers[0]);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return "更新完成";
        }
    }
}

Handler机制

Handler是通过消息队列进行通信的机制

  • Handler:负责消息的发送和处理,通过它实现工作线程和UI线程的消息通讯
  • Looper:负责管理线程的消息队列和消息循环
  • Message:线程间通讯的消息载体,Message充当消息封装的功能
  • MessageQueue:消息队列,先进先出,保存待线程处理的消息
    在这里插入图片描述

Looper类
Looper类是android系统封装消息循环和消息队列的一个类,线程可以通过Looper对象读写某个消息队列

	Looper.myLooper():获得当前线程的Looper对象
	Looper.getMainLooper():获得当前进程的主线程的Looper对象
	Looper.prepare():创建消息队列
	Looper.loop():进入消息循环

二、Service

Service是一个能够在后台执行长时间运行的操作应用程序组件,不提供用户界面,应用在后台启动一个Service运行,即使用户切换到另一个应用此Service业务继续运行

特点

  • 无法与用户直接交互
  • 必须由用户或其他程序启动
  • 优先级介于前台应用和后台应用之间

Service具有自己的生命周期。Service生命周期与Activity生命周期是分离的,当Activity被暂停、销毁时,Service组件还可以继续处理其他任务

安卓支持服务的原因:

  • 允许执行后台任务
  • 实现同一设备上应用之间的跨进程通信

创建方式

  • 自启动方式:startService
  • 绑定方式:bindService
    在这里插入图片描述

自启动方式

在这里插入图片描述

绑定方式

在这里插入图片描述

服务的生命周期

在这里插入图片描述

创建自启动类型服务

  • 通过startService()方法创建一个启动型的Service
  • 启动服务时需要通过intent显示或者隐式启动,Intent可以携带一部分数据,在Service的onStartCommand中可以使用其数据
  • 默认启动的服务存在于主线程中,会导致主线程阻塞,故通常采用新线程模式启动服务
    继承Service
    继承IntentService

IntentService

IntentService是Service的子类,用于处理异步请求。大多数服务不需要处理多个请求,所以用IntentService是很好的选择。
客户端可以通过startService(Intent)方法传递请求Intent信息
IntentService实际上是实际上是

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

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

相关文章

strapi系列-如何创建一个定时任务-Cron Jobs

Cron 是什么&#xff1f; Cron 有多种用途。 Cron Jobs 用于安排服务器上的任务运行。它们最常用于自动化系统管理或维护。然而,它们也与 Web 应用程序的构建相关。 Web 应用程序可能需要在各种情况下定期执行特定操作。 为什么使用 Cron &#xff1f; 定期进行的计划活动,C…

【SpringMVC】异常处理

目录 一、基本介绍 二、局部异常 三、全局异常 四、自定义异常 五、统一处理异常 六、异常处理流程 相关文章&#xff08;可以关注我的SpringMVC专栏&#xff09; SpingMVC专栏SpingMVC专栏一、基本介绍如果我们对异常不做任何处理的话&#xff0c;那么他就会返回500错误&…

list底层实现

目录 引言 结构形式 整体框架 插入删除接口实现 析构函数、拷贝构造、赋值重载 const迭代器实现 取得链表长度的方式 迭代器前置\后置operator -- 以及operator-> 引言 list是非常常用的一个容器&#xff0c;数据结构是链表&#xff0c;数据空间是以链式结构存储的…

QT中控件不满足要求那么为你的控件做“提升”吧

我们在VisualStudio中例如VC或者C#中写一些个性化比较强的项目都会对控件有更高的要求&#xff0c;那么当我们的要求得不到满足时就需要考虑用到自定义控件了&#xff0c;其中自定义控件有两种方式&#xff0c;一种是完全重写&#xff0c;另一种简单的方法是继承自现有的控件。…

指针深度解剖,从内存详细了解指针

目录 &#x1f695;第一组&#xff1a;一维数组 &#x1f68c;第二组&#xff1a;字符数组 &#x1f690;字符数组1.0 &#x1f68e;字符数组1.1 &#x1f691;字符数组2 &#x1f69a;字符数组3 &#x1f69c;第三组&#xff1a;二维数组 &#x1f697;在上次的博客之中我们…

INVS里的DanglingWire的自动化清理实战

在上一讲中一起了解了INVS里的DanglingWire&#xff08;innovus中的DanglingWire&#xff08;悬垂线&#xff09;的理解和处理&#xff09;&#xff0c;常言道理论联系实际&#xff0c;在理解原理的基础上&#xff0c;那一定是要服务项目的&#xff0c;这篇后续火速跟进&#x…

中国第一个 Apache 顶级开源项目的突围之路!

【CSDN 编者按】近些年开源大热&#xff0c;开源创业之风随之四起。作为近两年特别火的商业方向&#xff0c;开源创业者如何才能在一片红海中乘风破浪&#xff0c;在行业中占据一席之地&#xff1f;第一个由中国人主导贡献到 ASF 的顶级开源项目 Apache Kylin 做出了有效探索&a…

字节序,主机字节序与网络字节序

&#x1f4cc;————本章重点————&#x1f4cc; &#x1f517;了解字节序的概念; &#x1f517;了解大小端的概念;&#x1f517;了解主机字节序和网络字节序的区别;&#x1f517;学习主机字节序和网络字节序相机转化的接口; ✨————————————✨字节序 概念&am…

人工智能助力古彝文识别,推动传统文化传承

人工智能助力古彝文识别&#xff0c;推动传统文化传承0. 前言1. 古彝文1.1 古彝文介绍1.2 古彝文识别的重要意义1.3 古彝文识别的挑战2. 古彝文识别国内外研究进展3. 基于深度学习的古彝文识别3.1 深度学习简介3.2 基于深度学习的古彝文识别模型架构4. 古彝文识别进展与展望小结…

HTML小游戏19 —— html5版开心斗地主小游戏(附完整源码)

&#x1f482; 网站推荐:【神级源码资源网】【摸鱼小游戏】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 想寻找共同学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】本节教程我会带大家使用 HTML…

【练习】Day05

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录一、选择二、编程1. 跳跃游戏[贪心算法]2. 寻找重复数[注意思路&#xff01;]答案1. 选择2. 编程普通小孩也要热爱生活&#xff01; 一、选择 HASH 函数冲突处理方式不包括以下哪一项&#xff1a;&#xff08;&…

YOLOv5源码详解——项目目录

YOLOv5 目录 .github .github相关&#xff0c;不重要 datasets 存放数据集,刚下载下来的源码是不包含这个文件夹的 classify 图像分类模块&#xff0c;包含以下4个文件 predict.py —— 图像分类预测脚本train.py ——图像分类训练脚本val.py —— 图像分类验证脚本tutorial.…

Java开发学习(四十一)----MyBatisPlus标准数据层(增删查改分页)开发

一、标准CRUD使用 对于标准的CRUD功能都有哪些以及MyBatisPlus都提供了哪些方法可以使用呢? 我们先来看张图: 1.1 环境准备 这里用的环境就是Java开发学习(四十)----MyBatisPlus入门案例与简介中使用的环境 二、新增 在进行新增之前&#xff0c;我们可以分析下新增的方法…

马蹄集 公式计算

公式计算 难度&#xff1a;青铜 01 时间限制&#xff1a;1秒巴占用内存&#xff1a;64M 计算公式 (1/2)*(a*xc(ac)/(4*a)》 格式 输入格式&#xff1a;输入为整型x,a,空格分隔 #include <bits/stdc.h> using namespace std; int main() {int x, a;cin >> x >&g…

1、JDK17安装

目录 一、简介 二、安装步骤 三、在Windows 10系统中配置环境变量 四、运行jdk 一、简介 JDK全称Java SE Development kit(JDK)&#xff0c;即java标准版开发包&#xff0c;是Oracle提供的一套用于开发java应用程序的开发包&#xff0c;它提供编译&#xff0c;运行java程…

二叉树【数据结构】【超详细,一学就会!!!】

目录 &#x1f4d6;1.什么是二叉树&#xff1f; &#x1f334;2.满二叉树和完全二叉树 ⛳2.二叉树的性质 &#x1f525;3.二叉树的创建与遍历 3.1 创建二叉树 3.2 前中后序遍历——递归和非递归 &#x1f3f9;4.二叉树的实现 1️⃣获取树中节点的个数 2️⃣获取叶子节点…

MATLAB-三维插值运算

MATLAB中是支持三维及三维以上的高维插值的。三维插值的基本原理与一维插值和二维插值是一样的&#xff0c;但三维插值是对三维函数进行的插值。在MATLAB中&#xff0c;使用interp3函数实现插值&#xff0c;其调用格式如下。vi interp3(x,y,z,v,xi,yi,zi) %返回值 vi是三维插值…

2022ICPC杭州站

A. Modulo Ruins the Legend 题目链接&#xff1a;Problem - A - Codeforces 样例1输入&#xff1a; 6 24 1 1 4 5 1 4样例1输出&#xff1a; 1 0 5样例2输入&#xff1a; 7 29 1 9 1 9 8 1 0样例2输出&#xff1a; 0 0 0题意&#xff1a;给你一个长度为n的数组a[]&#x…

【NI Multisim 14.0原理图的设计——原理图分类】

目录 序言 一、原理图的设计 &#x1f34a;知识点&#xff1a; 二、原理图分类 &#x1f349;1.平坦式电路 &#x1f349; 2.层次式电路图 序言 NI Multisim最突出的特点之一就是用户界面友好。它可以使电路设计者方便、快捷地使用虚拟元器件和仪器、仪表进行电路设计和…

【用JS自制表格软件玩数据】10. 为表格脚本设计一个语法解析器

设计脚本语言的语法解析器概述脚本源码语法预览运行效果如下图设计计算符号的优先级定义一些关键词生成一份关键词的map方便引用枚举关键词的类型错误异常的捕获字符匹配代码的字符转化成迭代器关键词标记器词法分析器设计一个队列处理器源代码字符串迭代器代码的块级运行环境脚…