Android 当然提供了运行后台程序的方法即Service,Service是没有前台界面,可以视为没有界面的activity。
在正式讲service之前,我们先简单了解一下android中进程的优先级:

进程优先级

  1. 前台进程:拥有一个正在与用户交互的Activity(onResume方法被调用)的进程
  2. 可见进程:拥有一个可见但是没有焦点的Activity(onPause方法被调用)
  3. 服务进程:拥有一个通过startService方法启动的服务
  4. 后台进程:拥有一个不可见的Activity(onStop方法被调用)的进程
  5. 空进程:没有拥有任何活动的应用组件的进程 (越容易被系统关闭)

服务可以被手动关闭,不会重启,但是如果被系统自动关闭,内存充足就会重启

开启一个服务的第一步:创建服务类.

只要继承 android.app.Service 这个抽象类,并且实现其中几个方法就可以了。

里边必须实现的一个方法是 onBind(Intent intent) ,他具体是做什么的我们下边讲。还有两个重要的回调函数需要覆盖,onCreate() 和 onDestroy()。跟 Actitivty 类似,在创建和销毁 Service 时回调这两个函数,达到初始化或退出前保存状态。

开启一个服务的第二步:启动服务.

在Andriod开发中,服务有两种启动方式:

  • Context.startService:服务被启动之后,跟启动它的组件没有一毛钱关系
  • Context.bindService:跟启动它的组件同生共死

注:
在同一个应用任何地方调用 startService() 方法就能启动 Service 了,然后系统会回调 Service 类的 onCreate() 以及 onStart() 方法。这样启动的 Service 会一直运行在后台,直到 Context.stopService() 被调用。另外如果一个 Service 已经被启动,其他代码再试图调用 startService() 方法,是不会执行 onCreate() 的,但会重新执行一次 onStart() 。

另外一种 bindService() 方法的意思是,把这个 Service 和调用 Service 的客户类绑起来,如果调用这个客户类被销毁,Service 也会被销毁。用这个方法的一个好处是,bindService() 方法执行后 Service 会回调Service类的 onBind() 方发,可以从这里返回一个实现了 IBind 接口的类,在客户端操作这个类就能和这个服务通信了,比如得到 Service 运行的状态或其他操作。如果 Service 还没有运行,使用这个方法启动 Service 就会 onCreate() 方法而不会调用 onStart()。

开启一个服务的第三步:与 Service 通信并且让它持续运行.

如果我们想保持和 Service 的通信,又不想让 Service 随着 Activity 退出而退出呢?你可以先 startService() 然后再 bindService() 。当你不需要绑定的时候就执行 unbindService() 方法,执行这个方法只会触发 Service 的 onUnbind() 而不会把这个 Service 销毁。这样就可以既保持和 Service 的通信,也不会随着 Activity 销毁而销毁了。

注: startService启动服务的生命周期 onCreate-onStart-onDestroy
绑定服务和解绑服务的生命周期方法:onCreate->onBind->onUnbind->onDestroy

用其他方式启动 Service

例如:你需要在开机的时候自己启动一个服务。这就不能需要四大组件之一的Receiver。在清单文件中配置你得 Receiver 能接收什么样的广播消息。继承 android.content.BroadcastReceiver ,然后实现 onReceive(Context context, Intent intent) 方法,就可以启动你得 Service 了。这里不能 bindService 因为一个 Receiver 是一个短暂存在的对象,所以 bind 是没有什么意义的。

注:因为一般 Service 都会启动另外的线程不断循环作一些操作,循环频率不易太高。也不要做太过于耗费资源的操作,特别是CPU资源,因为后台 Service 用户看不到,会比较莫名奇妙。具体可以结合 top 以及 logcat 监测使用情况。LOG中如果虚拟机频繁的 GC 应该也说明程序还有很大改进的余地。因为GC 也是很耗费CPU的。可能这些不光 Service 应该注意,只要是移动设备都应该考虑,才能给你的用户最佳的体验。

更多相关文章

  1. 关于android中使用new Message的内存泄露问题
  2. AndFix解析——(上)
  3. 如何编程实现开启或者关闭GPS
  4. Android之打造ListView的万能适配器
  5. Android异步处理常用方法
  6. 《Android移动应用基础教程》(Android(安卓)Studio)(第二版)黑马教程
  7. Android软件广告屏蔽方法及代码
  8. 浅谈Java中Collections.sort对List排序的两种方法
  9. Python list sort方法的具体使用

随机推荐

  1. Android 自定义标题栏Title Bar
  2. Android (一) Android studio 安装
  3. stagefright
  4. Android消息处理机制2——Message
  5. Android Tab切换表格头
  6. android 来电自动接听和自动挂断
  7. Android之OnGestureListener实现图片的左
  8. Android获取、设置桌面
  9. 常用的android弹出对话框
  10. 2014.01.16(2) ——— android 关于适配的