Service

Service

  1. 定义:
    后台运行,不可见没有界面
    优先级高于activity
    一般service不会被系统干掉,就算被干掉了也会自启
    注意:
    运行在主线程,不能用它来做耗时的操作。可以在service中开辟一个线程来做耗时操作(handler,synctask)
  2. 分类(如图)
    本地服务和远程服务
    数据的操作都要通过定义IBinder接口来实现
    这里写图片描述

  3. startService和bindService两种启动方式的特点
    这里写图片描述

  4. service
    定义:后台运行,不可见,没有界面,优先级高于activity
    用途:播放音乐,记录地理信息位置的改变,监听某种动作
    注意:运行在主线程,不能用它来做耗时的请求或动作

  5. 这里写图片描述
  6. 服务的类型
    这里写图片描述

  7. Start启动

start方式的启动时:第一次创建Service需要调用onCreate(),而后调用onStartCommand(),不管调用了多少次的onStartCOmmand(),停止的时候只调用一次onDestroy();
启动Service,遇到组件的启动,我们一定不能少了Intent,所以我们看见还是采用Intent进行启动的。
开启一个服务的步骤:
- 新建一个类,继承Service
- 在AndroidManifest.xml中注册Service
- 在Activity中调用startService()或者bindService()来启动服务 (一般我们使用后者,因为前者不能获取Service对象)。

注意:
- 就算启动服务的Activity退出了,Service只要没有被停止,它依然可以运行。
- 由于Service和Activity类似,属于Android四大组件之一,所以我们需要在AndroidManifest.xml中进行注册。我们的组件都需要在AndroidManifest.xml中进行注册。
- 由于通过start方式启动的Service,我们无法得到Service对象,所以我们一般是采用bind方式来启动Service,这样我们的主程序就可以获得Service对象了。
- 服务先新建一个类继承service并重新回调方法和抽象方法。
启动服务,作为组件媒介intent是不可少的

Intent intent1=new Intent(Mainactivity.this,MyStartService.class);
startService(intent1);//启动服务
  1. Bind启动
    BindService
    通过bindService()得到的Service是和启动源(Activity)绑定在一起的,在Activity退出的时候需要调用unbindService()进行解绑定(停止)。
    调用bindService()时会调用到目标Service的onBind()函数,通过IBinder接口实例,返回一个ServiceConnection对象给启动源。然后启动源可以通过ServiceConnection对象得到启动的Service对象
    使用方法:
    (1)重写onBind()方法
public IBinder onBind(Intent intent) {
return new MyBinder();
}

(2)MyBinder是继承自Binder类的,而Binder类实际上实现了IBinder接口

public class MyBinder extends Binder{
public MyBindService getService(){
return MyBindService.this; //返回这个Service的实例
}
}

(3)在启动源的Activity中创建一个ServiceConnection实例

ServiceConnection conn = new ServiceConnection() {
//当启动源跟service的连接意外丢失的时候会调用
//比如service崩溃了,或被强行杀死了
public void onServiceDisconnected(ComponentName name) {
}
//当启动源跟service成功连接之后会调用这个方法
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
MyBindService myService = ((MyBinder)service).getService();
}
};

(4)bindService()中指定ServiceConnection conn参数

bindService(intent2, conn, Service.BIND_AUTO_CREATE);

9.StartService和BindService
- StartService启动后启动源和Service没有关系,BindService调用bindService()启动service后启动源和Service相关,在退出activity之前必须要调用unbindService()取消绑定。
- startService()和bindService()可以混合使用。如果我们想要Activity退出了,但是服务还在继续,那么我们就要选用startService的方式来启动服务,如果我们想要在Activity中获取Service对象,那么我们需要用bindService方法结合ServiceConnection来启动Service,但是这种方法,由于将Service和Activity绑定在了一起,所以当Activity退出的时候,我们需要unbindService()来停掉Service,否则就会报错。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值