无涯教程-Android - Services

服务是在后台运行以执行长时间运行的操作而无需与用户交互的组件,并且即使应用程序被破坏,它也可以工作。服务实际上可以采取两种状态-
Sr.No.State & Remark
1

Started

当应用程序组件(如Activity)通过调用 startService()启动服务,启动后即使启动该服务的组件被破坏,服务也可以无限期在后台运行。

2

Bound

当应用程序组件通过调用 bindService()绑定到服务时,该服务被绑定,绑定的服务提供了一个Client-Server接口,该接口允许组件与该服务进行交互,发送请求,获取输出,甚至跨进程间通信(IPC)进行交互。

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

Android Service lifecycle

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

Sr.No.Callback & 描述
1

onStartCommand()

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

2

onBind()

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

3

onUnbind()

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

4

onRebind()

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

5

onCreate()

首次使用 onStartCommand()或 onBind()创建服务时,系统会调用此方法。

6

onDestroy()

当不再使用该服务并将其销毁时,系统将调用此方法。

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

package com.learnfk;import android.app.Service;
import android.os.IBinder;
import android.content.Intent;
import android.os.Bundle;public class HelloService extends Service {/** 指示如果服务被终止时的行为 */int mStartMode;/** 绑定客户端的接口 */IBinder mBinder;     /** 指示是否应使用 onRebind */boolean mAllowRebind;/** 在创建服务时调用。 */@Overridepublic void onCreate() {}/** 由于调用 startService(),服务正在启动 */@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {return mStartMode;}/** 客户端使用 bindService() 绑定到服务 */@Overridepublic IBinder onBind(Intent intent) {return mBinder;}/** 当所有客户端都与 unbindService() 解除绑定时调用 */@Overridepublic boolean onUnbind(Intent intent) {return mAllowRebind;}/** 当客户端使用 bindService() 绑定到服务时调用 */@Overridepublic void onRebind(Intent intent) {}/** 当服务不再使用并被销毁时调用 */@Overridepublic void onDestroy() {}
}

本示例将引导您完成一些简单的步骤,以展示如何创建自己的Android服务。

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

package com.example.learnfk7.myapplication;import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.View;public class MainActivity extends Activity {String msg = "Android : ";/** 在第一次创建Activity时调用。 */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Log.d(msg, "The onCreate() event");}public void startService(View view) {startService(new Intent(getBaseContext(), MyService.class));}//停止服务的方法public void stopService(View view) {stopService(new Intent(getBaseContext(), MyService.class));}
}

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

