Android复习(Android基础-四大组件)—— Service

news2024/9/24 3:22:14

1. Service的概述

  • Service是一个可以在后台长期运行并且不需要和用户进行交互的应用组件。

  • 主要负责:不需要和用户交互而且还要求长期运行的任务,比如耗时操作。

  • Service不是运行在一个独立的进程当中,不依赖于任何用户界面

  • 其依赖于创建Service时所在的应用程序。(当依赖的应用程序进程被杀掉时,Service也会被杀掉。)

  • Service的代码默认运行在主线程,除非我们手动创建一个子线程。(为了防止主线程被阻塞,我们需要在Service内部手动创建子线程)
    在这里插入图片描述

2. Service的基本用法

  • 定义一个Service类继承自Service(此时必须重写onBind方法,因为这个方法是一个抽象方法,并且是唯一一个),接着在Manifest文件中注册该Service(系统帮我们完成了)
package com.example.leakcanary1;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

public class MyService extends Service {
    String TAG ="Ning";
    
    public MyService() {
    }
    
    //是Service中唯一一个抽象方法,需要在子类MyService中实现
    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }
    
    //重写三个方法,Service最常用的三个方法
    //onCreate在服务器创建的时候调用
    //onStartCommand在每次服务器启动的时候调用
    //onDestroy在服务器销毁的时候调用
    
    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "onCreate: ");
    }

    //将服务一启动就执行的某些动作写在这个里面
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "onStartCommand: ");
        return super.onStartCommand(intent, flags, startId);
    }

    //回收那些不使用的资源
    @Override
    public void onDestroy() {
        Log.d(TAG, "onDestroy: ");
        super.onDestroy();
    }
}
  • 启动 & 停止
public class MainActivity extends AppCompatActivity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //Intent可以自己定制,这里只是个例子
        Intent intent = new Intent(this , MyService.class);
        startService(intent);
        stopService(intent);
    }
}

2.1 普通Service

  1. 新建类并继承Service,并且必须重写onBind方法。
  2. 有选择的重写onCreate()、onStartCommand()、onDestroy()方法。
  3. 在配置文件中进行注册。(四大组件除了Broadcast可以动态注册,其他组件都要在配置文件进行注册操作)
  4. 在Activity中利用Intent可实现Service的启动,startService()。

2.2 前台Service(WindowManager)

  • 前台Service和普通Service的最大区别:前台Service有一个正在运行的图标在系统状态栏显示,下拉状态栏后可以看到更详细的信息。(类似于通知的效果)
  • 前台Service目的:为了防止Service被回收。(内存不足时会回收Service),使用前台Service,执行一些用户能够注意到的操作。(比如听歌、跑步)
  • 前台Service的实现:和之前学的发送一个通知类似,构建好一个Notification,调用了startForeground()方法。而不是NotificationManager将通知显示出来。在onDestroy方法中,用stopForeground方法关闭。
//写在MyService中
@Override
public void onCreate() {
    super.onCreate();
    Log.d("MyService" , "onCreate: ");
    //使用前台服务
    Notification.Builder builder = new Notification.Builder(this);
    builder.setSmallIcon(R.mipmap.ic_launcher);

    builder.setContentTitle("Notification:");
    builder.setContentText("This is a Notification");
    builder.setWhen(System.currentTimeMillis());
    Notification notification = builder.build();
    //需要两个参数:唯一标识通知的整数型 、 用于状态来的Notification
    startForeground(1 , notification);
}

在这里插入图片描述

2.3 系统Service

  • 除了自定义一个Service,当然还有现有的Service。
  • 比如我们之间接触的NotificationManager。
  • 通过getSystemService()方法并传入一个Name就可以得到相应的Service对象。

3. Service生命周期

在这里插入图片描述

  1. onCreate:Service创建的时候调用。

    • 来执行一次调用程序,如果服务已在运行,则不会调用此方法。
  2. onStartCommand:每次调用startService时调用。

    • 当另一个组件(如Activity)调用startService请求启动服务时,一旦执行此方法,Service就会在后台无限执行直到调用Service.stopSelf或者stopService来停止服务。
    • 如果只需要绑定,则不用实现这个方法
  3. onBind:每次调用bindService时调用onBind。

    • 当另一个组件想要与服务绑定(如执行RPC)时,通过调用bindService()来调用onBind()。
    • 在onBind()实现中,必须返回IBinder,才能通过Binder来实现Activity和Service之间的通信。
    • 如果不允许绑定,则返回null。
  4. onUnBind:当另一个组件通过调用unbindService与服务解绑时,系统将调用此方法。

  5. onDestroy:Service销毁的时候调用。

    • Service应通过实现此方法来清理任何资源,如线程、注册的侦听器、接收器等。

