Android Service 使用

在Android应用开发中,Service是一种非常重要的组件。Service可以在后台执行长时间运行的任务,例如播放音乐、下载文件等。在本文中,我将会介绍如何使用Service组件,并通过代码实现来说明它的作用。

在这里插入图片描述

Android Service概述

在Android应用程序中,Service是一种可以在后台执行长时间运行的任务的组件。Service通常用于执行一些不需要与用户交互的任务,例如后台播放音乐、下载文件等。Service是在主线程之外的线程中运行的,因此不会阻塞UI线程。

在Android中,Service有两种类型:Started Service和Bound Service。

Started Service是一种启动式Service,它可以在后台执行独立的任务。当应用程序启动Started Service时,Service将一直运行,直到任务完成或应用程序停止Service。

Bound Service是一种绑定式Service,它与应用程序中的其他组件进行绑定,并且可以与这些组件进行通信。当应用程序与Bound Service解除绑定时,Service将停止。

Service生命周期

Service有以下生命周期方法:

onCreate():当Service第一次创建时调用。
onStartCommand():当应用程序启动Service时调用。
onBind():当应用程序绑定Service时调用。
onUnbind():当应用程序解除绑定Service时调用。
onDestroy():当Service销毁时调用。

Service生命周期图如下所示:

Android Service代码实现

下面是一个简单的Android Service的示例,其中将会实现一个简单的音乐播放器。在该示例中,我们将会使用Started Service来播放音乐,并且使用Notification来显示音乐播放状态。

创建Service类

首先,我们需要创建一个Service类,用于执行音乐播放任务。在该Service中,我们将会使用MediaPlayer类来播放音乐,并使用Notification来显示音乐播放状态。

public class MusicService extends Service {
    private MediaPlayer mediaPlayer;
    private NotificationManager notificationManager;
    private NotificationCompat.Builder notificationBuilder;

    @Override
    public void onCreate() {
        super.onCreate();
        mediaPlayer = MediaPlayer.create(this, R.raw.music);
        notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        notificationBuilder = new NotificationCompat.Builder(this, CHANNEL_ID)
                .setSmallIcon(R.drawable.ic_music_note)
                .setContentTitle(getString(R.string.app_name))
                .setContentText(getString(R.string.notification_playing))
                .setPriority(NotificationCompat.PRIORITY_DEFAULT)
                .setOngoing(true)
                .setAutoCancel(false);
        createNotificationChannel();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        mediaPlayer.start();
        startForeground(NOTIFICATION_ID, notificationBuilder.build());
        return START_NOT_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mediaPlayer.stop();
        mediaPlayer.release();
        notificationManager.cancel(NOTIFICATION_ID);
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    private void createNotificationChannel() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT);
            notificationManager.createNotificationChannel(channel);
        }
    }
}

在该Service中,我们使用MediaPlayer类来播放音乐。在onCreate()方法中,我们初始化MediaPlayer对象,并且创建Notification对象。在onStartCommand()方法中,我们启动Service,并且将Service设置为前台Service,并且显示Notification。在onDestroy()方法中,我们停止音乐播放,并且取消Notification。

启动Service

在MainActivity中,我们可以使用以下代码来启动MusicService:

Intent intent = new Intent(this, MusicService.class);
ContextCompat.startForegroundService(this, intent);

在该代码中,我们使用Intent对象来指定Service类,并且使用ContextCompat.startForegroundService()方法来启动Service。

停止Service

我们可以使用以下代码来停止MusicService:

Intent intent = new Intent(this, MusicService.class);
stopService(intent);

在该代码中,我们使用Intent对象来指定Service类,并且使用stopService()方法来停止Service。

START_NOT_STICKYSTART_STICK 有什么区别

当您在Android中使用startService()方法启动服务时,可以传递一个标志,指定系统在任何原因下(例如低内存)杀死服务时应该发生什么。最常见的两个标志是START_NOT_STICKYSTART_STICKY

