赞
踩
目录
(1.1)定义
服务是实现后台运行的解决方案,适合执行那些不需要用户交互且需要长期运行的任务。即使程序被切换到后台,或者打开另一个程序,服务依然能够正常运行。但是服务是依赖创建服务时所在的应用进程,当应用进程被杀掉时,服务也会停止。另外服务中的代码默认运行在主线程中,如果需要执行耗时操作需要在服务内部创建子线程执行,否则可能出现ANR。
(1.2)作用
提供后台长期运行任务,比如耗时计算,音乐播放,下载等
服务提供了如下几个生命周期内可回调的方法onCreate()、onStartCommand()、onBind()和onDestory()。
当调用了Context的startService()方法,相应的服务就会启动起来,并回调onStartCommand()方法。如果这个服务之前还没创建过,onCreate方法会优先于onStartCommand方法执行。服务启动后会一直保持运行状态,直到stopService或stopSelf方法被调用。每次调用startService方法,onStartCommand就会执行一次,但onCreate只会执行一次。
还可以调用Context的bindService()来获取一个服务的持久连接,这时就会回调服务的onBind()方法。如果服务还没创建,则onCreate方法会先于onBind方法执行。
当调用了startSevice方法后,又去调用stopService方法,这时服务中的onDestory方法就会执行。类似的,当调用了bindService后,又去调用unbindService方法,onDestory方法也会执行。需要注意,当调用了startService后又调用了bindService方法,需要同时调用stopService和unbindService方法,onDestory才会执行。
新建一个类,并继承Service类,并实现类的方法onCreate、onStartCommand、onDestory,者三个方法是最常用的,其中onCreate方法会在服务创建时调用,onStartCommand方法会在每次服务启动时调用。
通常,如果希望服务一起动就去执行某个动作,可以把逻辑写在onStartCommand中。另外每个服务都需要在AndroidManifest.xml中注册才能生效。
- public class MyService extends Service {
- @Override
- public IBinder onBind(Intent intent) {
- throw new UnsupportedOperationException("Not yet implemented");
- }
-
- @Override
- public void onCreate() {
- System.out.println("onCreate=========");
- }
-
- @Override
- public int onStartCommand(Intent intent, int flags, int startId) {
- System.out.println("onStartCommand=========");
- return super.onStartCommand(intent, flags, startId);
- }
-
- @Override
- public void onDestroy() {
- super.onDestroy();
- System.out.println("onDestroy=========");
- }
- }
- <service
- android:name=".MyService"
- android:enabled="true"/>
调用Context的startService方法启动服务,调用Context.stopService方法停止服务,也可以在Service的任意位置调用调用stopSelf方法来停止服务
- private void start() {
- Intent intent = new Intent(this, DownService.class);
- startService(intent);
- }
-
- private void stop() {
- Intent intent = new Intent(this, DownService.class);
- stopService(intent);
- }
我们在活动里调用startService方法来启动Service后,onCreate和onStartCommand方法得到执行。之后服务一直处于运行状态,但具体运行什么逻辑,活动控制不了。可以借用onBind方法来使得活动和服务关联起来
- public class MyService extends Service {
-
- class MyBinder extends Binder {
- public void startDownload() {
- System.out.println("startDownload");
- }
- public void stopDownload() {
- System.out.println("stopDownload");
- }
- }
- private MyBinder binder = new MyBinder();
-
- @Override
- public IBinder onBind(Intent intent) {
- return binder;
- }
- }
可以看到,我们新建了一个MyBinder类,继承Binder,在类中定义了开始下载和停止下载的方法。接着在MyService类中创建了MyBinder实例,并在onBind()方法里返回了这个实例。下面看下在Activity中如何去调用服务中的这些方法
- private ServiceConnection myConnection = new ServiceConnection() {
- @Override
- public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
- MyService.MyBinder myBinder = (MyService.MyBinder) iBinder;
- myBinder.startDownload();
- myBinder.stopDownload();
- }
-
- @Override
- public void onServiceDisconnected(ComponentName componentName) {
-
- }
- };
-
- private void bind() {
- Intent intent = new Intent(this, DownService.class);
- bindService(intent, myConnection, BIND_AUTO_CREATE);
- }
-
- private void unbind() {
- unbindService(myConnection);
- }
首先创建了一个ServiceConnection匿名类,重写了onServiceConnected方法和onServiceDisConnected方法,这两个方法会在活动与服务成功绑定和接触绑定时调用。在onServiceConnected方法中,我们通过向下转型得到了MyBinder实例,就可以调用该实例中的方法了。
活动和服务绑定通过调用bindService方法,该方法接收三个参数,第一个是Intent对象,第二个是ServiceConnection实例,第三个是BIND_AUTO_CREATE表示活动和服务绑定后自动创建服务。
解除绑定通过调用unbindService方法,接收一个ServiceConnection实例
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。