android service 值得注意的地方(1)

1.     service是应用程序的组成部分,可以和用户之间没有交互并且可以在后台长期运行.通常用来执行一些长时间的操作,如handle net work,play music,perform file I/O。还可以通过绑定服务来完成进程间的通信。

2.     service启动的两种方式:
1)     Started:应用程序的其他部分,如activity可以通过调用startActivity来启动。Note:服务和activity是毫无依赖关系的两个不同的部分,只要service已经启动,哪怕启动该service的activity被销毁了,service依然在后台继续执行。
2)     Bound:应用程序的其他部分如A,通过调用bindService()绑定服务。绑定服务提供的是允许A和服务进行交互的接口,A可以向service发送请求,获得结果。Note:服务和A之间有依赖关系,service的生命周期和A相关。多个A可以在同一时刻Bind同一个service,当所有的A unbind 这个service之后,该service就被销毁。
差别:1.started一般不返回结果,而Bound可以返回结果。
         2.Started的service的生命周期和Activity无关,而Bound则有关。

3.     Started过程:
context.startService() -> onCreate() ->onStart() -> service Running
context.stopService() -> onDestory() -> Service Stop
Bound过程:
context.bindService() -> onCreate() ->onBind() -> Service running
onUnbind() -> onDestroy() -> Service stop      
onStart()可多次调用,onBind()只能调用一次。  
     
4.     Service不是一个单独的进程或线程,而是运行在应用程序所在的主线程。它不能创建自己的线程。Note:当需要在service中执行一些很耗CPU和时间的操作,就应该开一个线程来处理。好处:1.可以降低ANR风险,2.可以让用户有好的试用体验。

5.     重要的回调函数
1)     onStartCommand():当一个组件如Activity调用StartService()来启动Service的时候,系统调用该方法。Note:一旦重写该方法,就需要自己来停止或销毁该Service。
2)     onBind():当一个组件如Activity想去绑定一个服务的时候就回执行该方法。Note:一旦重写该方法,就需返回Ibind接口,客户端通过该接口和服务进行交互。
3)     onCreate():当Service是第一次生成的时候,调用该方法。若该Service已存在,就不再调用该方法。它在onStartCommand()和onBind()方法执行。
4)     onDestory():当Service完成任务,不再用,被销毁的时候调用该方法。Note:在该方法中,需要释放不再用的资源(进程,注册的监听,Receiver等)
5)     onRebind():当Service在内存中已经存在,调用bindService()方法再次与Service取得通信,将调用该方法。

6.     默认的,应用程序的所有组件都运行在同一个进程里面。可通过配置文件AndroidManifest中,android:process来指定组件运行在哪一个进程。可以指定一些组件运行在同一个进程中,也可以指定不同的应用程序的组件运行在同一个进程中。

7.     进程销毁:当系统资源比较紧张的时候,为了释放资源,系统会强行杀死某些进程,运行在该进程中的组件也会被销毁。进程销毁的规则:实质上是比较这些进程对用户的重要程度(进程里组件的运行状态)。当承载的组件再也不会在手机屏幕上可见,该进程会先被销毁。当资源允许的时候,系统会重新启动被杀死的Service。
Note:进程销毁的层次(后->先):
1)     前台进程(先->后)
      1>运行着onReceive()的BroadcastReceiver
2>生命周期为onCreate(),onStart(),onDestory()的Service
3>运行在前台的Service(called startForeground())
4>和正在同用户交互的Activity进行绑定的Service
5>正在和用户交互的Activity.
2)     可见进程
1>     没运行在前台,但仍然可以,如一个Activity生成了一个Dialog,该Activity便不再前台却仍然可见(调用了onPause()方法)。
2>     绑定上述Activity的Service
3)     服务进程
4)     后台进程:承载的Activity调用了onStop()方法
5)     空进程

8.     主线程(UI线程)的两条规则:
1)     不能阻塞主线程
2)     不能从其他的线程来修改UI线程中的组件,
解决方法:
1>不好维护
Activity.runsOnUiThread(Runnable);
View.post(Runnable);
View.postDelayed(Runnable,long)
2>使用AsyncTask

9.     Service默认的是不能被其他应用程序Start or Bound,可以通过修改配置文件,android:exported = “true”来使Service可以被其他应用程序绑定。Exported的默认值依赖于Service是否实质了intent filters。设置Android:process可以指定Service运行在哪个进程中。默认的是运行在主线程中。

10.     无论一个Service被Start多少次,一旦调用了Context.stopService()或stopSelf(),Service将会被停止。但调用stopSelf()可以保证事物已经完成。

11.     IntentService:一个基类Service,默认创建一个工作线程,并创建一个事物队列(intents),事物队列中所有的intents轮流使用工作线程。当所有的事物完成,IntentService自动停止,不需要调用stopSelf().Note:当需要异步处理任务时,可以使用IntentSerive。

12.     Service可以同时处理多个同样的事物,因为它为每一个请求启动一个线程来执行。这和IntentService不一样。

13.     通过ID来停止相对应ID的服务,而不会影响服务相同,ID不同的服务。Note:当服务完成的时候,停止服务非常重要,将会及时的释放手机内存。

14.     多个客户端可以同时绑定一个服务,当客户端完成同服务的交互时,客户端将会解除绑定。当没有一个客户端绑定该服务的时候,系统将会销毁该服务。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值