START_NOT_STICKY表示如果系统在服务启动后杀死服务,则不应自动重启服务。 即使有待处理的Intent,系统也不会尝试重新创建服务。

例如,如果您的服务正在播放音乐并且由于低内存而被系统杀死,则音乐播放将停止,服务不会自动重启。

另一方面,START_STICKY表示如果系统在服务启动后杀死该服务,则应在有足够资源时自动重启服务。 系统会尝试尽快重新创建服务,并且还将传递未传递的任何待处理Intent。

例如,如果您的服务正在下载文件并且由于低内存而被系统杀死,则服务将在有足够资源时自动重新启动,下载将从上次停止的地方继续进行。

需要注意的是,START_STICKY不能保证服务始终运行。 如果系统确定不需要服务,则仍可能杀死它。

总之,START_NOT_STICKY表示如果服务被杀死,则不会自动重新启动服务,而START_STICKY表示当有足够资源时,服务应该自动重新启动。

总结

在本文中,我们介绍了Android Service的概述和生命周期,并通过一个简单的示例来说明如何使用Service组件。如果您需要在应用程序中执行后台任务,则Service是一种非常有用的组件。通过使用Service,您可以在后台执行长时间运行的任务,并且不会阻塞UI线程。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何为博客选择目标受众(+例子)

要创建免费网站和博客?从易服客建站平台开始 500M免费空间,可升级为20GB电子商务网站 创建免费网站 您是否正在寻找为您的博客选择目标受众的最佳实践? 选择目标受众可以让您创建更好的内容,引起用户的共鸣。这有助于您获得更…

【PDF软件篇】PDF轻量化电子笔记编辑利刃-Xodo软件优化

【PDF软件篇】PDF轻量化电子笔记编辑利刃-Xodo软件优化 默认配置已经够强,但是我还是推荐自定义,适合自己的就是最好的—【蘇小沐】 文章目录 【PDF软件篇】PDF轻量化电子笔记编辑利刃-Xodo软件优化1.实验环境 (一)日常办公导出无…

以SpringMVC入门案例分析服务器初始化过程、单次请求流程

文章目录 1,SpringMVC概述2,SpringMVC入门案例2.1 需求分析2.2 案例制作步骤1:创建Maven项目步骤2:补全目录结构步骤3:导入jar包步骤4:创建配置类步骤5:创建Controller类步骤6:使用配置类替换web.xml步骤7:配置Tomcat环境步骤8:启动运行项目步骤9:浏览器…

三分钟挖掘快速软件开发框架提高办公效率的秘诀

在科技日新月异的当今社会,学会利用快速软件开发框架,可以给企业带来更大的便利和市场价值。因为它拥有可视化设计、灵活简便、易操作、易上手等优势特点,在助推企业实现数字化转型的过程中有着举足轻重的作用。那么,快速软件开发…

编译原理笔记(一)引论

文章目录 1.什么是编译程序2.编译过程和编译程序的结构2.1.编译过程概述2.2.编译程序的结构2.3.编译阶段的组合 3.解释程序和一些软件工具3.1.解释程序3.2.处理源程序的软件工具 4.PL/0语言编译系统 学习总结:这一部分是编译原理的绪论部分内容,对编译程…

网络分析和机器学习

文章目录 网络分析1.Introduction to networks and graph foundations and algorithmsNetwork types (social/bio/comp), Euler/Hamilton, Graphs (matrix/adj)Breadth-first search (shortest paths), Depth-first search (conn. compnts) 2. Emergent global / local network…

Trie与可持久化Trie

Trie Trie,也称为字典树或前缀树,是一种用于高效存储和检索字符串的树形数据结构。它的主要特点是利用字符串的公共前缀来减少存储空间和提高查询效率。下面是对 Trie 的常见操作的介绍: 插入(Insertion)&#xff1a…

Deformable DETR 论文学习

1. 解决了什么问题? DETR 去除了目标检测算法中的人为设计,取得了不错的表现。但是其收敛速度很慢,对低分辨率特征识别效果差: 模型初始化时,注意力模块给特征图上所有的像素点分配的权重是均匀的,就需要…

