Android (安卓) 服务(Services)

2026-01-16 16:45:204918

上一节: Android (安卓) Activity

上一节

下一节: Android (安卓) 广播接收器(Broadcast Receivers)

下一节

Android (安卓) 服务(Services)

Android 服务(Services)

一个服务(Service)是在后台运行的组件,无需与用户交互即可执行长时间运行的操作,即使应用程序被销毁,它也能工作。服务基本上可以有两种状态

状态

描述

Started

当应用程序组件(如activity)通过调用startService()启动服务时,服务将被启动。一旦启动,服务可以无限期地在后台运行,即使启动它的组件已被销毁。

Bound

当应用程序组件通过调用bindService()绑定到服务时,服务被绑定。绑定服务提供客户机-服务器接口,允许组件与服务交互、发送请求、获取结果,甚至通过进程间通信(IPC)跨进程进行交互。

服务具有生命周期回调方法,您可以实施这些方法来监视服务状态的变化,并且可以在适当的阶段执行工作。左图显示了使用startService()创建服务时的生命周期,右图显示了使用bindService()创建服务时的生命周期:(图片由android.com提供)

要创建服务,请创建一个Java类,该类扩展了Service基类或其现有子类之一。该服务基类定义的各种回调方法和最重要的如下。您不需要实现所有的回调方法。但是,重要的是,您必须了解每一个,并实施那些确保您的应用程序符合用户期望的行为。

回调方法

描述

onStartCommand()

当另一个组件(例如activity)通过调用startService()请求启动服务时,系统将调用此方法。如果实现此方法,则有责任通过调用stopSelf()或stopService()方法在服务完成后停止服务。

onBind()

当另一个组件希望通过调用bindService()与服务绑定时,系统将调用此方法。如果实现此方法,则必须通过返回IBinder对象,提供客户端用于与服务进行通信的接口。您必须始终实现此方法,但是如果您不想允许绑定,则应返回null。

onUnbind()

当所有客户端都已与服务发布的特定接口断开连接时,系统将调用此方法。

onRebind()

在新的客户端已连接到该服务之后,系统已在先前通知所有客户端已断开其onUnbind(Intent)的连接之后,调用此方法。

onCreate()

首次使用onStartCommand()或onBind()创建服务时,系统会调用此方法。进行一次设置需要此呼叫。

onDestroy()

当不再使用该服务并将其销毁时,系统将调用此方法。您的服务应实现此功能,以清理所有资源,例如线程,注册的侦听器,接收器等。

实例

以下框架服务演示了每种生命周期方法

package com.jc2182.helloworld;

import android.app.Service;

import android.content.Intent;

import android.os.IBinder;

public class HelloService extends Service {

/** 指示服务被终止时的行为 */

int mStartMode;

/** 绑定客户端的接口 */

IBinder mBinder;

/** 指示是否应使用onRebind */

boolean mAllowRebind;

/** 在创建服务时调用。 */

@Override

public void onCreate() {

}

/** 由于调用startService(),服务正在启动 */

@Override

public int onStartCommand(Intent intent, int flags, int startId) {

return mStartMode;

}

/** 客户端使用bindService()绑定到服务 */

@Override

public IBinder onBind(Intent intent) {

return mBinder;

}

/** 当所有客户端都与unbindService()解除绑定时调用*/

@Override

public boolean onUnbind(Intent intent) {

return mAllowRebind;

}

/** 当客户端通过bindService()绑定到服务时调用*/

@Override

public void onRebind(Intent intent) {

}

/** 当服务不再使用并被销毁时调用 */

@Override

public void onDestroy() {

}

}

本示例将引导您完成一些简单的步骤,以展示如何创建自己的Android服务。请按照以下步骤修改我们在Hello World示例一章中创建的Android应用程序-

您将使用Android Studio IDE创建一个Android应用程序,并将其命名为HelloWrold,位于 com.jc2182.helloworld 程序包下。

修改主activity文件MainActivity.java以添加startService()和stopService()方法。

在com.jc2182.helloworld包下创建一个新的Java文件MyService.java。该文件将实现与Android服务相关的方法。

使用标签在AndroidManifest.xml文件中定义您的服务。一个应用程序可以具有一个或多个服务,而没有任何限制。

修改res/layout/activity_main.xml文件的默认内容,以在线性布局中两个按钮。

无需更改res/values/strings.xml文件中的任何常量。Android Studio处理字符串值

运行该应用程序以启动Android模拟器并验证在该应用程序中所做更改的结果。

以下是修改后的主要活动文件MainActivity.java的内容。该文件可以包括每个基本生命周期方法。我们添加了startService()和stopService()方法来启动和停止服务。

