Android入门之Service的使用详解

目录
  • 简介
  • 什么是Service
  • Service的生命周期
    • startService和bindService的区别
    • startService ()时Service的生命周期
    • bindService()时Service的生命周期
  • 例子
  • 全代码
    • 后端代码

简介

我们的Android在启动一些长事务时都会使用异步,很多初学者觉得这个异步就是一个异步线程+Handler而己。如果你这么想就错了。这一切其实靠的正是Android里的Service。

Service分成普通Service和IntentService两种。而启动又发为两对:

  • 第一对,startService/stopService;
  • 第二对,bindService/unbindService;

后面开始我们就逐步展开对Android Service的讲述,我尽量也以“保姆式教程”的方法来引领着大家循序渐进的入门,以求牢固掌握这些基础的东西。

下面我们就来讲Android中最最简单的Service使用。

什么是Service

Service和Thread的区别。其实他们两者并没有太大的关系,不过有很多朋友经常把这两个混淆了! Thread是线程,程序执行的最小单元,分配CPU的基本单位! 而Service则是Android提供一个允许长时间留驻后台的一个组件,最常见的 用法就是做轮询操作!或者想在后台做一些事情,比如后台下载更新! 记得别把这两个概念混淆。

所以通过上面的理论我们知道,service有两种启动方式:

  • startService/stopService
  • bindService/unBindservice

我们就说startService,这个start一下去,整个service的生命周期就变得非常非常有用了。

为什么这么说呢?

因为你要写一个service时,经常会遇到:何时给它赋初始值?何时处理?何时回调?何时结束?

这就是“生命周期”的重要性。

各位不要感到“枯燥”,就像spring boot的生命周期,当你的业务场景足够复杂时,这种生命周期中大部分点你是需要Override到的。如果有些朋友你觉得生命周期从来没什么用那说明你所在的项目已经足够简单到没什么工作经验、技术含量可言了,那么我奉劝你如果长时间在这么没有含量的项目内你要考虑自身是不是会栽在35、40这个梗上了,这是很危险的一个信号。

Service的生命周期

本着保姆式教程的精神,我们说经常会使用到的Service的生命周期。各位记得,startService和bindService的启动决定着它的生命周期也不相同。

startService和bindService的区别

服务不能自己运行。一旦Activity中调用了startService()方法启动Service后,Activity就不能直接控制Service了。这时就需要bindService()把Activity和Service联系起来,之后就能在Activity中指挥Service去工作了。
startService()和bindService()都能启动Service,它们的调用顺序也会对Service产生影响,具体影响我们看下去。

startService ()时Service的生命周期

通过startService(),Service会经历 onCreate() –> onStart() 启动Service。然后stopService()的时候直接onDestroy()。如果调用者直接退出而没有调用stopService(),那么Service会一直在后台运行。 注意在Service的一个生命周期之内只会调用一次onCreate()方法,stopService()之前若多次startService()则只会调用onStart()方法。

bindService()时Service的生命周期

如果打算采用bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onBind()方法。这个时候调用者和服务绑定在一起,调用者unbindService()退出了,系统就会先调用服务的onUnbind()方法,接着调用onDestroy()方法。多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。

如果bindService()之前Service已经在运行了,那么这是调用unbindService()只会onUnbind()而不会onDestory()。

以一个例子我们先来看start/stop一个service以下它的生命周期是如何经历的。

例子

我们的界面上就两个按钮,一个startService,一个stopService。

来看具体的代码

全代码

后端代码

service类-SimpleService类

package org.mk.android.demoandroidsimpleservice;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

public class SimpleService extends Service {
    private final String TAG = "SimpleService";

    public SimpleService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        Log.i(TAG, ">>>>>>onBind方法被调用");
        return null;
    }

    //Service被创建时调用
    @Override
    public void onCreate() {
        Log.i(TAG, ">>>>>>onCreate方法被调用");
        super.onCreate();
    }

    //Service被启动时调用
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i(TAG, ">>>>>>onStartCommand方法被调用");
        return super.onStartCommand(intent, flags, startId);
    }

    //Service被关闭之前回调
    @Override
    public void onDestroy() {
        Log.i(TAG, ">>>>>>onDestory方法被调用");
        super.onDestroy();
    }
}