3.1 启动Service & 停止Service

  • 后台Service会长期进行某项任务,比如下载一个文件。
  • startService() & stopService() & stopSelf()
  1. 组件调用 startService 启动Service时,如果该Service没有被创建过,
  • 生命周期为:onCreate --> onStartCommand -->
  • 多次调用startService时,Service的onCreate只会调用一次,不过每次都会调用onStartCommand方法。
  1. 如果没有调用 stopService 停止Service,Service就会一直在后台运行。
  • 直到后台使用stopSelf()自行停止运行(完成所有命令后,Service自己停止),或者其他组件通过调用stopService()将其停止为止。
  • 生命周期最后:onDestroy()

3.2 绑定Service & 解绑Service

  • 短暂的使用,通过绑定将外观的Activity和Service进行绑定,实现数据的交互。
  • bindService() & unbindService()
  1. 组件调用bindService时,如果该Service没有被创建过,
  • 生命周期为:onCreate() --> onBind() -->
  • 这个时候调用者和Service绑定在一起。调用方可以获取到onBind()方法中返回的IBinder对象实例,通过IBinder对象实例和Service进行通信。
  • 只要调用方和Service的连接没断开,Service就会一直运行。
  1. 调用者调用unbindService 或者 调用者(context)不存在了,不存在例如Activity被finish了。
  • 生命周期为:onUnBind() --> onDestroy()
  • 绑定在一起的含义:两者有关联、调用者被回收,那么Service也就被回收了。
  • 多次执行bindService时,onCreate和onBind方法只会调用一次。

3.3 Service的销毁

在这里插入图片描述

  • 其他service停止的情况
    在这里插入图片描述

4. Service与Thread

  • Service
  1. Service是Android四大组件之一,运行在主线程上,由系统托管。
  2. Service运行在主线程
  3. Service有优先级:前台进程 > 可见进程 > Service进程 > 后台进程 > 空进程 (Service可以在后台)当系统空间不足时,Android系统会优先关闭优先级比较低的东西,比如说某些Activity(在后台的)。
  4. Service的作用:后台运行和跨进程访问
    1. Service的目的是脱离Activity,真正进行后台进程。(Thread可以运行在Activity或Service中)
    2. Service类是可以供其他应用程序调用的。
  5. 如果需要执行耗时的任务,必须在Service中再创建一个Thread执行任务。
    • Service的优先级高于后台挂起的Activity,自然也高于Activity所创建的Thread。
    • 因此系统在内存不足时,优先杀死的是后台的Activity或者Thread,而不会轻易杀死Service组件。
  • Thread
  1. Thread只是一个用来执行后台任务的工具类
  2. Thread运行在子线程
  3. 而Thread只是在本类中使用,如果本类被回收那么这个Thread也就不能被调用了。

5. 相关问题

5.1 什么情况下即使用startService,又使用bindService?

  • 与Service产生联系,并且需要执行任务。
    在这里插入图片描述

5.2 启动和绑定共同作用下的Service生命周期和销毁?

  • 总结上面的内容
    在这里插入图片描述

5.3 为什么有了Service,还有Thread?它们分别为了什么?

在这里插入图片描述

5.4 如何保证Service不被杀死?

在这里插入图片描述

5.5 为什么要有服务?

在这里插入图片描述

5.6 Service有几种启动方式?

在这里插入图片描述

5.7 Activity和Service生命周期的不同?

在这里插入图片描述

5.8 服务里能不能执行耗时任务?

在这里插入图片描述

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

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

相关文章

无线电蓝牙音频-BES数字音频系统音频流图

+我V hezkz17进数字音频系统研究开发交流答疑群(课题组) (1)音乐播放音频流图 Decode"(解码)是指将编码后的数据转换回原始格式或可读取的形式的过程,SBC解码成PCM

Linux第三章之重定向 管道命令 环境变量PATH

一、了解Linux目录配置标准FHS FHS本质一套规定Linux目录结构,软件建议安装位置的标准。 使用Linux来开发产品或者发布软件的公司、个人太多,如果每家公司或者个人都按照自己的意愿来配置文件或者软件的存放位置,这无疑是一场灾难。 #进入…

WordPress--关闭主题和插件的自动更新

原文网址:WordPress--关闭主题和插件的自动更新_IT利刃出鞘的博客-CSDN博客 简介 本文介绍如何关闭WordPress主题和插件的自动更新提示。 方法 使用插件:Eay Updates Manager 安装完插件后,所有插件被管理,并自动关闭更新&…

PDM系统的协同优势

在现代制造业中,产品的复杂性和多样性日益增加,要实现高效的生产和交付,协同合作显得尤为重要。而PDM系统(Product Data Management,产品数据管理)作为关键工具,正是提升协同效率的有力支持。让…

NLP实战9:Transformer实战-单词预测

目录 一、定义模型 二、加载数据集 三、初始化实例 四、训练模型 五、评估模型 🍨 本文为[🔗365天深度学习训练营]内部限免文章(版权归 *K同学啊* 所有) 🍖 作者:[K同学啊] 模型结构图: &a…

