Service拾遗

来源:互联网 发布:电子元器件查询软件app 编辑:程序博客网 时间:2024/06/05 22:48

对于Service之前一直有些模糊的地方,今天看了点击打开链接,把几点记录下来:

1、如果Start Service之后,又Bind Service会怎么样呢?这个时候你会发现,不管你是Stop Service还是Unbind Service,Service都不会被销毁,必要将两者都调用,Service才会被销毁。也就是说,Stop Service只会让Service停止,Unbind Service只会让Service和Activity解除关联,一个Service必须要在既没有和任何Activity关联又处理停止状态的时候才会被销毁。

2、Service其实是运行在主线程里的,不能在onStartCommand中执行耗时操作。但是我们可以在Service中再创建一个子线程,然后在这里去处理耗时逻辑就没问题了。Android的后台就是指,它的运行是完全不依赖UI的。即使Activity被销毁,或者程序被关闭,只要进程还在,Service就可以继续运行。比如说一些应用程序,始终需要与服务器之间始终保持着心跳连接,就可以使用Service来实现。

所有的Android应用程序组件--包括Activity、Service、ContentProvider、BroadcastRecever都在应用程序的主线程中运行。因此,任何组件中的费时处理都可能阻塞所有其他的组件,包括Service和可见的Activity。

3、如果你希望Service可以一直保持运行状态,而不会由于系统内存不足的原因导致被回收,就可以考虑使用前台Service。前台Service和普通Service最大的区别就在于,它会一直有一个正在运行的图标在系统的状态栏显示,下拉状态栏后可以看到更加详细的信息,非常类似于通知的效果。

4、将一个普通的Service转换成远程Service其实非常简单,只需要在注册Service的时候将它的android:process属性指定成:remote就可以了

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.example.servicetest"    android:versionCode="1"    android:versionName="1.0" >    ......<service    android:name="com.example.servicetest.MyService"    android:process=":remote" ></service></manifest>
使用了远程Service后,MyService已经在另外一个进程当中运行了,所以即使在onStratCommand中进行耗时操作只会阻塞该进程中的主线程,并不会影响到当前的应用程序。但是对于远程Service只能start service,而不能bind service,因为此时service已经处于不同的进程空间,没有办法直接获得另一个进程空间的IBinder对象,我们需要AIDL Service协助我们进行进程间的通信。

5、跨进程通信的真正意义是为了让一个应用程序去访问另一个应用程序中的Service,以实现共享Service的功能。在另一个应用程序中去绑定Service的时候并没有远程Service这个类,所以这里在构建Intent的时候是使用隐式Intent。

0 0
原创粉丝点击