android 用service代码,Android之Service(示例代码)

Android之Service的生命周期和启动方式的特点比较:

Service是Android系统中的四大组件之一,它和Activity的级别差不多,但是只能在后台运行,并且可以和其他的组件进行交互。Service可以在很多场合的应用中使用,例如播放音乐的时候用户启动了其它的Activity这个时候程序要在后台继续播放,比如在后台记录地理位置信息的改变等等,总之服务是在后台运行的。

48b1b45285549186d5bc2b59bf55c053.png

服务是在后台运行的,可以理解为没有界面的Activity。

定义四大组件的方式都一样,在配置文件中进行注册。

3.  定义一个类继承Service类

一、start启动服务的特点:

服务通过startService方式开启,第一次点击按钮开启服务,会执行onCreate()和onStart()/onStartCommand()方法

如果第二次再开启点击按钮开启服务,服务之后会执行onStartCommand()方法

服务被开启后,会在设置页面里的应用程序中的正在运行里面找到这个服务

startService方式开启服务,服务就会在后台长期运行,直到用户手工停止或是调用stopService方法服务才会被销毁

jia.gif

jian.gif

1 public class MyService extendsService {2 public static final String tag = "start方式开启服务---";3

4 @Override5 public booleanonUnbind(Intent intent) {6 Log.e(tag, "onUnbind");7 return super.onUnbind(intent);8 }9 @Override10 //第一次创建时调用

11 public voidonCreate() {12 Log.e(tag, "onCreate");13 super.onCreate();14 }15

16 //启动服务时调用

17 @Override18 public int onStartCommand(Intent intent, int flags, intstartId) {19 Log.e(tag, "onStartCommand");20 return super.onStartCommand(intent, flags, startId);21 }22

23 //销毁服务时调用

24 @Override25 public voidonDestroy() {26 Log.e(tag, "onDestroy");27 super.onDestroy();28 }29 }

View Code

//第一次点击按钮开启服务的时候

10-23 15:09:57.487 29774-29774/com.example.lenovo.servicedemo E/start方式启动服务---﹕ onCreate

10-23 15:09:57.487 29774-29774/com.example.lenovo.servicedemo E/start方式启动服务---﹕ onStartCommand

//之后再点击开启按钮开启服务,只执行onStartCommand()

10-23 15:10:04.547 29774-29774/com.example.lenovo.servicedemo E/start方式启动服务---﹕ onStartCommand

//点击按钮stopService之后服务销毁 或者是在设置-> 应用程序 -> 正在运行 中手动把该服务停止的之后执行onDestory销毁服务

10-23 15:10:06.921 29774-29774/com.example.lenovo.servicedemo E/start方式启动服务---﹕ onDestroy

二、Bind绑定服务:

BindService是应用组件(客户端)通过调用bindService()方法能够绑定服务,然后Android系统会调用服务的onBind()回调方法,这个方法会返回一个跟服务端交互的IBinder对象。这个绑定是异步的,bindService()方法立即返回,并且不给客户端返回IBinder对象。要接收IBinder对象,客户端必须创建一个ServiceConnection类的实例,并且把这个实例传递给bindService()方法。ServiceConnection对象包含了一个系统调用的传递IBinder对象的回调方法。注意:只有Activity,Service和内容提供者(Content Provider)能够绑定服务,广播接收器不能绑定服务。

bind服务的特点:

当点击按钮第一次开启服务,会执行服务的onCreate()方法和onBind()方法

当第二次点击按钮再调用bindService,服务没有响应

当Activity销毁的时候服务也销毁,不求同时生,但求同时死

通过bind方式开启服务,服务不能再设置界面里找到

bindService不能多次解绑,多次解绑会报错

jia.gif

jian.gif

