Service用于后台操作耗时任务。
就比如我们咋A界面下载东西时,总不能让客户一直处于A界面。当用户单击跳转界面时,这个时候就用到了我们的Service,让下载进入到后台。
service分为两种启动模式:
一丶startService();
二丶bindService();
startService();开启服务方式,它只有App被杀死时才会被销毁。或者手动调用 stopService();方法结束service。
startService();生命周期流程:
oncreate(只执行一次)——onStartCommand(如果服务已存在,每次点击开启服务都会被执行但并未开启一个服务,服务不存在则开启服务。)——service运行.....——(service手动调用停止或者App杀死)ondestroy(只执行一次)。
startService(Intent)开启时需要参数Intent
ServiceTest是我的那个Service类解绑时调用stopService(intent);
bindService();开启服务模式,当前Activity被finish()的话此服务会被销毁。或者手动调用unbindService();关闭服务。
bindService();生命周期流程:
oncreate(只执行一次)——onBind(只执行一次,接收第一次创建Service时接收Activity传过来的参数)—service运行中....—onUnBind(调用unbindService()解绑时或者当前activity被finish()时执行)——ondestroy(只执行一次)。
bindService(intent,serviceConnection, Service.BIND_AUTO_CREATE);启动时需要三个参数
在使用bindService()启动时我们需要在继承Service的类里构造内部类,内部类继承Binder(Binder实现了IBinder)。。在onBind里return new出我们的内部类对象,同时我们Activity向service传递的值也是在onBind方法里获取到的。
这里我就是模拟了一个类似于后台下载的代码。
当启动成功时,调用内部类的方法,向Activity传值。在启动成功的监听回调里,我们将IBinder强转成我们的那个内部类。然后我们有了内部类对象,是不是就可以调用内部类的方法了呢。肯定能了!通过调用方法获取到Service向Activity穿过来的值。(不过要注意所有的方法都会执行一次)
IntentService:
它本身就是运行在子线程中的,可直接做耗时操作。
创建类继承IntentService
生命周期:oncreate()——onHandleIntent()——onDestroy()
oncreate:如果当前已存在此服务就不会去走。调用 stopService()后再startService()走此周期
onHandleIntent:此生命周期可多次运行,但他会等你这次耗时操作完成后才会执行。当耗时操作在执行过程中调用了stopService()会走onDestroy()但是他会坚持吧耗时操作执行完。
onDestroy:等操作完成后会自已走此方法。自动销毁。
比如咱们模仿一个耗时操作在onHandleIntent方法:
for (int i =0; i <20; i++) {
try {
Thread.sleep(500);
Log.e("IntentService","i==" + i);
}catch (InterruptedException e) {
e.printStackTrace();
}
}
网友评论