四大组价之Service

1.Service是什么
(1)Service是一个应用程序组件
(2)Service没有图形化界面
(3)Service通常用来处理一些耗时较长操作(如:Mp3播放、下载)(耗时操作是在子线程中完成
(4)可以使用 Service更新ContentProvider,发送Intent以及启动系统的通知等等
服务存在的目的:保证程序界面退出后,子线程依然可以稳定运行,而不轻易被系统回收
                  作用:在后台服务中启动那些需要长久在后台运行的子线程
service不是一个单独的进程,不是一个线程;在主线程中执行;不可以出现长循环或者耗时操作


2.Service生命周期
(1)创建、启动、销毁
第一次启动:先new再创建然后onStartCommand;点停止服务销毁;再启动创建新的;
若不停止再启动只执行
onStartCommand;
服务在Activity退出后继续运行

(2)创建、启动、绑定、解绑、销毁
创建:两个属性Export(默认为false,表示该程序的服务是否可以提供给其他程序)、Enabled(是否可用)
a.启动服务:onCreate()——onStartCommand(),重复启动执行onStartCommand()
    同一时刻,同一服务只允许出现一个
用一个程序启动另一个程序的服务:
(1)将另一个程序发布
(2)将另一个程序服务中的Export属性改为true
(3)在另一个程序清单文件中service的Intent-filter添加action属性通过隐式跳转启动
intent = new Intent("chao.service");
//隐式意图(5.0之后)需要指定包名
intent.setPackage("com.example.chao.service");
this.startService(intent);
-----------------------------------------------------------------------------------------------
Intent intent = new Intent(this,MyService.class);
this.startService(intent);
b.停止服务:onDestroy()
Intent intent = new Intent(this,MyService.class);//隐式意图(5.0之后)需要指定包名
this.stopService(intent);
-----------------------------------------------------------------------------------------------
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//绑定成功后执行
System.out.println("MainActivity.onServiceConnected");
MyService.MyBinder myBinder = (MyService.MyBinder) service;
myBinder.getS().show();//获取对象
Toast.makeText(MainActivity.this, myBinder.getData(), Toast.LENGTH_SHORT).show();//获取数据
}

@Override
public void onServiceDisconnected(ComponentName name) {
//绑定不成功/断开时执行
System.out.println("MainActivity.onServiceDisconnected");
}
};
c.绑定服务(1)直接绑定onCreate()——onBind()——
onStartCommand()
(2)先启动onCreate()——onStartCommand()再绑定
onBind()——
onStartCommand()
Intent intent = new Intent(this,MyService.class);
this.bindService(intent,conn,BIND_AUTO_CREATE);
注意:绑定后马上解绑不会执行
onStartCommand()
d.解绑服务(1)直接绑定然后解绑onUnbind()——onDestroy()   
          (2)先启动,然后绑定,再解绑 
onUnbind()

 
解绑后再解绑会报错
Intent intent = new Intent(this,MyService.class);
this.unbindService(conn);
-------------------------------------------------------------
Activity中:
startService()启动服务 
stopService()终止服务  

程序退出还可以在后台运行

和Activity处于同一线程
在服务中不能出现耗时操作或者长循环必须写在子线程

如果有一个子线程在主线程退出后仍然希望继续运行,则可以在服务中启动 ,服务可以调用startForegroud()方法提高生存机率
------------------------------------------------------------------------
绑定服务:组件间通信和跨进程访问(AIDL)    
bindService()——绑定
unbindService()——解绑


flags==Context.BIND_AUTO_CREATE
1.绑定服务时,如果该服务没有创建,创建服务并绑定,解除绑定就销毁;
如果没有解绑,直接退出Activity则会有异常,并强行解除绑定,并销毁
--------------------------------------------------------------------------------------
2.绑定服务时,如果该服务已经创建,创建服务并绑定,解除绑定就解绑,不销毁
如果没有解绑,直接退出Activity则会有异常,并强行解除绑定,并不销毁
-------------------------------------------------------------------------------------
3.直接销毁,无法销毁,需要先解绑,再销毁

flags==0
1.直接绑定不执行onBind(),延迟到用户startService(),服务创建后
2.销毁服务前必须先解除绑定 
  直接stopService(),服务会自动解除绑定,进而销毁
  直接退出Activity则会有异常,并强行解除绑定,此时服务并未停止
 ------------------------------------------------------------------------

使用startService()启动服务 :程序退出希望有服务仍然在后台运行
使用绑定服务:1.程序退出希望有服务仍然在后台运行,并且实现组件间通信和跨进程访问(AIDL)    flags==0 
              2.Activity需要使用服务,但是Activity退出后就希望服务销毁 flags==Context.BIND_AUTO_CREATE
 ------------------------------------------------------------------------
IntentService
内部封装有子线程,并且为了提高效能还封装有一个线程池
受线程池控制,当开启多个服务后同时只有一个子线程运行,结束后将放回线程池缓存,其他子线程取出继续使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值