无涯教程-Android - Services

news2025/1/19 8:01:25
服务是在后台运行以执行长时间运行的操作而无需与用户交互的组件,并且即使应用程序被破坏,它也可以工作。服务实际上可以采取两种状态-
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

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

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

相关文章

vue数组对象中按某一字段排序

给下列数组字段中的month排序 第一步&#xff1a;methods中写一个方法如下&#xff1a; sortBy(attr, rev) {//第二个参数没有传递 默认升序排列if(rev undefined) {rev 1;} else {rev (rev) ? 1 : -1;}return function(a, b) {a a[attr];b b[attr];if(a < b) {retu…

概念解析 | 合成孔径雷达在海洋动力学研究中的应用

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:合成孔径雷达海洋动力研究。 揭秘海洋的心跳:合成孔径雷达与海洋动力学的交响乐 海洋,那个占据地球表面三分之二的神秘世界,它的运动和变化直接影响着全球气候系统,以及…

解决maven仓库无法自动下载程序包的问题

在调试idea项目报错&#xff1a;未解析的依赖项:de.fhpotsdam:unfolding:jar:0.9.6 问题描述解决方法总结 问题描述 在调试idea项目时报如上所示错误&#xff0c;并尝试了网上所说的更改maven仓库为阿里云仓库等方法&#xff0c;但是maven均无法自动下载unfolding程序包。 解…

企业重要数据怎么加密?企业数据加密软件哪个好?

企业的数据安全至关重要&#xff0c;关系到企业的健康发展&#xff0c;我们可以采用加密的方法来保护企业数据安全。那么&#xff0c;企业重要数据该怎么加密呢&#xff1f;企业数据加密软件哪个好&#xff1f;下面我们就来了解一下。 企业数据加密要求 企业数据加密的要求往…

YOLOv5模型压缩:综述

YOLOv5模型压缩:综述 AbstractIntroduction剪枝基于ln-范数修剪模型Feature map activationBatch normalization scaling factor (BNSF)First-order derivativeMutual informationGranularity of Pruning非结构化剪枝结构化剪枝基于通道的修剪基于滤波器的修剪基于核的剪枝关于…

AutoRunner自动化测试工具新版本智能识别算法之视觉识别

泽众AutoRunner&#xff08;简称AR&#xff09;是国内专业的支持C/S、B/S各种技术框架的、基于组件识别的自动化测试工具&#xff0c;实现7*24小时的自动化回归测试和功能测试&#xff0c;让测试更智能。 视觉识别是一种通过计算机技术对图像或视频进行分析和理解的方法。这种算…

checkstyle检查Java编程样式:final参数

checkstyle可以利用FinalParameters检查方法、构造器、catch和for-each块的参数是final的&#xff1a; https://checkstyle.sourceforge.io/checks/misc/finalparameters.html 背后的原理&#xff1a;程序执行期间修改参数的值会引起混乱&#xff0c;所以应该避免。 要配置使…

一道经典面试题:@Configuration 和 @Component 有何区别?

关于 Configuration 注解有一个特别经典的面试题&#xff1a; Configuration 和 Component 有什么区别&#xff1f; 无论小伙伴们之前是否背过相关的面试题&#xff0c;今天这篇文章学完之后相信大家对这个问题都会有更深一层的理解&#xff0c;废话不多少&#xff0c;咱们开…

地理空间数据的定义、收集和应用

简介 地理空间数据是指与地球表面特定位置相关的数据。它包含多种数据类型&#xff0c;包括地图、卫星图像和GIS&#xff08;地理信息系统&#xff09;数据。近年来&#xff0c;由于技术的进步以及对有关物理世界的准确和最新信息的需求不断增长&#xff0c;地理空间数据的…

9、监测数据采集物联网应用开发步骤(7)

监测数据采集物联网应用开发步骤(6) 串口(COM)通讯开发 本章节测试使用了 Configure Virtual Serial Port Driver虚拟串口工具和本人自写的串口调试工具&#xff0c;请自行baidu下载对应工具 在com.zxy.common.Com_Para.py中添加如下内容 #RS232串口通讯列表 串口号,波特率,…

恒运资本:股票佣金怎么算?