【编程语言 · C语言 · malloc函数】

【编程语言 C语言 malloc函数】https://mp.weixin.qq.com/s?__bizMzg4NTE5MDAzOA&mid2247491503&idx1&sn856b0ee891614a00ae78e84161861e48&chksmcfade356f8da6a404f586365f1987cfc193c0465faf51d959bed9dc5e5e8ce6c112f607f18f3&payreadticketHOUhzlYV…

css图标 | 来自 fontawesome 字体文件的586 个小图标

1. css效果 /*!* Font Awesome 4.4.0 by davegandy - http://fontawesome.io - fontawesome* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)*/.fa-glass:before {content:"\f000"} .fa-music:before {content:"\f001"…

云原生势不可挡,如何跳离云原生深水区?

云原生是云计算领域一大热词,伴随云原生概念而来的是数字产业迎来井喷、数字变革来临、数字化得以破局以及新一波的技术红利等等。云原生即“云”原生,顾名思义是让“应用”最大程度地利用云的能力,发挥云价值的最佳路径。具体来说&#xff0…

transformers里的AutoTokenizer之返回值token_type_ids(二)

在很多案例中,AutoTokenizer会返回token_type_ids这个结果: token_type_ids的解释: 对于两个句子对来说,上一句都标识为0,下一句都标识为1。

ChatGPT + Stable Diffusion + 百度AI + MoviePy 实现文字生成视频,小说转视频,自媒体神器!(一)

ChatGPT Stable Diffusion 百度AI MoviePy 实现文字生成视频,小说转视频,自媒体神器!(一) 前言 最近大模型频出,但是对于我们普通人来说,如何使用这些AI工具来辅助我们的工作呢,或者参与进入我们的生活…

K8s的详细介绍

1.编写yaml文件的方式 2.yaml里面的内容介绍 Pod实现机制:(1)共享网络(2)共享存储 共享网络:通过Pause容器,把其他业务容器加入到Pause容器里面,让所有业务容器在同一个名称空间中,…

Linux 基础入门篇

挂载点 先在这块新的存储上做文件系统,但是并不是挂载到全局目录树的根上了,你是想让/home 目录和它关联,所以你需要把它挂载到/home目录上 新的粉色的存储设备上的文件系统挂载在了/home 目录,全局目录树/home就和粉色文件系统的…

一起学算法(二维数组篇)

1.概念定义 1.矩阵的定义 矩阵A(nm)的定义时按照长方形排列的复数或实数集合,其中n代表的是行数,m代表的是列数。如下所示,代表的是一个4x3的矩阵 在Java中,我们可以用A[n][m]来代表一个n*m的矩阵,其中A[i][j]代表的是…

Java如何实现将类文件打包为jar包

目录 将类文件打包为jar包 1.写类文件2.编译3.测试4.打jar包jar包应该怎么打? 1.首先确保你的项目2.选中你的项目,点右键3.选择runnable jar file4.如下图,直接看图5.然后点finish 将类文件打包为jar包 为实际项目写了一个工具类,但是每次使用时都需要…

记录--一个好用的轮子 turn.js 实现仿真翻书的效果

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 国际惯例,官网链接 官网传送门 Github地址 github上有几个demos例子,介绍了基础用法。 我参考官网的例子,写了一个demo示例 安装 turn.js 依赖 jquery 库&#xff0…

C++设计模式之建造者设计模式

C建造者设计模式 什么是建造者设计模式 建造者设计模式是一种创建型设计模式,它是一种将复杂对象的分解为多个独立部分的模式,以便于构建对象的过程可以被抽象出来并独立变化。 该模式有什么优缺点 优点 灵活性:建造者设计模式允许对象的…

Nacos1.4.1集群——服务注册失败的原因

前言: 学习nacos的时候碰到的问题 当你单击启动的时候不会出现问题 命令: 单击: startup.cmd -m standalone 集群: startup.cmd -m cluster 当时当你启动集群的时候他会默认把你本地的ipv6那个地址默认放上出 会导致你本来搭建集群…

牛客网Verilog刷题——VL56

牛客网Verilog刷题——VL56 题目答案 题目 实现4bit无符号数流水线乘法器设计。电路的接口如下图所示: 输入输出描述: 信号类型输入/输出位宽描述clkwireInput1系统时钟信号rst_nwireInput1异步复位信号,低电平有效mul_awireInputsize乘数mu…

【动态规划part16】| 583.两个字符串的删除操作、72.编辑距离

🎈LeetCode583.两个字符串的删除操作 链接:583.两个字符串的删除操作 给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 public int minDistance(String word1, Str…

基于Amoeba读写分离(三十六)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 今天要学的是基于Amoeba读写分离。Amoeba是一个开源的关系型数据库管理系统&#xf…