无涯教程-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;

   /** 在创建服务时调用。 */
   @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服务。

以下是修改后的主要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时调用。 */
   @Override
   public 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
   @Override
   public IBinder onBind(Intent intent) {
      return null;
   }
	
   @Override
   public int onStartCommand(Intent intent, int flags, int startId) {
      //让它继续运行直到它停止。
      Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
      return START_STICKY;
   }

   @Override
   public 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">

   <application
      android: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">
   
   <TextView
      android: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" />
      
   <TextView
      android: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" />

   <ImageButton
      android: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" />

   <Button
      android: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" />

   <Button
      android: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

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

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

相关文章

[Linux]进程程序替换

[Linux]进程程序替换 文章目录 [Linux]进程程序替换进程程序替换的意义见一见进程程序替换进程程序替换的原理进程程序替换中的写时拷贝介绍进程程序替换接口 进程程序替换的意义 Linux系统下使用fork系统函数创建子进程后&#xff0c;子进程只能执行继承的部分父进程代码&…

常用的css样式

1&#xff1a;flex布局 .flex-between {display: flex;justify-content: space-between; }.flex-evenly {display: flex;justify-content: space-evenly; }.flex-end {display: flex;justify-content: flex-end; }.flex {display: flex; }.flex-center {display: flex;justify…

JavaScript(函数,作用域和闭包)

目录 一&#xff0c;什么是函数1.1&#xff0c;常用系统函数1.2&#xff0c;函数声明 1.3&#xff0c;函数表达式二&#xff0c;预解析2.1&#xff0c;函数自调用 2.2&#xff0c;回调函数三&#xff0c;变量的作用域3.1&#xff0c;隐式全局变量 四&#xff0c;作用域与块级作…

关于sd卡根目录在哪里

你说的对,一切都会过去,哪怕是回忆。 sd卡根目录在哪里 1、手机要有SD卡才会存在SD卡根目录。 2、打开文件管理并在此页面下点击所有文件。 3、点击SD卡选项进入的页面就是SD卡根目录。 4、SD存储卡是一种基于半导体快闪记忆器的新一代记忆设备&#xff0c;由于它体积小、数…

[Pandas] pandas.melt

melt是溶解 / 分解的意思&#xff0c;即拆分数据 melt()函数可以将一些列的内容进行合并&#xff0c;把宽表整合成长表 语法格式 pandas.melt(frame, id_varsNone, value_varsNone, var_nameNone, value_namevalue)参数说明 frame&#xff1a;要处理的数据集 id_vars&#…

如何五分钟设计制作自己的蛋糕店小程序

在现如今的互联网时代&#xff0c;小程序已成为企业推广和销售的重要利器。对于蛋糕店来说&#xff0c;搭建一个小程序可以为其带来更多的品牌曝光和销售渠道。下面&#xff0c;我们将以乔拓云平台为例&#xff0c;来教你如何从零开始搭建自己的蛋糕店小程序。 首先&#xff0c…

docker 安装 Nginx

1、下载 docker pull nginx:latest 2、本地创建管理目录 mkdir -p /var/docker/nginx/conf mkdir -p /var/docker/nginx/log mkdir -p /var/docker/nginx/html 3、将容器中的相应文件复制到管理目录中 /usr/docker/nginx docker run --name nginx -p 80:80 -d nginxdocke…

Golang数据结构和算法

Golang数据结构和算法 数据的逻辑结构和物理结构常见数据结构及其特点算法的时间复杂度和空间复杂度Golang冒泡排序Golang选择排序Golang插入排序Golang快速排序Golang归并排序Golang二分查找Golang sort包Golang链表Golang container/list标准库Golang栈stackGolang二叉搜索树…

Spring Security存在认证绕过漏洞 CVE-2021-22096

文章目录 0.前言1.参考文档2.基础介绍漏洞影响范围&#xff1a;官方说明&#xff1a;修复版本&#xff1a;漏洞利用步骤&#xff1a;修复方式&#xff1a; 3.解决方案 0.前言 背景&#xff1a;项目被扫到Spring Boot 的漏洞&#xff0c;严格的说应该是Spring Security 组件的漏…

