【Android Develop Tips】BindService/StartService
2017-06-23 16:10
645 查看
Service 的生命周期只有onCreate, onStart, onDestroy,启动一个Service有两种方法:startService && bindService 。
1):startService
执行startService时,Service会经历onCreate->onStartCommand。当执行stopService时,直接调用onDestroy方法。调用者如果没有stopService,Service会一直在后台运行,下次调用者再起来仍然可以stopService.
多次调用startService,该Service只能被创建一次,即该Service的onCreate方法只会被调用一次。但是每次调用startService,onStartCommand方法都会被调用
2):执行bindService时,Service会经历onCreate->onBind。这个时候调用者和Service绑定在一起。调用者调用unbindService方法或者调用者Context不存在了(如Activity被finish了),Service就会调用onUnbind->onDestroy。
第一次执行bindService时,onCreate和onBind方法会被调用,但是多次执行bindService时,onCreate和onBind方法并不会被多次调用,即并不会多次创建服务和绑定服务
3):bindService应用实例
bindService的使用方法
3.1:在Activity里,实例化ServiceConnection接口的实现类,重写onServiceConnected()和onServiceDisconnected()方法。
Implement BindMusicService
4):Remoteservice
通常每个应用程序都在它自己的进程内运行,但有时需要在进程之间传递对象(IPC通信),你可以通过应用程序UI的方式写个运行在一个不同的进程中的service。AIDL(android接口描述语言)是一个IDL语言,它可以生成一段代码,可以使在一个android设备上运行的两个进程使用内部通信进程进行交互。
要使用AIDL,Service需要以aidl文件的方式提供服务接口,AIDL工具将生成一个相应的Java接口,并且在生成的服务接口中包含一个功能调用的stub服务桩类。Service的实现类需要去继承这个stub服务桩类。Service的onBind方法会返回实现类的对象,之后你就可以使用它了。
IMusicControlService.aidl
使用eclipse的Android插件,会根据这个aidl文件生成一个Java接口类,生成的接口类中会有一个内部类Stub类,Service来继承该Stub类:
客户端(Activity)应用连接到这个Service时,onServiceConnected方法将被调用,客户端就可以获得IBinder对象。参看下面的客户端onServiceConnected方法
Reference:
http://blog.csdn.net/pi9nc/article/details/9354183
http://www.cnblogs.com/yejiurui/p/3429451.html
1):startService
执行startService时,Service会经历onCreate->onStartCommand。当执行stopService时,直接调用onDestroy方法。调用者如果没有stopService,Service会一直在后台运行,下次调用者再起来仍然可以stopService.
多次调用startService,该Service只能被创建一次,即该Service的onCreate方法只会被调用一次。但是每次调用startService,onStartCommand方法都会被调用
2):执行bindService时,Service会经历onCreate->onBind。这个时候调用者和Service绑定在一起。调用者调用unbindService方法或者调用者Context不存在了(如Activity被finish了),Service就会调用onUnbind->onDestroy。
第一次执行bindService时,onCreate和onBind方法会被调用,但是多次执行bindService时,onCreate和onBind方法并不会被多次调用,即并不会多次创建服务和绑定服务
3):bindService应用实例
bindService的使用方法
3.1:在Activity里,实例化ServiceConnection接口的实现类,重写onServiceConnected()和onServiceDisconnected()方法。
private void connectService() { Intent intent = new Intent("com.homer.bind.bindService"); bindService(intent, sc, Context.BIND_AUTO_CREATE); } private ServiceConnection sc = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { //connect Service musicService = ((BindMusicService.MyBinder) (service)).getService(); if (musicService != null) { musicService.play(); // play music } } @Override public void onServiceDisconnected(ComponentName name) { musicService = null; } };
Implement BindMusicService
public class BindMusicService extends Service { private MediaPlayer mediaPlayer; private final IBinder binder = new MyBinder(); public class MyBinder extends Binder { BindMusicService getService() { return BindMusicService.this; } } @Override public IBinder onBind(Intent intent) { return binder; } }
4):Remoteservice
通常每个应用程序都在它自己的进程内运行,但有时需要在进程之间传递对象(IPC通信),你可以通过应用程序UI的方式写个运行在一个不同的进程中的service。AIDL(android接口描述语言)是一个IDL语言,它可以生成一段代码,可以使在一个android设备上运行的两个进程使用内部通信进程进行交互。
要使用AIDL,Service需要以aidl文件的方式提供服务接口,AIDL工具将生成一个相应的Java接口,并且在生成的服务接口中包含一个功能调用的stub服务桩类。Service的实现类需要去继承这个stub服务桩类。Service的onBind方法会返回实现类的对象,之后你就可以使用它了。
IMusicControlService.aidl
package com.homer.remote; interface IMusicControlService{ void play(); void stop(); void pause(); }
使用eclipse的Android插件,会根据这个aidl文件生成一个Java接口类,生成的接口类中会有一个内部类Stub类,Service来继承该Stub类:
public class RemoteMusicService extends Service { private MediaPlayer mediaPlayer; @Override public IBinder onBind(Intent intent) { return binder; } private final IMusicControlService.Stub binder = new IMusicControlService.Stub() { @Override public void play() throws RemoteException { if (mediaPlayer == null) { mediaPlayer = MediaPlayer.create(RemoteMusicService.this, R.raw.tmp); mediaPlayer.setLooping(false); } if (!mediaPlayer.isPlaying()) { mediaPlayer.start(); } } @Override public void pause() throws RemoteException { if (mediaPlayer!=null && mediaPlayer.isPlaying()) { mediaPlayer.pause(); } } @Override public void stop() throws RemoteException { if (mediaPlayer != null) { mediaPlayer.stop(); try { mediaPlayer.prepare(); // 在调用stop后如果需要再次通过start进行播放,需要之前调用prepare函数 } catch (IOException ex) { ex.printStackTrace(); } } } }; }
客户端(Activity)应用连接到这个Service时,onServiceConnected方法将被调用,客户端就可以获得IBinder对象。参看下面的客户端onServiceConnected方法
private IMusicControlService musicService; private void connection() { Intent intent = new Intent("com.homer.remote.remoteMusicReceiver"); bindService(intent, sc, Context.BIND_AUTO_CREATE); } private ServiceConnection sc = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { //connect Service musicService = IMusicControlService.Stub.asInterface(service); } @Override public void onServiceDisconnected(ComponentName name) { musicService = null; } };
Reference:
http://blog.csdn.net/pi9nc/article/details/9354183
http://www.cnblogs.com/yejiurui/p/3429451.html
相关文章推荐
- [AndroidTips]startService与bindService的区别
- [AndroidTips]startService与bindService的区别
- android 开发StartService 和BindService
- Android学习札记三:初涉Service(1)之Context.startService()与Context.bindService()区别
- android之startService和bindService方法的区别
- Android组件之Service之startService、bindService
- Android里Service的bindService()和startService()混合使用深入分析
- Android里Service的bindService()和startService()混合使用深入分析
- Android入门-Service-start,end,bind,unbind之间的区别
- Android里Service的bindService()和startService()混合使用深入分析
- android startService和bindService的理解
- Android的startservice和bindservice
- Android Service之 startService与bindService
- android四大组件之一Service的startService()与bindService()区别?
- Android系统在新进程中启动自定义服务过程(startService)的原理分析、Android应用程序绑定服务(bindService)的过程源代码分析
- Android:Context.startService/Context.bindService的区别
- Android菜鸟笔记-由startService到bindService的学习
- android startService 与bindService的区别
- Android 两种启动Service(远程)的方式:Bind 与Start
- 【Android 界面效果34】Android里Service的bindService()和startService()混合使用深入分析