安卓开发之服务Service
2016-07-14 12:49
357 查看
一、Service是什么?
Service是一个应用组件,它用来在后台完成一个时间跨度比较大的工作,且没有关联任何界面。(生命周期在应用程序进程的主线程运行)一个Service可以完成的工作:访问网络(在Service中启动分线程)、播放音乐、文件IO操作、大数据量的数据库操作等。如果需要在Service中处理一些网络连接等耗时的操作,那么应该将这些任务放在分线程中处理,避免在主线程中阻塞用户界面。
特点:Service在后台运行,不用与用户进行交互。即使应用退出,服务也不会停止。当应用进程被杀死时(例如一键清理),服务便会停止。
二、Service的分类
Local Service (本地服务)Service对象与Service的启动者在同个进程中进行,两者的通信是进程内的通信。
Remote Service (远程服务)
Service对象与Service的启动者不在同个进程中进行,这时存在一个进程间的通信问题,Android专门为此设计了AIDL来实现进程间的通信。
三、Service的定义
定义一个类继承于Service类,重写方法。public class MusicService extends Service { public MusicService(){ Log.i("TAG","MusicService"); } @Override public IBinder onBind(Intent intent) { Log.i("TAG","onBind"); return new Binder(); //return 到ServiceConnection的onServiceConnected中 } @Override public void onCreate() { super.onCreate(); Log.i("TAG","onCreate"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i("TAG","onStartCommand"); return super.onStartCommand(intent, flags, startId); //返回值不同,Service被杀掉的情况也不同 } @Override public void onDestroy() { super.onDestroy(); Log.i("TAG","onDestroy"); } @Override public boolean onUnbind(Intent intent) { Log.i("TAG","onUnbind"); return super.onUnbind(intent); } }
在AndroidManifest.xml中配置Service
<service android:name="com.cxmscb.cxm.moodmusic.MusicService" /> <!--本地Service不需要intent-filter-->
注意:onStartCommand()方法必须返回一个整数,这个整数是一个描述了在系统的杀死事件中,系统应该如何继续这个服务的值。从onStartCommand()方法中返回的值必须是以下常量:
START_NOT_STICKY 如果系统在onStartCommand()方法返回之后杀死这个服务,那么直到接受到新的Intent对象,这个服务才会被重新创建。 START_STICKY 如果系统在onStartCommand()返回后杀死了这个服务,系统就会重新创建这个服务并且调用onStartCommand()方法,但是它不会重新传递最后的Intent对象,系统会用一个null的Intent对象来调用onStartCommand()方法。 在这个情况下,除非有一些被发送的Intent对象在等待启动服务。这适用于不执行命令的媒体播放器(或类似的服务),它只是无限期的运行着并等待工作的到来。 START_REDELIVER_INTENT 如果系统在onStartCommand()方法返回后,系统就会重新创建了这个服务,并且用发送给这个服务的最后的Intent对象调用了onStartCommand()方法。任意等待中的Intent对象会依次被发送。这适用于那些应该立即恢复正在执行的工作的服务,如下载文件。
四、启动/停止服务Service
Service分为两种工作状态,一种是启动状态,主要用于执行后台计算;另一种是绑定状态,主要用于其他组件和Service的交互。Service的这两种状态是可以共存的,即Service既可以处于启动状态也可以同时处于绑定状态。
启动服务,不与Activity绑定 Intent intent = new Intent(this,MusicService.class); this.startService(intent); //通过intent信使来启动 停止服务 Intent intent = new Intent(this,MusicService.class); this.stopService(intent); //通过intent信使来停止
ServiceConnection serviceConnection; 与Activity绑定服务来启动服务 Intent intent = new Intent(this,MusicService.class); if(serviceConnection==null){ serviceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { //当Activity与服务连接上时回调。 //onBind() --> onServiceConnected() //iBinder为Service中的onBind返回的iBinder } @Override public void onServiceDisconnected(ComponentName componentName) { //当Activity与服务断开后回调。 } }; this.bindService(intent,serviceConnection,Context.BIND_AUTO_CREATE); } 解绑服务 //当Activity销毁时,要与绑定的服务Sercive解绑,否则会报错 if(serviceConnection!=null){ Intent intent = new Intent(this,MusicService.class); this.unbindService(intent,serviceConnection); serviceConnection = null; }
五、Service的生命周期
因启动服务的方式不同,Service的生命周期也不同。startService
第一次启动服务: —>构造方法—>onCreate—>onStartCommand
再次启动该服务:—>onStartCommand
stopService( )
调用:—>onDestory
bindService
调用:—>构造方法—>onCreate—>onBind—->onServiceConneted
unbindService
调用:(当前Activity与该Service连接)—>onUnbind—>onDestory
六、Activity与Service的数据交流
Activity传数据给Service:在启动服务时通过Intent传递数据。(注意第一次启动服务时和再次启动服务时的方法调用区别。)Service传即时数据给Activity:Service可以通过特定广播来传递即时数据给接收特定广播的Activity,发送广播时也会带有Intent对象,可通过Intent携带数据。
当Activity和Service绑定时,可以通过Binder来链接Service和Activity,通过Binder来返回绑定的Service来获取Service对象内部的数据。
//MyService的onBind方法 @Override public IBinder onBind(Intent intent) { Log.i("TAG","onBind"); return new LocalBinder(); //return 到ServiceConnection的onServiceConnected中 } ------------------------------------------------------------ // MyService的内部类LocalBinder public class LocalBinder extends Binder{ public MyService getService(){ return MyService.this; } } ---------------------------------------------------------------------- MyService service = null; // 在Activity绑定服务时需要的ServiceConnection中的onServiceConnected方法 @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { //当Activity与服务连接上时回调。 //onBind() --> onServiceConnected() //iBinder为Service中的onBind返回的iBinder MyService.LocalBinder localBinder = (MyService.LocalBinder)iBinder; service = localBinder.getService(); }
七、IntentService
IntentService是Service类的子类,为异步服务。可以通过startService(Intent)方法传递请求给IntentService。可以在IntentService实现虚函数onHandleIntent,在里面根据Intent的不同进行不同的处理,按队列来一一处理。当执行完一个Intent请求对象所对应的工作之后,如果没有新的Intent请求达到,则自动停止Service;否则执行下一个Intent请求所对应的任务。
使用场景:需要将任务按队列来排列处理时,可以用IntentService。
IntentService默认实现了Onbind()方法,返回值为null。
八、远程Service(ADIL)
相关文章推荐
- 青云QingCloud 公有云第6次降价 最高降幅达10%
- Kruskal算法的简单实现
- 实现类似百度搜索框中模糊提示功能
- 使用jdb对tomcat进行远程调试
- Qt中利用TCP实现多个客户端之间相互发送消息系以及服务器的群发信息
- 百度地图数据自定义采集方法
- Qt Weekly #23: Qt 5.5 enhancements for Linux graphics and input stacks(翻译)
- DNS报文格式(RFC1035)
- linux④:
- AppCompatActivity和Activity主题问题
- 《C++ Primer Plus》第14章 C++中的代码重用 学习笔记
- 16.7.14
- 浮点型和整型在内存中的存储方式
- Android Studio show line numbers
- Reverse String
- hibernate获取connection连接
- 为iOS项目集成CocoaPods支持
- 血的教训:程序编译出错 crashed崩溃
- 电脑眼保健操——设置护眼色
- 剑指Offer--064-数据流中的中位数