Android服务Service教程

目录
  • 1、服务用途
  • 2、继承Service
  • 3、启动和停止服务
  • 4、自动启动服务

前言:

Android的服务是开发Android应用程序的重要组成部分。不同于活动Activity,服务是在后台运行,服务没有接口,生命周期也与活动Activity非常不同。通过使用服务我们可以实现一些后台操作,比如想从远程服务器加载一个网页等。服务能帮助我们在Android中实现多任务。

  我们已经知道,安卓的活动可以启动,停止,当系统资源太低时可以销毁,服务被设计为实现具有更长执行时间的任务。安卓的服务可以从活动Activity中启动,也可以从一个广播接收器和其他服务中启动。

  必须注意,使用服务并不需要自动创建新的线程,所以如果在服务中我们实现一个简单的逻辑,这不需要很长的时间去处理,我们其实不需要将它运行在单独的线程。但是如果我们要实现复杂的逻辑,用很长一段时间去处理,我们就必须采取创建一个新线程去执行,否则在主线程上运行服务,可能会导致ANR问题。

1、服务用途

服务适合两种用途:

  • 实现多任务
  • 激活 Inter-Process-Communication (IPC) 流程间通讯

第一种情况的典型的例子是: 需要从远程服务器下载数据,在这种情况下,我们可以让应用同时与用户进行交互,并在后台开始完成工作,而用户可以继续使用应用程序,当服务完成后发送一个消息给用户。

在第二种情况下,我们可以通过服务“共享”一些常用的功能,使不同的应用程序可以重用这些功能。例如,假设我们有一个发送电子邮件的服务,我们希望在几个应用程序共享此服务,这样不必重写相同的代码。在这种情况下,我们可以使用IPC使服务公开,这个服务向“远程”暴露接口,被其他应用程序调用。

下面是一个简单的服务,继承Service

2、继承Service

public class TestService extends Service {

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }

}

服务是有生命周期的,可以实现其中一些回调方法:

public class TestService extends Service {

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }

}

  只有服务被创建时,方法onCreate才会被唯一的调用一次。如果该服务已在运行这个方法将不会被调用。我们也不是直接调用它,操作系统OS调用这个方法。

  OnStartCommand是最重要的方法,因为它被调用的时候,我们需要启动服务。在这个方法中,我们需要向我们运行的服务传递意图,这样我们就可以与服务交换一些信息。在这个方法中实现的逻辑可以直接在这个方法中被执行,如果执行很花费时间,我们就需要创建一个线程。正如你可以看到这个方法要求我们返回一个整数作为结果。此整数表示服务如何由操作系统来处理。

  • START_STICKY :使用这个返回值,如果OS杀死我们的服务,它会重新创建它,但是发往该服务的意图Intent不会再被传递,这种方式下服务总是在运行。
  • START_NOT_STICKY: 如果OS杀死服务,就不会再创建,直到客户端显式激活onStart 命令
  •  START_REDELIVER_INTENT: 它类似 START_STICKY,意图也会被再传递给该服务。

OnDestroy是在服务销毁时由操作系统调用。

服务需要在Manifest.xml 中配置:

<service android:name=".TestService" android:enabled="true"/>

3、启动和停止服务

  正如我们所知道服务必须首先被启动,并在完成它的任务后最终停止。我们可以从活动Activity启动它,我们可以使用Intent传递给服务一些信息。假设我们有两个按钮,一个开始和一个停止服务.

btnStart.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        Intent i = new Intent(MainActivity.this, TestService.class);
        i.putExtra("name", "SurvivingwithAndroid");
        MainActivity.this.startService(i);
    }
});

btnStop.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        Intent i = new Intent(MainActivity.this, TestService.class);
        MainActivity.this.stopService(i);
    }
});

运行效果如下:

IntentService

  正如我们前面提到的服务运行在主线程,所以我们在本服务执行一些逻辑要非常小心。必须考虑到,如果这个逻辑是一个阻塞操作,或者需要较长的时间来完成,会导致一个ANR问题发生。在这种情况下,将逻辑转移到一个单独的线程,这意味着我们必须在onStartCommand方法创建线程并运行它。还有另一类称为IntentService的衍生服务,可以简化这些操作。当我们不需要同时处理多个请求,这个类是有用的。这个类创建一个工作线程来处理不同的请求,

功能如下:

  • 创建一个分离线程来处理请求
  • 创建一个请求队列然后传递一个Intent消息
  • 创建onStartCommand的缺省实现
  • 当所有请求被处理后停止服务
public class TestIntentService extends IntentService {

    public TestIntentService() {
        super("TestIntentService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {

    }

}

onHandleIntent里面我们实现了逻辑,而无需关心这作业需要半天或更长,因为这种方法在一个单独的线程中运行。

4、自动启动服务

  如果我们想在智能手机开机时启动它,我们先创建一个广播接收器,监听到这个事件,然后启动该服务。

public class BootBroadcast extends BroadcastReceiver {

    @Override
    public void onReceive(Context ctx, Intent intent) {
        ctx.startService(new Intent(ctx, TestService.class));

    }

}

