wordpress新手建站,win8网站模版,四川建设网官,动漫网站html一. 概览 Service 是一种可在后台执行长时间运行操作而不提供界面的应用组件。服务可由其他应用组件启动#xff0c;而且即使用户切换到其他应用#xff0c;服务仍将在后台继续运行。此外#xff0c;组件可通过绑定到服务与之进行交互#xff0c;甚至是执行进程间通信 (IPC…一. 概览 Service 是一种可在后台执行长时间运行操作而不提供界面的应用组件。服务可由其他应用组件启动而且即使用户切换到其他应用服务仍将在后台继续运行。此外组件可通过绑定到服务与之进行交互甚至是执行进程间通信 (IPC)。例如服务可在后台处理网络事务、播放音乐执行文件 I/O 或与内容提供程序进行交互. 本篇文章,我们重点讲一讲绑定服务. 为后面写的理解进程间通信机制文章做个铺垫. 二. 服务类型
2.1 前台服务
前台服务执行一些用户能注意到的操作。例如音频应用会使用前台服务来播放音频曲目。前台服务必须显示通知。即使用户停止与应用的交互前台服务仍会继续运行。 2.2 后台服务
后台服务执行用户不会直接注意到的操作。例如如果应用使用某个服务来进行数据搜集上报则此服务通常是后台服务。 2.3 绑定服务
当应用组件通过调用 bindService() 绑定到服务时服务即处于绑定状态。绑定服务会提供客户端-服务器接口以便组件与服务进行交互、发送请求、接收结果甚至是利用进程间通信 (IPC) 跨进程执行这些操作。仅当与另一个应用组件绑定时绑定服务才会运行。多个组件可同时绑定到该服务但全部取消绑定后该服务即会被销毁。 三. 基础知识 如要创建服务您必须创建 Service 的子类或使用它的一个现有子类。在实现中您必须重写一些回调方法从而处理服务生命周期的某些关键方面并提供一种机制将组件绑定到服务如适用。以下是你应该重写的最重要的回调方法
onStartCommand() 当另一个组件如 Activity请求启动服务时系统会通过调用 startService() 来调用此方法。执行此方法时服务即会启动并可在后台无限期运行。
如果您实现此方法则在服务工作完成后需负责通过调用 stopSelf() 或 stopService() 来停止服务。 onBind()
当另一个组件想要与服务绑定例如执行 RPC时系统会通过调用 bindService() 来调用此方法。在此方法的实现中您必须通过返回 IBinder 提供一个接口以供客户端用来与服务进行通信。请务必实现此方法但是如果你并不希望允许绑定则应返回 null。 如果组件通过调用 startService() 启动服务这会引起对 onStartCommand() 的调用则服务会一直运行直到其使用 stopSelf() 自行停止运行或由其他组件通过调用 stopService() 将其停止为止。
[注意]: 如果通过startService()已经启动了一个服务,再通过startService()方法启动的时候, 只会走onStartCommand()方法,不会重新走onCreate()方法. 四. 创建绑定服务
绑定服务允许应用组件通过调用 bindService() 与其绑定从而创建长期连接.
如需与 Activity 和其他应用组件中的Service服务进行交互或需要通过进程间通信 (IPC) 向其他应用公开某些应用功能则应创建绑定服务。
[要点]:
如要创建绑定服务您需通过实现 onBind() 回调方法返回 IBinder从而定义与服务进行通信的接口;
1. 必须定义指定客户端如何与服务进行通信的接口。
2. 服务与客户端之间的这个接口必须是 IBinder 的实现并且服务端必须从 onBind() 回调方法返回该接口。
3. 收到 IBinder 后客户端便可开始通过该接口与服务端进行交互。 多个客户端可以同时绑定到服务。完成与服务的交互后客户端会通过调用 unbindService() 来取消绑定。如果没有绑定到服务的客户端则系统会销毁该服务。
等同于下面这句话的理解:
多个客户端可以绑定到相同服务而且当所有绑定全部取消后系统即会销毁该服务(服务不必自行停止运行). 五. 服务生命周期 六. 实践出真知
本篇文章重点只讲绑定本地服务, 在同一个进程间通信.
如果您的服务仅供本地应用使用且无需跨进程工作您可以实现自有 Binder 类让客户端通过该类直接访问服务中的公共方法。
注意只有当客户端和服务处于同一应用和进程内最常见的情况时此方式才有效。例如对于需要将 Activity 绑定到在后台播放音乐的自有服务的音乐应用此方式非常有效。 实现步骤:
1. 在你的服务中创建可执行以下某种操作的 Binder 实例 包含客户端可调用的公共方法。 返回当前的 Service 实例该实例中包含客户端可调用的公共方法。 返回由服务承载的其他类的实例其中包含客户端可调用的公共方法。
2. 从 onBind() 回调方法返回此 Binder 实例。
3. 在客户端中从 onServiceConnected() 回调方法接收 Binder并使用提供的方法调用绑定服务。 客户端代码
public class LocalClient extends AppCompatActivity {private Intent intent;//同一进程, 本地服务对象LocalService mService;//是否绑定成功boolean mBound false;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);intent new Intent(this, LocalService.class);Button btn (Button)findViewById(R.id.start_btn);btn.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View view) {if(mBound) {int num mService.getRandomNumber();Toast.makeText(LocalClient.this, number: num, Toast.LENGTH_SHORT).show();}}});}private ServiceConnection connection new ServiceConnection() {Overridepublic void onServiceConnected(ComponentName componentName, IBinder service) {Log.e(test, 客户端onServiceConnected);mBound true;//已经绑定到LocalService强制转换IBinder并获取LocalService实例LocalService.LocalBinder binder (LocalService.LocalBinder) service;mService binder.getService();}Overridepublic void onServiceDisconnected(ComponentName componentName) {Log.e(test, onServiceDisconnected);mBound false;}};//在onstart方法中 调用 bindservice 绑定服务Overrideprotected void onStart() {super.onStart();bindService(intent, connection, Context.BIND_AUTO_CREATE);}//在onstop方法中, 调用unbindservice 解绑服务Overrideprotected void onStop() {super.onStop();unbindService(connection);mBound false;}Overrideprotected void onDestroy() {super.onDestroy();}本地服务端的代码:
public class LocalService extends Service {// Binder given to clientsprivate final IBinder binder new LocalBinder();// Random number generatorprivate final Random mGenerator new Random();public LocalService() {}/** method for clients */public int getRandomNumber() {return mGenerator.nextInt(100);}/*** Class used for the client Binder. Because we know this service always* runs in the same process as its clients, we dont need to deal with IPC.* 用于客户端的Binder类。因为我们知道该服务总是在与其客户端相同的进程中运行所以我们不需要处理IPC。*/class LocalBinder extends Binder {LocalService getService() {// Return this instance of LocalService so clients can call public methodsreturn LocalService.this;}}Overridepublic IBinder onBind(Intent intent) {Log.e(test, LocalService onBind绑定服务回调);return binder;}Overridepublic boolean onUnbind(Intent intent) {Log.e(test, LocalService onUnbind解绑服务回调);return super.onUnbind(intent);}打开app界面后,打印log:
03-06 15:16:16.612 19858 19858 E test : LocalService onBind绑定服务回调
03-06 15:16:16.623 19858 19858 E test : 客户端onServiceConnected
客户端通过bindservice 绑定服务, 打印LocalService onBind然后服务端通过onBind()回调方法返回此Binder实例
在客户端中从 onServiceConnected() 回调方法接收 Binder对象,打印客户端onServiceConnected 退出app界面后, 解绑服务,打印log:
03-06 15:22:52.460 19858 19858 E test : LocalService onUnbind解绑服务回调