Android学习笔记九:Service

    一:Service是什么

    Service,服务。一般用于提供需要在后台长期运行的服务(如复杂计算、下载等等耗时任务),其特点是长生命周期的、没有用户界面、在后台运行的。

    

    二:Service的生命周期方法

    在定义Service子类时,需要重写以下方法:

内部自动调用的方法作用
onCreat()创建服务
onStartCommand()开始服务
onDestroy()销毁服务
onBind()绑定服务
onUnbind()解绑服务

    在其他地方,创建服务、启动服务、停止服务时,需要调用以下方法:

startService()启动服务
stopService()关闭服务
bindService()绑定服务
unbindService()解绑服务

    1:调用startService()后,自动调用service内部方法:onCreate()、onStartCommand()

    2:调用stopService()后,自动调用内部方法:onDestory()

    3:调用bindService()后,自动调用内部方法:onCreate()、onBind()

    4:调用unbindService()后,自动调用内部方法:onCreate()、onBind()、onDestory()

    

    三:常见的生命周期调用

    1:startService()启动服务、stopService()停止服务:只能开启和关闭Service,无法操作Service;若启动服务后,无手动调用stopService(),则程序退出后服务仍然存在

    2:bindService()绑定服务、unbindService()解绑服务:Service随着调用者销毁而停止。

    3:使用startService()启动服务,再使用bindService()绑定服务——使用unbindService()解绑服务,再使用stopService()停止服务:要先解绑,才能停止服务。

 

    四:Service的类型

【图片来自:http://www.jianshu.com/p/d963c55c3ab9

 

    五:不同类型Service的使用

    1:本地服务:与某一个程序相关,在程序的代码中启动、停止服务

步骤1:新建子类继承Service类,重写父类的onCreate()、onStartCommand()、onDestroy()和onBind()方法
步骤2:在AndroidManifest.xml里注册该Service
步骤3:在activity的代码中,创建用于启动Service的Intent对象
步骤4:调用startService(intent)启动Service、调用stopService(intent)停止服务

    Androidmanifest里Service的常见属性说明

属性说明备注
android:nameService的类名 
android:labelService的名字若不设置,默认为Service类名
android:iconService的图标 
android:permission申明此Service的权限有提供了该权限的应用才能控制或连接此服务
android:process表示该服务是否在另一个进程中运行(远程服务)不设置默认为本地服务;remote则设置成远程服务
android:enabled系统默认启动true:Service 将会默认被系统启动;不设置则默认为false
android:exported该服务是否能够被其他应用程序所控制或连接不设置默认此项为 false

 

    2:远程服务:与程序无关,系统级别的服务

    远程Service与调用者不在同一个进程里(即远程Service是运行在另外一个进程)

    一般用在多个应用程序共享同一个后台服务(远程服务)的情况。

    我们把Service称为服务器端、需要与Service通信的进程称为客户端。

  • 以下是两个进程角色的具体使用步骤:
    服务器端(Service)
    步骤1:新建定义AIDL文件,并声明该服务需要向客户端提供的接口
    步骤2:在Service子类中实现AIDL中定义的接口方法,并定义生命周期的方法(onCreat、onBind()、blabla)
    步骤3:在AndroidMainfest.xml中注册服务 & 声明为远程服务

    客户端(Client)
    步骤1:拷贝服务端的AIDL文件到目录下
    步骤2:使用Stub.asInterface接口获取服务器的Binder,根据需要调用服务提供的接口方法
    步骤3:通过Intent指定服务端的服务名称和所在包,绑定远程Service

AIDL:Android Interface Definition Language,即Android接口定义语言;用于让某个Service与多个应用程序组件之间进行跨进程通信,从而可以实现多个应用程序共享同一个Service的功能。

     具体使用参见:http://www.jianshu.com/p/34326751b2c6

 

    3:前台服务

    前台服务是指在手机的下拉通知栏保持显示一个通知。

    前台Service优先级较高,不会由于系统内存不足而被回收;后台Service优先级较低,当系统出现内存不足情况时,很有可能会被回收。

    前台服务不是一种特殊的服务类型,它只是在一般的后台服务的基础上添加了几个属性,使其具有了前台显示的界面而已。任何服务都可以通过以下方法成为前台服务:

    在原有的Service类对onCreate()方法中添加以下内容:

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

        //添加下列代码将后台Service变成前台Service
        //1:创建"点击通知"后要跳转至哪个页面的Intent对象
        Intent notificationIntent = new Intent(this,MainActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(this,0,notificationIntent,0);

        //2:新建通知栏的Builer对象
        Notification.Builder builer = new Notification.Builder(this);
        //3:用通知栏的builder对象进行通知图标、标题、内容、点击事件的设置
        builer.setContentTitle("前台服务通知的标题");//设置通知的标题
        builer.setContentText("前台服务通知的内容");//设置通知的内容
        builer.setSmallIcon(R.mipmap.ic_launcher);//设置通知的图标
        builer.setContentIntent(pendingIntent);//设置点击通知后的操作
        //4:使用builder创建出一个通知
        Notification notification = builer.getNotification();//用Builder对象生成notification
       //5:让通知在下拉通知栏显示
        startForeground(1, notification);
    }

    

    4:可通信服务

    上面创建的服务,除了启动、停止之外,并不能与activity进行交互,即:activity不能访问服务中的其他方法。

    要通过activity操作service的话,需要用到绑定服务。

    1)新建子类继承Service类,并在其中新建一个内部类继承自Binder类,在binder子类中定义Activity需要调用的方法。

        然后在Service子类中创建binder子类实例,并在onBind()方法中return 这个实例。

    2)在Activity中,创建ServiceConnection实例,并且重写其onServiceConnected()方法,把连接传递过来的binder强制类型转换为第一步中创建的binder。

    3)在Activity中,创建一个binder实例,然后通过bindService()方法,把ServiceConnection实例作为参数传递进去,从而把创建的binder赋值为绑定成功后得到的service中的binder实例。

    4)最后,通过binder调用其内部定义好的方法,从而实现Activity与Service的通信。

    

    各种服务类型的使用场景:

    【图片来自:http://www.jianshu.com/p/e04c4239b07e】

 

     六:Service与Thread的区别

     

     一般来说,会将Service和Thread联合着用,即在Service中再创建一个子线程(工作线程)去处理耗时操作逻辑。

    

转载于:https://www.cnblogs.com/ygj0930/p/7518791.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值