package com.jc2182.helloworld;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

public class MainActivity extends AppCompatActivity {

String msg = "Android : ";

/** 在第一次创建activity时调用。 */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Log.d(msg, "onCreate() 事件被调用。");

}

public void startService(View view) {

startService(new Intent(getBaseContext(), HelloService.class));

}

// 停止服务

public void stopService(View view) {

stopService(new Intent(getBaseContext(), HelloService.class));

}

}

以下是HellowService.java的内容。该文件可以根据要求实现与服务相关联的一种或多种方法。现在,我们将仅实现两种方法onStartCommand()和onDestroy() -

package com.jc2182.helloworld;

import android.app.Service;

import android.content.Intent;

import android.os.IBinder;

import android.widget.Toast;

import androidx.annotation.Nullable;

public class HelloService extends Service {

@Nullable

@Override

public IBinder onBind(Intent intent) {

return null;

}

@Override

public int onStartCommand(Intent intent, int flags, int startId) {

// Let it continue running until it is stopped.

Toast.makeText(this, "服务启动。", Toast.LENGTH_LONG).show();

return START_STICKY;

}

@Override

public void onDestroy() {

super.onDestroy();

Toast.makeText(this, "服务销毁。", Toast.LENGTH_LONG).show();

}

}

以下将修改AndroidManifest.xml文件的内容。在这里我们添加了标签以包括我们的服务-

package="com.jc2182.helloworld">

android:allowBackup="true"

android:icon="@mipmap/ic_launcher"

android:label="@string/app_name"

android:roundIcon="@mipmap/ic_launcher_round"

android:supportsRtl="true"

android:theme="@style/AppTheme">

android:name=".HelloService"

android:enabled="true"

android:exported="true">

以下是res/layout/activity_main.xml文件的内容,其中包括两个按钮-

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

xmlns:app="http://schemas.android.com/apk/res-auto"

android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin"

android:paddingBottom="@dimen/activity_vertical_margin"

tools:context=".MainActivity">

android:id="@+id/textView1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentTop="true"

android:layout_centerHorizontal="true"

android:layout_marginTop="43dp"

android:text="services 例子"

android:textSize="30dp"

tools:ignore="MissingConstraints"

tools:layout_editor_absoluteX="109dp"

tools:layout_editor_absoluteY="48dp" />

android:id="@+id/textView2"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_above="@+id/imageButton"

android:layout_centerHorizontal="true"

android:layout_marginBottom="96dp"

android:text="菜鸟教程 "

android:textColor="#ff87ff09"

android:textSize="30dp"

tools:ignore="MissingConstraints"

tools:layout_editor_absoluteX="162dp"

tools:layout_editor_absoluteY="121dp" />

android:id="@+id/imageButton"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerHorizontal="true"

android:layout_centerVertical="true"

android:src="@drawable/logo"

app:layout_constraintEnd_toEndOf="parent"

app:layout_constraintStart_toStartOf="parent"

tools:layout_editor_absoluteY="196dp"

tools:ignore="MissingConstraints" />

android:id="@+id/button2"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_below="@+id/imageButton"

android:layout_centerHorizontal="true"

android:layout_marginTop="16dp"

android:onClick="startService"

android:text="启动服务"

app:layout_constraintEnd_toEndOf="parent"

app:layout_constraintStart_toStartOf="parent"

tools:ignore="MissingConstraints"

tools:layout_editor_absoluteY="397dp" />

android:id="@+id/button"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_below="@+id/button2"

android:layout_alignStart="@+id/button2"

android:layout_alignLeft="@+id/button2"

android:layout_alignEnd="@+id/button2"

android:layout_alignRight="@+id/button2"

android:layout_centerHorizontal="true"

android:layout_marginStart="0dp"

android:layout_marginLeft="0dp"

android:layout_marginTop="47dp"

android:layout_marginEnd="0dp"

android:layout_marginRight="0dp"

android:onClick="stopService"

android:text="停止服务"

app:layout_constraintEnd_toEndOf="parent"

app:layout_constraintStart_toStartOf="parent"

tools:ignore="MissingConstraints"

tools:layout_editor_absoluteY="326dp" />

让我们尝试运行修改后的Hello World!我们刚刚修改的应用程序。我假设您在进行环境设置时已创建了AVD。要从Android Studio运行该应用,请打开您项目的活动文件之一,然后点击Android StudioRun图标工具栏中的“运行” 图标。Android Studio将应用程序安装在您的AVD上并启动它,如果设置和应用程序一切正常,它将显示在“模拟器”窗口下面-