股票佣钱是指证券买卖中券商向出资者收取的手续费。股票买卖中&#xff0c;佣钱是不可避免的一项本钱&#xff0c;出资者需求清楚地了解佣钱的收费规范和怎么核算&#xff0c;以便更好地掌握出资本钱&#xff0c;做出更正确的出资决策。 佣钱收费规范 股票佣钱收费规范&#x…

来文心中国行!专家面对面解读大模型产业实践及AI场景突围

9月1日&#xff0c;文心中国行将走进武汉。政府、高校及企业AI专家将现场分享人工智能与大模型最新政策、趋势、人才培养方案及产业实践案例&#xff0c;深入解读如何抓住大模型时代新机遇&#xff0c;高效实现智能化转型升级弯道超车。 加快实现高水平科技自立自强&#xff0c…

融云获评「创业邦 · 最具创新价值出海服务商」

点击报名&#xff0c;9 月 21 日融云直播课 8 月 22 日 - 23 日&#xff0c;创业邦主办的“2023 DEMO WORLD 全球开放式创新大会暨企业出海未来大会”在上海举行&#xff0c;会上发布了“创业邦 2023 出海企业创新价值 100 强”&#xff0c;融云荣登榜单&#xff0c;获评“最具…

如何安装和使用TypeScript。

目录 安装nodenpm下载typescript使用TypeScript总结 TypeScript是一种流行的编程语言&#xff0c;它是JavaScript的超集&#xff0c;具有更多的扩展功能和类型安全性。在本文中&#xff0c;我们将介绍如何安装和使用TypeScript。 安装node 要安装TypeScript&#xff0c;您需要…

Linux 查看当前文件夹下的文件大小

1.直接查看: ll 或者 ls -la #查看文件大小&#xff0c;以kb为单位 ll#查看文件大小&#xff0c;包含隐藏的文件&#xff0c;以kb为单位 ls -la2.以 M 或者 G 为单位查看&#xff0c;根据文件实际大小进行合适的单位展示 du -sh *

第62步 深度学习图像识别:多分类建模(Pytorch)

基于WIN10的64位系统演示 一、写在前面 上期我们基于TensorFlow环境做了图像识别的多分类任务建模。 本期以健康组、肺结核组、COVID-19组、细菌性&#xff08;病毒性&#xff09;肺炎组为数据集&#xff0c;基于Pytorch环境&#xff0c;构建SqueezeNet多分类模型&#xff0…

蓝牙模块产品认证-国际市场准入准则之BQB认证认证基础知识

蓝牙模块产品认证-国际市场准入准则之BQB认证认证基础知识 前言 BQB认证介绍 Bluetooth SIG Bluetooth SIG 由八大无线通讯行业巨头成立的一家公司&#xff0c;专门负责蓝牙规格开发、 技术推广及资格认证工作,成立于1998年。 Bluetooth SIG拥有Bluetooth Trademarks 免费地授…

宇瞳转债上市价格预测

宇瞳转债 基本信息 转债名称&#xff1a;宇瞳转债&#xff0c;评级&#xff1a;A&#xff0c;发行规模&#xff1a;6.0亿元。 正股名称&#xff1a;宇瞳光学&#xff0c;今日收盘价&#xff1a;13.04元&#xff0c;转股价格&#xff1a;15.29元。 当前转股价值 转债面值 / 转股…

JavaScript this、闭包和箭头函数

this this是函数内部的特殊对象之一&#xff08;其他还有arguments、caller、new.target&#xff09;。 this的 指向 或 值 是不确定的&#xff0c;取决于函数的调用方式。 在JavaScript中&#xff0c;this的指向有以下几种情况&#xff1a; 作为对象的方法调用作为普通函数…

avalonia、WPF使用ScottPlot动态显示ECG心电图

文章目录 avalonia、WPF使用ScottPlot动态显示ECG心电图实现效果&#xff0c;动态效果懒得录视频了安装代码部分UpdateData方法就是用来更新心电图表的方法&#xff0c; 根据消息队列数据去更新是视图中的ScottPlot 图表 avalonia、WPF使用ScottPlot动态显示ECG心电图 avalonia…