package com.example.learnfk7.myapplication;import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.widget.Toast;/*** Created by LearnFk7 on 8/23/2021.
*/public class MyService extends Service {@Nullable@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {//让它继续运行直到它停止。Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();return START_STICKY;}@Overridepublic void onDestroy() {super.onDestroy();Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show();}
}

以下将修改AndroidManifest.xml文件的内容,在这里无涯教程添加了<service ... />标签以包括无涯教程的服务-

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.learnfk7.myapplication"><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><service android:name=".MyService" /></application></manifest>

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

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"android:layout_height="match_parent" 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"><TextViewandroid:id="@+id/textView1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Example of services"android:layout_alignParentTop="true"android:layout_centerHorizontal="true"android:textSize="30dp" /><TextViewandroid:id="@+id/textView2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Learnfk point "android:textColor="#ff87ff09"android:textSize="30dp"android:layout_above="@+id/imageButton"android:layout_centerHorizontal="true"android:layout_marginBottom="40dp" /><ImageButtonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/imageButton"android:src="@drawable/abc"android:layout_centerVertical="true"android:layout_centerHorizontal="true" /><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/button2"android:text="Start Services"android:onClick="startService"android:layout_below="@+id/imageButton"android:layout_centerHorizontal="true" /><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Stop Services"android:id="@+id/button"android:onClick="stopService"android:layout_below="@+id/button2"android:layout_alignLeft="@+id/button2"android:layout_alignStart="@+id/button2"android:layout_alignRight="@+id/button2"android:layout_alignEnd="@+id/button2" /></RelativeLayout>

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

Android Service Demo

现在开始您的服务,让无涯教程单击开始服务按钮,这将启动服务,并且根据无涯教程在 onStartCommand()方法中的编程,消息服务已开始将出现在模拟器的底部,如下所示:

Android Service Start

要停止服务,可以单击"停止服务"按钮。

Android - Services - 无涯教程网无涯教程网提供服务是在后台运行以执行长时间运行的操作而无需与用户交互的组件,并且即使应用程序被...https://www.learnfk.com/android/android-services.html

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于微服务、Java、Springcloud、Vue、MySQL开发的智慧工地管理系统源码

智慧工地聚焦施工现场岗位一线&#xff0c;围绕“人、机、料、法、环”五大要素&#xff0c;数字化工地平台与现场多个子系统的互联实现了工地业务间的互联互通和协同共享。数字化工地管理平台能够盘活工地各大项目之间孤立的信息系统&#xff0c;实现数据的统一接入、处理与维…

品牌合作与影响力:海外网红营销的双赢模式!

随着全球互联网的飞速发展&#xff0c;社交媒体已成为人们生活中不可或缺的一部分。在这个数字化时代&#xff0c;网红已经不再只是一个名词&#xff0c;更是一种现象&#xff0c;影响着人们的购买决策、生活方式和文化趋势。在这一背景下&#xff0c;品牌合作与影响力相互交融…

LeetCode第16~20题解

CONTENTS LeetCode 16. 最接近的三数之和&#xff08;中等&#xff09;LeetCode 17. 电话号码的字母组合&#xff08;中等&#xff09;LeetCode 18. 四数之和&#xff08;中等&#xff09; LeetCode 16. 最接近的三数之和&#xff08;中等&#xff09; 【题目描述】 给你一个…

【golang】15、cobra cli 命令行库

Cobra 是 golang 最流行的命令行库&#xff0c;文档见 一、脚手架 mkdir pt && cd pt && go mod init cobra-cli init # 在项目下运行即可生成脚手架# tree . ├── LICENSE ├── cmd # 生成了cmd目录 │ └── root.go # 生成了root.go, 其中定义了ro…

NeRFMeshing - 精确提取NeRF中的3D网格

准确的 3D 场景和对象重建对于机器人、摄影测量和 AR/VR 等各种应用至关重要。 NeRF 在合成新颖视图方面取得了成功&#xff0c;但在准确表示底层几何方面存在不足。 推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 我们已经看到了最新的进展&#xff0c;例如 NVIDIA 的 …

RecyclerView面试问答

RecycleView 和 ListView对比: 使用方法上 ListView:继承重写 BaseAdapter,自定义 ViewHolder 与 converView优化。 RecyclerView: 继承重写 RecyclerView.Adapter 与 RecyclerView.ViewHolder。设置 LayoutManager 来展示不同的布局样式 ViewHolder的编写规范化,ListVie…

25-非父子通信 - event bus 事件总线

作用:非父子组件之间&#xff0c;进行简易消息传递。(复杂场景 -> Vuex) 1.创建一个都能访问到的事件总线(空 Vue 实例) -> utils/EventBus.js import Vue from vue const Bus new Vue() export default Bus 2. A组件(接收方),监听 Bus实例 的事件(支持多个组件同时监…

stackoverflow问题

Stack Overflow requires external JavaScript from another domain, which is blocked or failed to load. stackoverflow引用了谷歌中被屏ajax.googleapis.com的jquery.min.js文件。“https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js” 方案1.打开网站…

css元素定位:通过元素的标签或者元素的id、class属性定位

前言 大部分人在使用selenium定位元素时&#xff0c;用的是xpath元素定位方式&#xff0c;因为xpath元素定位方式基本能解决定位的需求。xpath元素定位方式更直观&#xff0c;更好理解一些。 css元素定位方式往往被忽略掉了&#xff0c;其实css元素定位方式也有它的价值&…

DEA创建maven项目,项目结构无src目录和pom.xml文件内容

File > Settings > Build,Execution,Deployment > Build Tools > Maven > Runnner,界面中VM Options 输入框中填入-DarchetypeCataloginternal&#xff0c;重启IDEA&#xff0c;打开即会有src目录和pom.xml文件。 -DarchetypeCataloginternal -DarchetypeCatal…

Docker harbor私有仓库部署与管理

一、搭建本地私有仓库二、Harbor私有仓库部署与管理1、Harbor概述2、Harbor的特性3、Harbor的核心组件3.1 Proxy3.2 Registry3.3 Core services3.3.1 UI&#xff08;harbor-ui&#xff09;3.3.2 WebHook3.3.3 Token 服务 3.4 Database&#xff08;harbor-db&#xff09;3.5 Log…

C语言这么没用??

今日话题&#xff0c;C语言真的这么不堪吗&#xff1f;最近我兄弟向我倾诉&#xff0c;他在几天前受到老板的责骂&#xff0c;原因是他只懂C语言编程&#xff0c;无法达到老板的期望。其实不是C语言不堪&#xff0c;而是嵌入式领域复杂性多种多样&#xff0c;需要灵活的解决方案…