运行主类

package org.mk.android.demoandroidsimpleservice;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
    private Button buttonStartSimpleService;
    private Button buttonStopSimpleService;
    private Intent intent = new Intent();
    private Context ctx;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         ctx = MainActivity.this;
        buttonStartSimpleService = (Button) findViewById(R.id.buttonStartSimpleService);
        buttonStopSimpleService = (Button) findViewById(R.id.buttonStopSimpleService);
        buttonStartSimpleService.setOnClickListener(new OnClickListener());
        buttonStopSimpleService.setOnClickListener(new OnClickListener());
    }

    class OnClickListener implements View.OnClickListener {
        @Override
        public void onClick(View view) {
            Intent eIntent;
            switch (view.getId()) {
                case R.id.buttonStartSimpleService:
                    intent=new Intent(ctx,SimpleService.class);
                    startService(intent);
                    break;
                case R.id.buttonStopSimpleService:
                    intent=new Intent(ctx,SimpleService.class);
                    stopService(intent);
                    break;
            }
        }
    }
}

为了运行Service你还需要在AndroidManifest.xml文件中注册这个Service

注意下文中的<service>块。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.DemoAndroidSimpleService"
        tools:targetApi="31">
        <service
            android:name=".SimpleService"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action
                    android:name="org.mk.android.demoandroidsimpleservice.SimpleService"/>
            </intent-filter>

        </service>

        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <meta-data
                android:name="android.app.lib_name"
                android:value="" />
        </activity>
    </application>

</manifest>

运行后的效果

这个运行后的效果恰恰说明了一个这样的效果:通过startService启动的Service的生命周期不会触碰到那些bindService才拥有的生命周期中。