1 public class MyService extendsService {2 public static final String tag = "bind方式开启服务---";3

4 @Override5 //创建服务时调用

6 public voidonCreate() {7 Log.e(tag, "onCreate");8 super.onCreate();9 }10

11 //绑定服务的时候调用

12 @Override13 publicIBinder onBind(Intent intent) {14 return null;15 }16

17 @Override18 public booleanonUnbind(Intent intent) {19 Log.e(tag, "onUnbind");20 return super.onUnbind(intent);21 }22

23 //销毁服务时调用

24 @Override25 public voidonDestroy() {26 Log.e(tag, "onDestroy");27 super.onDestroy();28 }29

30 }

View Code

//第一次点击bind服务的按钮

10-23 15:35:02.301 18879-18879/com.example.lenovo.servicedemo E/bind方式开启服务---﹕ onCreate

10-23 15:35:02.301 18879-18879/com.example.lenovo.servicedemo E/bind方式开启服务---﹕ onBind

//第二次点击bind按钮没有响应

//点击unbind解绑服务,服务销毁

10-23 15:35:05.251 18879-18879/com.example.lenovo.servicedemo E/bind方式开启服务---﹕ onUnbind

10-23 15:35:05.251 18879-18879/com.example.lenovo.servicedemo E/bind方式开启服务---﹕ onDestroy

//再次点击解绑,即多次解绑服务报错

10-23 15:35:17.121 18879-18879/com.example.lenovo.servicedemo E/AndroidRuntime﹕ FATAL EXCEPTION: main

java.lang.IllegalArgumentException: Service not registered: [email protected]

为什么要引入bindService:目的是为了调用服务里面的方法

通过bindService方式调用服务方法的过程

定义一个服务,服务里面有一个方法需要Activity调用

//服务里面定义一个方法方法,之后需要在Activity里面调用

public voidserviceMethod(){

Toast.makeText(getApplicationContext(),"这是服务里面的方法", Toast.LENGTH_SHORT).show();

}

定义一个类对象MyBinder继承Binder

//定义一个类继承 IBinder接口的实现子类Binder类

class MyBinder extendsBinder { public voidcallServiceMethod(){ serviceMethod(); }}

在onBind()方法里面把我们定义的MyBinder类对象返回

//绑定服务的时候调用

@OverridepublicIBinder onBind(Intent intent) {return new MyBinder(); //返回一个MyBinder对象

}

在Activity的onCreate()方法里面调用bindService,目的是为了来获取我们的定义的MyBinder对象

class MyConn implementsServiceConnection{

@Overridepublic voidonServiceConnected(ComponentName name, IBinder service) {

binder=(MyService.MyBinder)service;//获取MyBinder对象}

@Overridepublic voidonServiceDisconnected(ComponentName name) {

}

}

拿到MyBinder对象后就可以间接的调用服务里面的方法

public voidonClickCallMethod(){

binder.callServiceMethod();

}

通过接口调用服务中的方法:接口可以隐藏代码内部的细节,让程序员暴露只想暴露的方法

定义一个接口Iservice,把想暴露的方法暴露在接口里面

我们定义的MyBinder对象实现我们定义的Iservice接口

在获取我们定义的MyBinder对象的方式改变了(接口类型)

jia.gif

jian.gif

interfaceIService {public voidcallServiceMethod2();

}

View Code

jia.gif

jian.gif

//服务里面定义一个方法方法,之后需要在Activity里面调用

public voidserviceMethod(){

Toast.makeText(getApplicationContext(),"这是服务里面的方法", Toast.LENGTH_SHORT).show();

}public voidserviceMethod2(){

Toast.makeText(getApplicationContext(),"这是服务里面想暴露的方法", Toast.LENGTH_SHORT).show();

}//定义一个类继承 IBinder接口的实现子类Binder类

class MyBinder extends Binder implementsIService{public voidcallServiceMethod(){

serviceMethod();

}

@Overridepublic voidcallServiceMethod2() {

serviceMethod2();

}

}

View Code

binder = (IService) service;

音乐播放器(需要混合方式开启服务):

需求:既想让服务在后台长期运行,又想调用服务里面的方法

bindService:不能长期运行,但是可以调用方法

startService:可以长期运行, 但是不可以调用方法

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值