 Manifest.xml中配置:

<receiver android:name=".BootBroadcast">
    <intent-filter >
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>

到此这篇关于Android服务Service教程的文章就介绍到这了,更多相关Android服务Service内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android7.0指纹服务FingerprintService实例介绍

    指纹服务是Android系统中一个较为简单的服务(相比于AMS,WMS等),也比较独立,功能上包括几点 指纹的录入与删除 指纹认证 指纹的安全策略(错误次数判定) 和其他的system service 一样,应用程序通过FingerprintManager实现与FingerprintService的通信,除了上面所说的功能之外,FingerprintManager提供了一些别的的接口,重要的接口都会要求系统级别的权限,并且也不是公开的api(指纹的录入,删除,重命名,重置错误计数等) /** *

  • Android服务应用ClockService实现闹钟功能

    ClockService安卓服务应用实现闹钟,供大家参考,具体内容如下 创建ClockActivity,可输入一个时间(使用Time文本框),再创建一个ClockService在用于计时,到时间后,以在Activity中发出通知(在下方的TextView中显示"时间到"). 注意:这里涉及到了Service操作Activity 实验步骤:使用BoundService方式开启服务 1.首先定义布局文件,这里不做过多赘述 3. 定义一个Service服务类,然后在类里面定义一个MyBind

  • 浅谈Android Service服务的高级技巧

    1 前台服务 因为服务的优先级较低,所以当系统内存不足时,可能会回收正在后台运行的服务.如果若要避免服务被回收,可以使用前台服务. 前台服务会一直有一个图标在系统的状态栏中显示,下拉状态栏可以看到更加详细的信息,类似于消息通知效果. public class FirstService extends Service { private static final String TAG = "FirstService"; @Override public void onCreate() {

  • 说说在Android如何使用服务(Service)的方法

    Android 服务(Service)适合执行那些不需要和用户交互而且还要求长期运行的任务. 服务的运行不依赖于任何用户界面,即使 APP 被切换到后台,或者打开了另外一个 APP,服务仍然能够保持正常运行. 但是当某个 APP 进程被杀掉时,那么这个 APP 所创建的所有服务也就停止咯. 另外,服务本身并不会自动开启线程,服务代码默认是运行在主线程中的.所以如果需要执行的业务逻辑耗时长,那么为了防止主线程被阻塞,我们必须在服务内部创建子线程来执行这些业务逻辑. 1 定义服务 在 Android

  • Android实现Service在前台运行服务

    前言 在做手机音乐播放器的时候,让我非常苦恼的一件事就是手机有清理内存的软件,比如百度,360等等,一点击清理音乐就停止播放了,去后台查看发现Service已经被停止并重新启动了,这显然不是我想要的,我希望音乐能够在后台播放,并且自己能控制什么时候退出,不想让系统给我清理了,就像酷狗一直在通知栏显示那样,于是我就知道了在前台运行的服务. 实现 我们先看一下结果图: 这是运行在通知栏的界面,这样就是让服务在前台运行,再清理的时候就不会导致服务被关闭了. 好了,我们直接上代码,因为要开启服务,所以我

  • Android8.0适配前台定位服务service的示例代码

    从Android 8.0开始系统为实现降低功耗,对后台应用获取用户位置信息频率进行了限制,每小时只允许更新几次位置信息,详细信息请参考官方说明.按照官方指引,如果要提高位置更新频率,需要后台应用提供一个前台服务通知告知. 所以原来的单单使用locationManager获得当前位置在后台情况下无法使用了.于是打算使用一个前台服务,当app在后台时也能获得当前位置. 查了几篇博客说前台服务需要在service的onStartCommand方法中调用startForeground(int, Noti

  • Android 系统服务TelecomService启动过程原理分析

    由于一直负责的是Android Telephony部分的开发工作,对于通信过程的上层部分Telecom服务以及UI都没有认真研究过.最近恰好碰到一个通话方面的问题,涉及到了Telecom部分,因而就花时间仔细研究了下相关的代码.这里做一个简单的总结.这篇文章,主要以下两个部分的内容: 什么是Telecom服务?其作用是什么? Telecom模块的启动与初始化过程: 接下来一篇文章,主要以实际通话过程为例,分析下telephony收到来电后如何将电话信息发送到Telecom模块以及Telecom是

  • Android实现在ServiceManager中加入自定义服务的方法详解

    本文实例讲述了Android实现在ServiceManager中加入自定义服务的方法.分享给大家供大家参考,具体如下: 当我们要使用android的系统服务时,一般都是使用Context.getSystemService方法.例如我们要获取AudioManager,我们可以: AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 获取的服务,其实是在ServiceManager中注册的Binder服务,

  • Android服务Service教程

    目录 1.服务用途 2.继承Service 3.启动和停止服务 4.自动启动服务 前言: Android的服务是开发Android应用程序的重要组成部分.不同于活动Activity,服务是在后台运行,服务没有接口,生命周期也与活动Activity非常不同.通过使用服务我们可以实现一些后台操作,比如想从远程服务器加载一个网页等.服务能帮助我们在Android中实现多任务. 我们已经知道,安卓的活动可以启动,停止,当系统资源太低时可以销毁,服务被设计为实现具有更长执行时间的任务.安卓的服务可以从活动

  • android开发教程之开机启动服务service示例

    个例子实现的功能是:1,安装程序后看的一个Activity程序界面,里面有个按钮,点击按钮就会启动一个Service服务,此时在设置程序管理里面会看的有个Activity和一个Service服务运行2,如果手机关机重启,会触发你的程序里面的Service服务,当然,手机启动后是看不到你的程序界面.好比手机里面自带的闹钟功能,手机重启看不到闹钟设置界面只是启动服务,时间到了,闹钟就好响铃提醒. 程序代码是: 首先要有一个用于开机启动的Activity,给你们的按钮设置OnClickListener

  • AngularJS入门教程之服务(Service)

    AngularJS 服务(Service) AngularJS 中你可以创建自己的服务,或使用内建服务. 什么是服务? 在 AngularJS 中,服务是一个函数或对象,可在你的 AngularJS 应用中使用. AngularJS 内建了30 多个服务. 有个 $location 服务,它可以返回当前页面的 URL 地址. 实例 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> &

  • Android中Service(后台服务)详解

    1.概念: (1).Service可以说是一个在后台运行的Activity.它不是一个单独的进程,它只需要应用告诉它要在后台做什么就可以了. (2).它要是实现和用户的交互的话需要通过通知栏或者是通过发送广播,UI去接收显示. (3).它的应用十分广泛,尤其是在框架层,应用更多的是对系统服务的调用. 2.作用: (1).它用于处理一些不干扰用户使用的后台操作.如下载,网络获取.播放音乐,他可以通过INTENT来开启,同时也可以绑定到宿主对象(调用者例如ACTIVITY上)来使用. (2).如果说

  • Android中实现开机自动启动服务(service)实例

    最近在将 HevSocks5Client 移植到 Android 上了,在经过增加 signalfd 和 timerfd 相关的系统调用支持后,就可以直接使用 NDK 编译出 executable 了.直接的 native exectuable 在 Android 系统总还是不太方便用哦.还是做成一个 apk 吧,暂定只写一个 service 并开机自动启用,无 activity 的. Java 中调用 native 程序我选择使用 JNI 方式,直接在 JNI_OnLoad 方法中调用 pth

  • Android中Service服务详解(一)

    本文详细分析了Android中Service服务.分享给大家供大家参考,具体如下: 一.Service简介 Service是Android中实现程序后台运行的解决方案,适用于去执行那些不需要和用户交互而且还要求长期运行的任务.Service是android 系统中的四大组件之一(Activity.Service.BroadcastReceiver.ContentProvider),它跟Activity的级别差不多,但不能自己运行只能后台运行,并且可以和其他组件进行交互. Service并不是运行

  • 详解Android中Service服务的基础知识及编写方法

    首先,让我们确认下什么是service? service就是android系统中的服务,它有这么几个特点:它无法与用户直接进行交互.它必须由用户或者其他程序显式的启动.它的优先级比较高,它比处于前台的应用优先级低,但是比后台的其他应用优先级高,这就决定了当系统因为缺少内存而销毁某些没被利用的资源时,它被销毁的概率很小哦. 那么,什么时候,我们需要使用service呢?         我们知道,service是运行在后台的应用,对于用户来说失去了被关注的焦点.这就跟我们打开了音乐播放之后,便想去

  • Android中Service服务详解(二)

    本文详细分析了Android中Service服务.分享给大家供大家参考,具体如下: 在前面文章<Android中Service服务详解(一)>中,我们介绍了服务的启动和停止,是调用Context的startService和stopService方法.还有另外一种启动方式和停止方式,即绑定服务和解绑服务,这种方式使服务与启动服务的活动之间的关系更为紧密,可以在活动中告诉服务去做什么事情. 为了说明这种情况,做如下工作: 1.修改Service服务类MyService package com.ex

  • Android提高Service优先级的方法分析

    本文实例讲述了Android提高Service优先级的方法.分享给大家供大家参考,具体如下: Android 系统对于内存管理有自己的一套方法,为了保障系统有序稳定的运信,系统内部会自动分配,控制程序的内存使用.当系统觉得当前的资源非常有限的时候,为了保 证一些优先级高的程序能运行,就会杀掉一些他认为不重要的程序或者服务来释放内存.这样就能保证真正对用户有用的程序仍然再运行.如果你的 Service 碰上了这种情况,多半会先被杀掉.但如果你增加 Service 的优先级就能让他多留一会,我们可以

  • AngularJS服务service用法总结

    本文实例总结了AngularJS服务service用法.分享给大家供大家参考,具体如下: 引言 最近在项目中用到了关于AngularJS中的服务相关的知识,在起初学习这个东西的时候就了解到这个东西在项目中是经常被用到的,在angular中也是比较重要的一块,所以今天小编就总结一些关于service的知识. 认识Service 关于service我们一点都不陌生,不论实在c#中还是Java中我们经常会遇到service的概念,其实service的作用就是对外提供某种特定的功能,也就是我们经常说的"

随机推荐