Service后记与拓展

来源:互联网 发布:js 汉字比较 编辑:程序博客网 时间:2024/06/10 08:55

使用细节


1.在注册服务的时候,为了将service纳入编译系统,必须在AndroidMainfest.xml中对Service进行显式声明。


2.计算量较大的又不是UI层的工作的话,可以选择放置在Service中进行工作。


3.通过开发文档你会发现,Android中的Service与宿主(调用者)在同一线程,而不是专门起一条线程,这意味着,如果你的服务要CPU密集型操作(如:MP3播放)或则阻塞操作(如网络)时,必须产生它自己的线程来完成这个工作,否则会造成线程阻塞。在Service的子类里面,IntentService服务可以作为一个标准实施,它的工作自己线程


4.如果在使用Service的时候又使用了广播接收器配合工作,广播如果是动态注册的话,在服务停止的时候记得调用unregisterReceiver(receiver);这个方法来注销掉接收器




拓展


1.如何检查Android后台服务线程(Service类)是否正在运行


Android系统自己提供了一个函数ActivityManager.getRunningServices,可以列出当前正在运行的后台服务线程

private boolean isServiceRunning() {      ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);      for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {          if ("com.example.MyService".equals(service.service.getClassName())) {              return true;          }      }      return false;  }  


2.Service与UI之间的通信方式


(1)使用直接启动的startService实现信息传递

流程:UI  ——>Service

操作:使用Intent进行数据传递,通过服务中的onStartCommand方法进行接受(和Activity间传递方式一样)


(2)使用绑定启动的bindservice实现信息传递

流程:UI  ——>Service


Broadcast(广播)进行信息的双向传递

流程:UI  <——>Service

操作:注册绑定广播接受器,之后通过广播来进行2者间通信

注意:在服务退出的时候记得unregisterReceiver(receiver);注销广播接收器


3.Service和Thread的区别

我们拿服务来进行一个后台长时间的动作,为了不阻塞线程,然而,Thread就可以达到这个效果,为什么我们不直接使用Thread去代替服务呢?(这个问题摘抄至网上,原文地址不是是哪个,所以没写上)

这里提下,


1). Thread:Thread 是程序执行的最小单元,它是分配CPU的基本单位。可以用 Thread 来执行一些异步的操作。 
2). Service:Service 是android的一种机制,当它运行的时候如果是Local Service,那么对应的 Service 是运行在主进程的 main 线程上的。如:onCreate,onStart 这些函数在被系统调用的时候都是在主进程的 main 线程上运行的。如果是Remote Service,那么对应的 Service 则是运行在独立进程的 main 线程上。因此请不要把 Service 理解成线程,它跟线程半毛钱的关系都没有!


既然这样,那么我们为什么要用 Service 呢?其实这跟 android 的系统机制有关,我们先拿 Thread 来说。Thread 的运行是独立于 Activity 的,也就是说当一个 Activity 被 finish 之后,如果你没有主动停止 Thread 或者 Thread 里的 run 方法没有执行完毕的话,Thread 也会一直执行。因此这里会出现一个问题:当 Activity 被 finish 之后,你不再持有该 Thread 的引用。另一方面,你没有办法在不同的 Activity 中对同一 Thread 进行控制。


举个例子:如果你的 Thread 需要不停地隔一段时间就要连接服务器做某种同步的话,该 Thread 需要在 Activity 没有start的时候也在运行。这个时候当你 start 一个 Activity 就没有办法在该 Activity 里面控制之前创建的 Thread。因此你便需要创建并启动一个 Service ,在 Service 里面创建、运行并控制该 Thread,这样便解决了该问题(因为任何 Activity 都可以控制同一 Service,而系统也只会创建一个对应 Service 的实例)。

因此你可以把 Service 想象成一种消息服务,而你可以在任何有 Context 的地方调用 Context.startService、Context.stopService、Context.bindService,Context.unbindService,来控制它,你也可以在 Service 里注册 BroadcastReceiver,在其他地方通过发送 broadcast 来控制它,当然这些都是 Thread 做不到的。 



利用服务




Service服务的总结就到这里,如果有什么错误或者需要补充之处可以提出来。


另外,使用AIDL方式的Service(进行跨进程通信),以后会继续跟进博客的。

0 0