现在启动服务,让我们单击“启动服务”按钮,这将启动服务,并且按照我们在onStartCommand()方法中的编程,一条消息“服务启动。”将出现在模拟器的底部,如下所示:

要停止服务,您可以单击停止服务按钮。出现如下图示:

上一节: Android (安卓) Activity

上一节

下一节: Android (安卓) 广播接收器(Broadcast Receivers)

下一节

查看笔记 分享笔记

笔记内容:

称呼:

Email:

站点:

分享笔记 重置

分类导航

前端

Ajax 教程

Angular 教程

Aurelia 教程

Bootstrap 教程

ChartJS 教程

CSS 教程

ES6 教程

FontAwesome 教程

HTML 教程

HTML 字符集 教程

HTML 游戏 教程

JavaScript 教程

jQuery 教程

Less 教程

React 教程

Sass 教程

Stylus 教程

TypeScript 教程

Unity 教程

Vue.js 教程

WebAssembly 教程

XAML 教程

颜色 教程

服务端

C# 教程

C++ 教程

COBOL 教程

C语言 教程

Fortran 教程

Go 教程

Groovy 教程

Java 教程

JSP 教程

JVM 教程

Kotlin 教程

Lisp 教程

Lua 教程

Node.js 教程

Pascal 教程

Perl 教程

PHP 教程

Python 教程

Python 3 教程

Ruby 教程

Rust 教程

Scala 教程

Spring 教程

Spring Boot 教程

Spring Cloud 教程

VB.Net 教程

移动端

Android 教程

IOS 教程

Objective-C 教程

React Native 教程

Swift 教程

小程序 教程

数据库

Access 教程

DB2 教程

Mariadb 教程

Memcached 教程

MongoDB 教程

MySQL 教程

Neo4j 教程

PL/SQL 教程

PostgreSQL 教程

Redis 教程

SQL 教程

SQL Server 教程

SQLite 教程

T-SQL 教程

数据格式

Jackson 教程

JSON 教程

SVG 教程

XML 教程

开发工具

ActiveMQ 教程

Ant 教程

Apache HttpClient 教程

Apache POI PPT 教程

AWS 教程

Docker 教程

ElasticSearch 教程

ExpressJS 教程

GIT 教程

GitLab 教程

Google Maps 教程

Gradle 教程

Java NIO 教程

JavaFX 教程

JavaMail 教程

JDBC 教程

jMeter 教程

JPA 教程

jsoup 教程

Junit 教程

KoaJS 教程

Kubernetes 教程

Log4j 教程

Logstash 教程

Lucene 教程

Makefile 教程

Maven 教程

RESTful 教程

Sed 教程

SEO 教程

Servlet 教程

SLF4J 教程

Socket.IO 教程

Struts 教程

SVN 教程

TestNG 教程

UML 教程

UNIX / LINUX 教程

WebSocket 教程

WPF 教程

xStream 教程

区块链 教程

数据处理

Flink 教程

Flume 教程

Hadoop 教程

Hbase 教程

Hive 教程

Kafka 教程

Kibana 教程

MapReduce 教程

MATLAB 教程

MyBatis 教程

Pig 教程

R语言 教程

Solr 教程

Spark 教程

Storm 教程

Zookeeper 教程

大数据分析 教程

数据仓库 教程

数据挖掘 教程

计算机基础

HTTP 教程

IPv4 教程

IPv6 教程

Ubantu 教程

WebServices 教程

嵌入式系统 教程

操作系统 教程

数据结构和算法 教程

汇编语言 教程

物联网 教程

电子电路基础 教程

编译器设计 教程

网站开发 教程

计算机 教程

计算机基础 教程

计算机网络 教程

设计模式 教程

AI

CNTK 教程

Keras 教程

PyTorch 教程

TensorFlow 教程

人工智能 教程

机器学习 教程

Python 技术

Django 教程

Flask 教程

NumPy 教程

Pandas 教程

Pillow 教程

PyGTK 教程

PyQt5 教程

PySpark 教程

pytest 教程

Python -数据科学 教程

Python MySQL 教程

Python 取证 教程

Python 数据结构 教程

Python 文本处理 教程

Python 网络编程 教程

Python 网页抓取 教程

Python 设计模式 教程

RxPY 教程

SciPy 教程

Seaborn 教程

SymPy 教程

wxPython 教程

框架

Laravel 教程

Web 图标Icon 教程

Web2py 教程

WebGL 教程

WebRTC 教程

WordPress 教程

Yii 教程

Zend Framework 教程

SAP

Crystal Reports 教程