元宇宙应用领域-工业

元宇宙是指虚拟空间的总称,在这个虚拟空间中,用户可以像在现实世界一样,通过虚拟现实技术进行交互和体验。元宇宙应用领域非常广泛,如工业、游戏、娱乐、教育、医疗、房地产等。 工业领域中,元宇宙可用于在设计阶段帮…

物联网应用普及正在改变我们的生活

物联网(Internet of Things,IoT)指的是通过互联网连接各种物品、设备和传感器,实现物品之间的互联互通,形成智能化、自动化的数据交互和服务体系。简单来说,就是将各类物品通过互联网连接,实现互…

新榜 | “淄博”现象专项观察报告

在过去的一个月中,淄博烧烤的相关话题霸屏网络,这些媒介话题里承载了多少受众的向往与想象? 根据2022年淄博市文旅局公开年报,去年,淄博官方就着力融媒体,在抖音、快手等平台创新使用“淄博到底有多牛”主题…

智能图像处理技术:开启未来视觉时代

写在前面技术论坛■ 智能文档图像处理技术■ 大模型时代的文档识别与理解■ 篡改文本图像的生成与检测 圆桌讨论未来愿景 写在前面 文档 是人们在日常生活、工作中产生的信息的重要载体,各领域从业者几乎每天都要与金融票据、商业规划、财务报表、会议记录、合同、…

react类组件生命周期基础总结

组件的生命周期是指组件从被创建到挂载到页面中运行起来,再到组件不用时卸载的过程,只有类组件才有生命周期(类组件 实例化 函数组件 不需要实例化) 生命周期新版本和旧版本的对比图如下: 生命周期(constr…

GPT专业应用:撰写工作简报

●图片由Lexica 生成,输入:Workers working overtime 工作简报,作为一种了解情况、沟通信息的有效手段,能使上级机关和领导及时了解、掌握所属部门的政治学习、军事训练、行政管理等方面的最新情况;同时,能…

非暴力沟通模型

非暴力沟通模型 非暴力沟通的创始人是马歇尔.卢森堡,师从人本主义心理学之父卡尔.罗杰斯。《非暴力沟通》一书入选香港大学推荐的50本必读书籍之列。 模型介绍 非暴力沟通(英文名称:NonviolentCommunication,简称NVC)…

运行时栈帧结构与方法调用

1 运行时栈帧结构 Java虚拟机以方法作为最基本执行单元,“栈帧”则是用于支持虚拟机进行方法调用和方法执行背后的数据结构。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。 1.1 局部变量表 局部变量表的容量以变量槽为最小单位。 Java…

JSDoc 拥抱 Javascript

JSDoc 在 vs code 已经内置了. 可以在 js 文件的开头添加 // ts-check 即可. 在注释中标注来实现一些 ts 的功能. JSDoc 支持以下注解. Types typeparam (or arg or argument)returns (or return)typedefcallbacktemplate Classes Property Modifiers public, private, p…

Windows Server 2016 中文版、英文版下载 (updated May 2023)

Windows Server 2016 中文版、英文版下载 (updated May 2023) Windows Server 2016 Version 1607,2023 年 5 月更新 请访问原文链接:https://sysin.org/blog/windows-server-2016/,查看最新版。原创作品,转载请保留出处。 作者…

ChatGPT + MindShow 制作PPT

🍏🍐🍊🍑🍒🍓🫐🥑🍋🍉🥝 ChatGPT MindShow 制作PPT 文章目录 🍐具体操作🐳结语 🍐具体操作 ChatGP…

2023—Unity打包Pico4(3)全流程(Pico插件)

一、项目选择了2021.3.0版本的URP,把项目Build成Android 二、打开Project Setting→ 安装最下面的XR Plugin Management 安装完成后的界面,此时还没有Pico选项出现 三、我们需要在该网站下载Pico的SDK包 picoxr/VRTK-Support (github.com) 解压该文件到…