小程序隐私保护授权处理方式之弹窗组件

欢迎点击关注-前端面试进阶指南&#xff1a;前端登顶之巅-最全面的前端知识点梳理总结 *分享一个使用比较久的&#x1fa9c; 小程序隐私保护授权弹窗组件 调用wx.getUserProfile进行授权时&#xff0c;返回错误信息&#xff1a;{errMsg: “getUserProfile:fail api scope is…

宿舍固定资产怎么管理

宿舍固定资产的管理需要做到以下几点&#xff1a; 固定资产购置&#xff1a;宿舍的固定资产包括设备、家具、厨房用品等&#xff0c;购置时需要注意质量和价格&#xff0c;并进行登记。 固定资产登记&#xff1a;将宿舍的固定资产名称、型号、规格、数量、单价、金额、…

详细说明OSPF常见的LSA

目录 1类LSA &#xff08;Router LSA&#xff09;介绍 总结&#xff1a;1类LSA 2类LSA &#xff08;Network LSA&#xff09;介绍 总结&#xff1a;2类LSA 3类LSA &#xff08;Summary LSA&#xff09;介绍 总结&#xff1a;3类LSA 5类LSA &#xff08;ase LSA&…

layUI 中 穿梭框无法获取值的细节问题

初始化的时候一定要指定id&#xff0c;不然就会出现无法调用 获得右侧数据和实例重载的方法

高忆管理:A股上市券商“中考”成绩放榜,最大黑马是它

A股上市券商2023年半年报发表8月30日晚正式收官。全体上看&#xff0c;43家券商中有10家营收超百亿元&#xff0c;多达30家完成了营收及净利润的双增。头部券商中&#xff0c;我国银河近年来运营成绩排名稳步提高&#xff1b;区域性券商中&#xff0c;天风证券成最大黑马&#…

经典文献阅读之--FastSAM(快速分割一切)

0. 简介 MetaAI提出的能够“分割一切”的视觉基础大模型SAM提供了很好的分割效果&#xff0c;为探索视觉大模型提供了一个新的方向。虽然SAM的效果很好&#xff0c;但由于SAM的backbone使用了ViT&#xff0c;导致推理时显存的占用较多&#xff0c;推理速度偏慢&#xff0c;对硬…

多图详解VSCode搭建Java开发环境

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

LeetCode--HOT100题(46)

目录 题目描述&#xff1a;114. 二叉树展开为链表&#xff08;中等&#xff09;题目接口解题思路代码 PS: 题目描述&#xff1a;114. 二叉树展开为链表&#xff08;中等&#xff09; 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链…

qt day 1

this->setWindowIcon(QIcon("D:\\zhuomian\\wodepeizhenshi.png"));//設置窗口的iconthis->setWindowTitle("鵬哥快聊");//更改名字this->setFixedSize(500,400);//設置尺寸QLabel *qlnew QLabel(this);//創建一個標簽ql->resize(QSize(500,20…

Stable Diffusion WebUI 整合包

现在网络上出现的各种整合包只是整合了运行 Stable Diffusion WebUI&#xff08;以下简称为 SD-WebUI&#xff09;必需的 Python 和 Git 环境&#xff0c;并且预置好模型&#xff0c;有些整合包还添加了一些常用的插件&#xff0c;其实际与手动进行本地部署并没有区别。 不过&a…

[linux实战] 华为云耀云服务器L实例 Java、node环境配置

系列文章目录 第一章 [linux实战] 华为云耀云服务器L实例 Java、node环境配置 文章目录 系列文章目录前言一、任务拆解二、修改密码三、配置安全规则四、远程登录并更新apt五、安装、配置JDK环境5.1、安装openjdk,选择8版本5.2、检查jdk配置 六、安装、配置git6.1、安装git6.2…