您的位置:首页 > 移动开发 > Android开发

Android四大组件-Service

2017-08-03 11:17 211 查看

Service

不需要直接和用户交互,被设计用于长时间的后台操作。需要在
Manifest
中进行注册。

不是一个子线程。和别的组件一样运行在
Main Thread
中,耗时操作需要另起新现成或者使用
IntentService
,否则会造成ANR错误。

不是一个单独的进程,除非特殊声明。

可以通过
startForeground()
方法指定前台服务,高优先级,不会被系统杀掉。

启动方式。

独立启动
Context.startService()
,和启动它的组件无关,有自己的生命周期,在后台一直运行直到运行完成或者别的组件关闭了它。

使用场景:

后台音乐播放

后台下载

常驻型服务

绑定启动
Context.bindService()
,和启动它的组件绑定,可以与绑定它的组件之间长时间交互。

使用场景:

前台音乐播放(UI更新)

数据计算,需要随组件启动和销毁,需要交互。

启动Service有两个额外的操作模式
4000
,设置方法为
onStartCommand():
的返回值:

START_STICKY
代表需要明确的启动和停止。

START_NOT_STICKY
or
START_REDELIVER_INTENT
代表没有明确的停止,会在后台一直运行。

绑定启动具体实现:

需要在service中定义
IBinder
的子类,用于组件与Service之间通信。(其实也就是类似一个回调接口,没有明确规定,可以写任何方法和属性)

在启动Service的组件中,定义
ServiceConnection
,用于得到IBinder实例,以及连接成功和断开连接的回调方法。

public class MService extends Service {

private Notification mNotification;

private class MyBinder extends Binder {

void start() {
Log.i("TAG", "startService");
}
}

private MyBinder mMyBinder = new MyBinder();

@Override
public void onCreate() {
super.onCreate();
mNotification = new Notification.Builder(this)
.setSmallIcon(R.mipmap.icon)
.build();
}

@Override
public IBinder onBind(Intent intent) {
return mMyBinder;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//前台服务 高优先级
startForeground(1, mNotification);
//返回值决定额外的操作模式
return START_STICKY;
}
}


特殊用法:需要和组件之间进行通信,但是又不希望在组件停止之后就停止运行。先通过
Context.startService()
启动service再调用
Context.bindService()
进行绑定。实现绑定独立运行的服务。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android