Android Service 使用

news2024/10/7 10:15:46

在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.coloradmin.cn/o/539415.html

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

相关文章

微信小程序xr-frame实现交互(地月案例)

基础知识: 1.轮廓 如果想要与场景中的物体进行互动,比如说点击、拖拽物体,那么这个物体得先拥有一个轮廓才行。轮廓是一个组件。与某个物体互动,实际上是在与这个物体的轮廓进行互动,轮廓让这个物体在物理世界中拥有…

C++职工管理系统(类继承、文件、指针操作、中文乱码解决)

文件目录及界面 CMakeLists.txt避免中文乱码配置。 # C的解决办法 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -fexec-charsetGBK") # C 的解决办法 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -fexec-charsetGBK") 一、退出管理程序 退出当前管理…

不需要#魔#法就能直接访问chatgpt

你还在付费使用chatgpt吗?你还在使用魔法访问chatgpt吗?你还在忍受每分钟刷新一下页面才能继续与gpt聊天吗? 今天给大家分享2种方法,可以使用国内网络在本地就能直接访问chatgpt。 这两种方法都是基于GitHub上的开源项目chatbot-u…

基于SSM的网上宠物店

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

低代码赋能生物药企数字化

一、关于复宏汉霖 汉霖是复星在2010年投资孵化的一家生物医药公司,经过这十几年的发展,2019年在港股上市,是生物药企18A企业之一。 经过这些年的发展,我们在管线方面布局了肿瘤、肢体、免疫、眼科类,从早研阶段到临床…

Midjourney|文心一格prompt教程[Text Prompt(下篇)]:游戏、实物、人物、风景、动漫、邮票、海报等生成,终极模板教学

Midjourney|文心一格prompt教程[Text Prompt(下篇)]:游戏、实物、人物、风景、动漫、邮票、海报等生成,终极模板教学 场景6:游戏 Prompt 真的越长越好吗? 按照 Midjourney 的官方文档里的说法&#xff0…

基于html+css的图展示76

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

人类禁止进入的“微博”,我的AI机器人在那里吹牛,“勾搭”AI小姑娘

最近球友推荐了一个非常有趣的网站,叫“奇鸟”(https://chirper.ai/zh)。 简单来说,这是一个AI专属的微博,人类禁止发言,但是你可以创建一个叫“奇鸟”的机器人代理,让它在里边发帖,…

扫眼球换“世界币” ChatGPT之父“剥削穷人”?

ChatGPT火爆全球后, 山姆奥特曼(Sam Altman)创立的加密项目Worldcoin(世界币)重回大众视野。这个项目诞生于2年前。那时,埋头迭代GPT模型的OpenAI还未如此知名,该公司的CEO 山姆奥特曼也位列科技…

【计算机视觉】CLIP实战:Zero-Shot Prediction(含源代码)

一、代码实战 下面的代码使用 CLIP 执行零样本预测。 此示例从 CIFAR-100 数据集中获取图像,并预测数据集中 100 个文本标签中最可能的标签。 import os import clip import torch from torchvision.datasets import CIFAR100# Load the model device "cuda…

Android Parceable 使用和原理

简介 在 Android 开发中,我们经常需要在不同的组件之间传递数据,比如在 Activity 之间传递数据、在 Service 和 Activity 之间传递数据等。为了实现数据的传递,Android 提供了两种常用的方式,一种是使用 Intent,另一种…

opencv_c++学习(十)

一、图像尺寸变化 图像插值原理 在图像变换的过程中往往需要对像素进行相关的操作。如上图(左)所示,我们会遇到两个相邻的像素块需要映射到同样的位置中,或者两个相邻的位置的像素中间需要映射出一个位置的像素块。这时候我们就需…

JavaEE(系列7) -- 多线程(wait 和 notify 的使用)

首先对上一章节的指令重排序,在进行解释一下; 假设现在有连个线程 t1 和 t2 t1频繁(速度特别快)读取主内存,效率比较低,就被优化成直接读自己的工作内存。 t2修改了主内存的结果,由于t1没有读主内存,导致修改不能被识别到。 1.什么…

全网最全最细的【设计模式】总目录,收藏起来慢慢啃,看完不懂砍我

文章目录 一、设计模式七大原则1、单一职责原则2、接口隔离原则3、依赖倒置原则4、里氏替换原则5、开闭原则6、迪米特法则7、合成复用原则 二、UML类图三、设计模式1、创建型模式(1)单例模式(常用)(2)原型模…

mybatis-config.xml文件中的mappers标签

前言 在MyBatis中&#xff0c;< mapper >标签非常重要&#xff0c;因为它对应着我们存放sql语句的xml文件&#xff0c;在之前的使用中我们都是使用resource来指定路径&#xff0c;但其实除了resource可以指定路径的还有url和class但路径形式有所不同&#xff0c;下面来讨…

用「明道云+ChatGPT+Weaviate」挑战零代码1小时实现ChatPDF

ChatGPT流行起来之后&#xff0c;快速的出现了一批基于ChatGPT的工具应用&#xff0c;ChatPDF就是其中比较受欢迎的一款。它是一个可以让你与PDF文件进行对话的工具&#xff0c;既可以帮助你快速提取PDF文件中的信息&#xff0c;例如手册、论文、合同、书籍等&#xff1b;也可以…

【计算机视觉】最后显示的CIFAR-100数据集照片很模糊怎么解决?

文章目录 一、前言二、如何解决2.1 使用图像增强技术2.2 使用插值方法2.3 使用更高分辨率的图像数据集2.4 手动调整图像尺寸 三、总结 一、前言 如果从CIFAR-100数据集加载的图像显示模糊&#xff0c;可能有几个可能的原因&#xff1a; 分辨率较低&#xff1a;CIFAR-100数据集…

全力押注预制菜,叮咚买菜或错失即时零售红利

实际上&#xff0c;叮咚买菜相比于美团、京东更适合抢分即时零售的市场红利。 目前美团进入即时零售的逻辑是&#xff0c;拥有几百万骑手的履约软硬件可以复用&#xff0c;同时从外卖场景延伸到其他消费场景比较丝滑&#xff0c;从平台几千万用户的温饱满足&#xff0c;延展到多…

计算机网络实验(ensp)-实验10:三层交换机实现VLAN间路由

目录 实验报告&#xff1a; 实验操作 1.建立网络拓扑图并开启设备 2.配置主机 1.打开PC机 配置IP地址和子网掩码 2.配置完成后点击“应用”退出 3.重复步骤1和2配置每台PC 3.配置交换机VLAN 1.点开交换机 2.输入命名&#xff1a;sys 从用户视图切换到系统视图…

网络工程师精选习题详解(一)

请点击↑关注、收藏&#xff0c;本博客免费为你获取精彩知识分享&#xff01;有惊喜哟&#xff01;&#xff01; 1.在IPv4地址192.168.2.0/24中&#xff0c;表示主机的二进制位数是&#xff08; &#xff09;位。 A.8 B.16 C.24 D.32 答案&#xff1a;A /24示网络…