Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4902
  • 博文数量: 4
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 32
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-30 10:46
文章分类
文章存档

2014年(2)

2013年(2)

我的朋友

分类: Android平台

2013-12-31 10:54:17

 在Android手机应用中,你会发现很多应用都是有后台的。对于多任务的操作系统来说,后台显得尤为重要。那么,我们就说说Android是靠什么实现后台的——Service。

  一 Service生命周期

  首先我们先解决第一个问题如何创建Service?

  创建

  Android里面有这样一个抽象类android.app.Service(PS:关于继承这部分是Java的知识,如有不明白的 大家去Java功底查阅资料)

  onBind(Intent intent);//必须实现的一个方法

  onCreate();//创建

  onDestroy();//销毁

  Service在创建和销毁时要分别调用onCreate()和onDestroy()方法的,这点和Activity相类似的。

  启动

  第一种方法:Context.startService()

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

  第二种方法:Context.bindService()

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

  第三种方法:其他方式

  其实不光能从 Activity 中启动 Service ,还有一个很有用的方法是接收系统的广播,这就要用到 Receiver 。在 Mainfest 文件中配置你得 Receiver 能接收什么样的广播消息,那么即使你得程序没有显示给用户,你的 Service 也能启动。你要做的就是继承 android.content.BroadcastReceiver ,然后实现 onReceive(Context context, Intent intent) 方法,就可以启动你得 Service 了。这里不能 bindService 因为一个 Receiver 是一个短暂存在的对象,所以 bind 是没有什么意义的。

  运行

  如何才能做到不让Service 随着 Activity 退出而退出呢?

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

  停止

  正常情况下被启动的Service是不会被停止的。除非,你的手机内存管理分配不足。但是,这个时候service在onStartCommand()返回后会继续运行的。通过stopSelf()或stopService()可以停止你的服务。系统会尽快的杀死你的Service。

  service同时处理多个对onStartCommand()的请求

  不要处理完请求之后就停止service,因为你可能已经又收到了新的启动请求。解决办法:你可以使用stopSelf(int)来保证你的停止请求来对应于你最近的开始请求。也就是,当你调用stopSelf(int)时,你传递开始请求的ID(传递给onStartCommand()的startId)给service,如果service在你调用stopSelf(int)之前收到一了个新的开始请求,发现ID不同,于是service将不会停止。

  二 Service合理优化

  优先级问题

  大家手机上都会有一些,关于杀手机进程的原件。如何才能保证自己的应用程序在手机上多呆一段时间呢?我给大家介绍个Service的一个方法。可以提高你的优先级setForeground(true)。

  启动一个Service服务, 默认他的标记是background。而当前正在运行的Activity是被标记成foreground。由此可见,如果将你的Service设置成setForeground(true)。他的优先级就会得到一定的提高。但是,还是会被杀掉的。

  查看Service优先级的方法

  进入$SDK/tools 运行命令,在他的返回值里你会看到oom_adj的值。oom_adj为8表示是backgroud。(PS:数字越小表示优先级越高)如 phone的oom_adj为-12。

  节省资源

  退出你的应用程序一定要停止它所有的service。这样可以避免浪费系统资源和消耗电量。如果需要,其它的组件可以调用stopService()停止service.即使你为service启用了绑定,你也必须自己停止service,甚至它收到了对onStartCommand()的调用也这样。

  更多关于android开发的资讯,可查询天地会

阅读(92) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~