Android经验分享Android项目经验分享首页投稿(暂停使用,暂停投稿)

Android Service学习(一)

2017-06-26  本文已影响92人  心若冰清_

前言


在整理Android蓝牙开发的过程中,会用到后台播放音乐的功能,需要与service进行交互,因此对service作一个笔记,对以前未注意的细节作一次梳理。


一、service的基础知识


1.1 service的两种类型

1.2 service的线程

service运行于管理它的进程的主线程,即在APP内,service的线程id和主线程的id一致。可以使用log进行验证分别在MainActivity中的onCreate()中,以及自定义的MyService中的onCreate()中,执行Log

Log.e("TAG","主线程id = " + Thread.currentThread().getId());
Log.e(TAG,"Service的线程id = " + Thread.currentThread().getId());

得到的结果如下

06-21 03:49:28.491 5057-5057/com.example.slide_table E/MyService:主线程id=1

06-21 03:49:28.495 5057-5057/com.example.slide_table E/MyService:Service的线程id=1

如果需要在service中运行比较耗时的操作,可以在service中创建新的线程来完成这些操作,以减少应用可能出现的ANR。


二、service中的重要方法


在实际研发的过程中,几乎都需要对service中的回调方法进行重写以期达到需求。经常需要重写的几种回调方法如:

当用户的系统内存不足时,必须回收系统资源来显示用户关注的activity时,才会停止service的运行。但是若此service为用户关注的activity所绑定的,则会减少回收的几率。如果服务被声明运行于前台,则基本不会停止。
如果service处于started状态,虽然会一直运行于后台,但是为了降低这种系统资源被回收的风险,需要对重启该service进行设计。当系统资源变得充足可用时,可重新启动该service,但是依赖于onStartCommand()的返回值。


三、service配置的几种属性


当在开发中声明某service时,必须在AndroidManifest.xml中对该服务进行配置。常用的几种属性为:


四、service的创建


通过继承创建service,Android提供以下两个类供开发继承:

4.1 Service

所有service的基类,当继承该类时,创建新的线程来处理需要执行的动作,避免出现ANR的情况。特点:

4.2 IntentService

该类为service的子类,每次都会使用一个工作线程来处理全部的启动请求。在APP中如果不是处理多个请求,最优的创建服务继承该类。开发人员只需要重写onHandleIntent()方法,来执行接收到的intent,从而完成后台服务。
特点:

注意:IntentService并没有提供构造函数,因此在继承IntentService后,需提供一个无参的构造方法。

public class MyIntentService extend IntentService{
    public MyIntentService(){
        super("MyIntentService ");
    }
}

五、service中的重要函数


onStartCommand()
在组件请求启动service后,会发送Intent,服务开启后,调用onStartCommand()方法执行该任务。

但是该方法必须返回一个整数,用于描述系统停止service后如何继续服务,此点仅在继承自service的服务中使用,因为继承IntentService已经默认实现。返回值:


六、service的启动与停止


6.1 service的启动

service的启动分为传递intent启动以及绑定启动,本章主要讲述通过传递intent来启动service。
通过activity或者其他应用组件来传递Intent来启动service,系统调用service的onStartCommand()并且将该Intent传递给它。

Intent service_intent = new Intent(MAcitivty.class, MyService.class);
startService(service_intent);
/**
    如果activity与fragment交互,需要使用
    getActivity().startService(service_intent);
*/

如果service没有提供绑定,则startService()发送的intent是APP的组件与该service唯一的通信模式。如果需要服务返回结果,则启动该服务的客户端能为广播创建一个PendingIntent,并且通过启动service的Intent进行传送。服务便可以通过广播来发送结果。

6.2 service的停止

通常情况下,APP在服务完成任务后,应该停止服务,避免造成系统资源的浪费和电池的消耗。系统不会自动的停止或者销毁服务,除非系统资源紧缺需要系统资源的回收,而且还可以在onStartCommand()返回后,服务继续运行。service本身可以调用stopSelf()停止自身,或者其他的应用组件调用stopService()来停止该service。

注意,如果该service同时处理多个onStartCommand()的调用请求,在处理一个请求后,首先需要判断另一个新的请求的ID是否与上一个请求的ID是否相同,即在使用stopSelf(int)方法停止该服务时,同时将新的启动service的请求ID传递给停止请求进行匹配,如果下一个新的请求的ID与上一个请求的ID不相同,则不会停止本次的服务,这样就会避免多次启动服务的请求,而多次调用onStartCommand()。

上一篇下一篇

猜你喜欢

热点阅读