Android开发_Service组件

来源:互联网 发布:nginx 命令 编辑:程序博客网 时间:2024/05/16 02:04

Service基础知识

Service(服务)是一个没有用户界面的在后台运行耗时操作的应用组件。其它应用组件能够启动Service,并且当用户切换到另外的应用场景时,Service将持续在后台运行。另外,一个组件能够绑定到Service与之交互(IPC)机制,例如,一个service可能会处理网络操作,播放音乐,操作文件I/O或者与内容提供者(content provider)交互,所有这些活动都是在后台进行。

注意:service与activity一样都存在与当前进程的主线程中,所以,一些阻塞UI的操作,比如耗时操作不能放在service里进行,比如另外开启一个线程来处理诸如网络请求的耗时操作。如果在service里进行一些耗CPU和耗时操作,可能会引发ANR警告,这时应用会弹出是强制关闭还是等待的对话框。


Service的生命周期图:

 

context.startService() ->onCreate()- >onStart()->Service running--调用context.stopService() ->onDestroy()

context.bindService()->onCreate()->onBind()->Service running--调用>onUnbind() ->onDestroy()


启动和关闭Service:

第一种方法:

public void myService(){Intent i = new Intent(MainActivity.this,MyService.class);startService(i);// 启动ServicestopService(i);// 关闭Service}
通过startService()启动的服务处于“启动的”状态,一旦启动,service就在后台运行,即使启动它的应用组件已经被销毁了。通常started状态的service执行单任务并且不返回任何结果给启动者。比如当下载或上传一个文件,当这项操作完成时,service应该停止它本身。


第二种方法:

public void myService() {Intent i = new Intent(MainActivity.this, MyService.class);// 绑定ServicebindService(i, MainActivity.this, Context.BIND_AUTO_CREATE);// 取消绑定unbindService(MainActivity.this);}

如果想通过bindService()方法来启动Service,那么调用该方法的类要实现ServiceConnection接口并重写下面两个方法:

// 成功绑定时调用@Overridepublic void onServiceConnected(ComponentName arg0, IBinder arg1) {}// 绑定的Service崩时触发@Overridepublic void onServiceDisconnected(ComponentName arg0) {}
并且在Service的onBind()方法中不能返回null,否则绑定失败。可以在onServiceConnected()中获取到被绑定的Service在onBind()方法中返回的IBinder实例对象,通过该实例对象就可以与该Service进行交互。

注意:

1、当Service被创建一次之后,只要它还在运行,那么下次调用 它时就不会再重新创建,也就是所运行的Service实例对象只有一个。

2、通过bindService()方法可以创建并绑定Service,通过unbindService()方法可以取消绑定并销毁该Service;但是如果通过startService()方法来创建一个Service,再通过bindService()方法来绑定它,那么当调用unbindService()方法时只会取消该Service的绑定,而不会销毁该Service,只有再调用stopService()方法才能销毁该Service


public class MyService extends Service {private final MyServiceBinder binder = new MyServiceBinder();/** * Service被绑定时候会调用该方法,如果该方法返回null, 那么就会绑定失败 */@Overridepublic IBinder onBind(Intent arg0) {return binder;}public class MyServiceBinder extends Binder {public MyService getService() {return MyService.this;}}@Overridepublic void onCreate() {super.onCreate();}@Overridepublic void onDestroy() {super.onDestroy();}}

0 0
原创粉丝点击