zoukankan      html  css  js  c++  java
  • Android Service(服务)

    一、简介

      Service是Android四大组件之一,也可以称为后台服务。Service是一个可以长期在后台执行而不用提供用户界面的应用组件。服务可由其它应用组件启动,即使切换到其它应用组件,服务依然会在后台继续运行。

      此外,组件可以绑定到服务,并与之进行交互,甚至是执行进程间通信(IPC)。

      例如,服务可以处理网络通信,播放音乐电影,执行文件I/O,这一切的操作都是在后台进行的。

      服务分为两类,第一类是本地服务(Local Service);第二类为远程服务(Remote Service)。 

    二、服务注册

      服务(Service)与Broadcast Receiver(广播)一样在Androidmanifest.xml(清单文件)中注册。

     1 <!-- 服务注册 -->
     2 <!-- exported设置允许其它应用启动此服务 -->
     3 <!-- permission是此服务的权限,只能由符合权限的应用的调用此服务 -->
     4 <service
     5     android:name=".CustomService"
     6     android:exported="false"
     7     android:permission="com.example.SERVICE.TESTDEMO">
     8     <intent-filter>
     9         <action android:name="testdemo"/>
    10     </intent-filter>
    11 </service>

       

      (1). exported是设置是否允许其它应用启动此服务,默认值是通过是否有intent-filter来设置,有intent-filter为true,反之为false。当为true时,允许其它应用启动此服务。

      (2).android:permission是设置服务权限,只有申请了此权限的应用的才能启动并调用此服务。

    三、服务启动

      1. 通过startService启动服务

        startService(...) -> onCreate(...) -> onStartCommand(...) ,服务只能停止一次,通过stopService(...)或者stopSelf()方法停止服务后,会调用onDestory()方法,销毁服务。如果,服务没有被停止、销毁,再次使用startService(...)启动服务时,会从onStartCommand(...)方法开始执行。

      停止服务

        1. stopService(...):通过另一个组件调用此方法停止服务。

        2. stopSelf():通过此方法在服务自身停止本服务。

      服务生命周期

      1. 在调用startService(...)方法启动服务后,服务内部调用方法流程:

        (1). onCreate()方法;

        (2). onStartCommand(Intent intent, int flag, int startId)方法;(允许组件启动服务)

      2. 在调用stopService(...) 方法停止服务后,服务内部调用方法流程:

        (1). onDestroy()方法;// 销毁服务

      PS:在下次再次启动服务(调用startService(...)方法)时,会再次从onCreate(...)方法开始。当然,在服务已经启动了,再次使用startService(...)方法启动服务,就不会从onCreate(...)方法开始执行,因为,服务已经启动了,只会从onStartCommand(...)方法开始。

      特点:使用startService(...)开启服务,服务就和调用者(开启者)没有任何关系了,即使调用者(开启者)退出了或者挂掉了,服务依然在后台运行,不会随着调用者(开启者)退出或者挂掉而结束,只能通过stopService(...)或者服务内部方法stopSelf()方法停止,服务停止立即销毁(就是会调用onDestroy()方法)。并且这种服务开启方式是不能调用服务内部方法的。(startService(...)开启的服务也可以称为远程服务)

      2. 通过bindService启动服务

      通过其它组件与服务进行绑定的方式开启服务。

      使用bindService(...)启动服务是不会调用onStartCommand(...)方法的。

      可以通过unBindService(...)方法停止服务。

      生命周期:

      onCreate() --> onBind() --> unOnBind() --> onDestory()

      特点:使用bindService()方法启动服务,绑定服务后,组件的生命周期结束,服务的生命周期也随之结束,也就是调用者(开启者),退出或者挂掉后,服务也随之结束。通过bindService(...)方法启动绑定的服务,调用者(开启者)可以调用服务的内部方法。(通过bindService(...)开启的服务,也可以称为本地服务)

    四、服务(Service)生命周期内所有方法(包括两种开启方式)

     1 public class CustomService extends Service
     2 {
     3     private final static String TAG = "CustomService";
     4 
     5     @Nullable
     6     @Override
     7     public IBinder onBind(Intent intent)
     8     {
     9         Log.d(TAG, "onBind");
    10         return null;
    11     }
    12 
    13     @Override
    14     public void onRebind(Intent intent)
    15     {
    16         super.onRebind(intent);
    17         Log.d(TAG, "onRebind");
    18     }
    19 
    20     @Override
    21     public boolean onUnbind(Intent intent)
    22     {
    23         Log.d(TAG, "onUnbind");
    24         return super.onUnbind(intent);
    25     }
    26 
    27     @Override
    28     public void onCreate()
    29     {
    30         super.onCreate();
    31         Log.d(TAG, "onCreate");
    32     }
    33 
    34     @Override
    35     public int onStartCommand(Intent intent, int flag, int startId)
    36     {
    37         Log.d(TAG, "onStartCommand");
    38         return super.onStartCommand(intent, flag, startId);
    39     }
    40 
    41     @Override
    42     public void onDestroy()
    43     {
    44         super.onDestroy();
    45         Log.d(TAG, "onDestroy");
    46     }
    47 }
  • 相关阅读:
    应用程序初次运行数据库配置小程序(Java版)
    (转) 移动站适配rel=alternate PC页和H5页适配标注
    (转)微信收货地址开发分享
    (转)PHP EOF(heredoc)的使用方法
    http-equiv是什么意思(转载)
    jQuery Ajax 实例 ($.ajax、$.post、$.get)
    JSON转string、JSON转Object
    php使用curl来获取远程图片
    include和require的区别
    (转)PHP获取随机数
  • 原文地址:https://www.cnblogs.com/naray/p/6490843.html
Copyright © 2011-2022 走看看