到此这篇关于Android入门之Service的使用详解的文章就介绍到这了,更多相关Android Service内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android Service启动流程刨析

    强调一下阅读系统源码,起码要对进程间通信要了解,对binder机制非常非常清楚,binder就是指南针,要不然你会晕头转向:强行阅读,就容易睡着. Service启动先来一张图感受一下 这张图能够说明一个大致的流程,但是服务的启动肯定不是这么简单,但是我们先简单的总结一下,逐渐深入.服务的启动形式有两种,startService()和 binderService(),我们看startService()这一种.startService是ContextWrapper里面的方法. ContextWra

  • Android Service开发应用实例

    目录 Service 开发应用 BindService IntentService Service 开发应用 在后台长时间运行,没有界面UI, 在后台下载文件和获取用户GPS信息 Service: 分为 startService 和 BoundService: 只有Activity 调用startService才会通知服务启动, BoundService只Activity bindService 进行启动. Service中Export 和Enable两个属性, Export 应用组件能不能调用

  • Android O对后台Service限制详解

    目录 Service问题 什么是前台应用 前台Service和后台Service 后台Service限制 解决后台Service限制 Service问题 Service没有界面,运行于后台,它会消耗设备资源,并且可能会导致不好的用户体验,例如资源占用过多,导致设备运行不流畅.为了缓解这个问题,Android O版本(Android 8.0, API 26)对后台Service强加了一些限制.注意,只是对后台Service加了限制,前台Service不受影响. 什么是前台应用 在解释后台Servi

  • Android Service完整实现流程分析

    目录 前言 一.APP侧启动Service 1.1 前台和后台启动 1.2startServiceCommon 二.系统侧分发处理Service的启动逻辑 2.1 AMS接受启动service的通知 2.2realStartServiceLocked流程 三.系统侧通知APP启动Service 四.总结 前言 一开始的目标是解决各种各样的ANR问题的,我们知道,ANR总体上分有四种类型,这四种类型有三种是和四大组件相对应的,所以,如果想了解ANR发生的根因,对安卓四大组件的实现流程是必须要了解的

  • Android 中Context的使用方法详解

    Android 中Context的使用方法详解 概要: Context字面意思是上下文,位于framework package的android.content.Context中,其实该类为LONG型,类似Win32中的Handle句柄.很多方法需要通过 Context才能识别调用者的实例:比如说Toast的第一个参数就是Context,一般在Activity中我们直接用this代替,代表调用者的实例为Activity,而到了一个button的onClick(View view)等方法时,我们用t

  • Android Broadcast原理分析之registerReceiver详解

    目录 1. BroadcastReceiver概述 2. BroadcastReceiver分类 3. registerReceiver流程图 4. 源码解析 4.1 ContextImpl.registerReceiverInternal 4.2 LoadedApk.getReceiverDispatcher 4.3 ActivityManagerService.registerReceiver 5. 总结 1. BroadcastReceiver概述 广播作为四大组件之一,在平时开发过程中会

  • Android开发中amera2 Preview使用详解

    目录 前言 一.Camera2 Preview需要用到哪些模块 二.各个模块的功能和之间的关系 2.1 SurfaceTexture之SurfaceTextureListener 2.1.1 首先看关于SurfaceTexture的说明 2.1.2 SurfaceTextureListener的使用 2.2 CameraManager 2.2.1 CameraManager的作用 2.2.2 使用CameraManager打开Camera 2.3 CameraDevice之StateCallba

  • Spring入门到精通之注解开发详解

    目录 Spring原始注解 DI 依赖注入的注解实现方式 Spring新注解 @Configuration @ComponentScan @Import @PropertySource @value @Bean Spring整合Junit 原始Junit测试Spring的问题 上述问题解决思路 Spring集成Junit步骤 Spring集成Junit代码实现 Spring原始注解 Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,所以注解开发是一种趋势,注解代替xml配置文件可以

  • Spring入门到精通之Bean标签详解

    目录 Bean标签基本配置 Bean标签范围配置 Bean生命周期配置 Bean的依赖注入入门 Bean的依赖注入概念 Bean的依赖注入方式 Bean的依赖注入的数据类型 引入其他配置文件(分模块开发) Bean标签基本配置 用于配置对象交由Spring 来创建. 默认情况下它调用的是类中的无参构造函数,如果没有无参构造函数则不能创建成功. 基本属性: id:Bean实例在Spring容器中的唯一标识 class:Bean的全限定名称 Bean标签范围配置 scope:指对象的作用范围,取值如

  • Android RxJava异步数据处理库使用详解

    目录 观察者模式 操作符 创建Observable 转换Observable 过滤Observable 组合Observable 错误处理 Schedulers调度器-解决多线程问题 管理RxJava的生命周期 RxJava与Retrofit完成网络请求 观察者模式 四大要素:Observable(被观察者),Observer (观察者),subscribe (订阅),事件. 观察者订阅被观察者,一旦被观察者发出事件,观察者就可以接收到. 扩展的观察者模式 当事件完成时会回调onComplete

  • Android开发Activity的生命周期详解

    目录 前言 典型情况下的生命周期分析 前言 Android生命周期分为两部分: (1)典型情况下的生命周期. (2)异常情况下的生命周期. 典型情况下的生命周期分析 图1 Activity的生命周期图解 图2 Activity生命周期的金字塔图 (1)典型情况下的生命周期指在有用户参与的情况下,Activity所经过的生命周期的改变,正常情况下,Activity的常用生命周期有以下几种情况: onCreate():Activity启动后第一个被调用的函数,常用来进行Activity的初始化,如创

  • Android 广播大全 Intent Action 事件详解

    具体内容如下所示: Intent.ACTION_AIRPLANE_MODE_CHANGED; //关闭或打开飞行模式时的广播 Intent.ACTION_BATTERY_CHANGED; //充电状态,或者电池的电量发生变化 //电池的充电状态.电荷级别改变,不能通过组建声明接收这个广播,只有通过Context.registerReceiver()注册 Intent.ACTION_BATTERY_LOW; //表示电池电量低 Intent.ACTION_BATTERY_OKAY; //表示电池电

  • Android使用xml自定义图片实例详解

    Android使用xml自定义图片实例详解 实现效果图: 白色圆角图片 bg_round_rectangle_white.xml <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <!-

  • Android TextView Marquee的应用实例详解

    Android TextView Marquee的应用实例详解 亲测可能.直接上代码. Xml代码 <TextView android:id="@+id/toolbar_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" androi

随机推荐