WEB开发网
开发学院手机开发Android 开发 Android SDK 开发之 Services 服务 阅读

Android SDK 开发之 Services 服务

 2010-03-23 04:08:00 来源:WEB开发网   
核心提示:但不会调用onStartCommand(). 客户将获取IBinder对象, 这些对象由服务的onBind(Intent)方法返回, 以便客户能够向服务发出调用. 只要链接建立, 服务就会一直运行(不管客户是否保留服务的IBinder的引用). 通常IBinder是使用aidl写成的一个复杂接口.一个服务同时可以被启动
但不会调用onStartCommand(). 客户将获取IBinder对象, 这些对象由服务的onBind(Intent)方法返回, 以便客户能够向服务发出调用. 只要链接建立, 服务就会一直运行(不管客户是否保留服务的IBinder的引用). 通常IBinder是使用aidl写成的一个复杂接口.

一个服务同时可以被启动并连接. 在这样的情形下, 系统将让该服务保持运行,只要它是启动状态,或者有Context.BIND_AUTO_CREATE标志的连接. 当这两个条件都不满足时, 该服务的onDestroy()方法被调用, 服务被终止. 所有的清理工作(停止线程, 注销接收器)应该在onDestroy()中完成.

Permissions 权限

如果一个服务在manifest中的中声明一个服务的强制全局访问, 那么其它的应用程序必须在对应的元素中做相应的声明, 以便启动,停止或者绑定该服务.

此外, 一个服务可以使用权限来保护一个IPC调用. 使用 checkCallingPermission(String) 方法.

Process Lifecycle 进程生命周期

android系统会试图保持持有服务的进程运行, 只要该服务被启动或者有客户连接它. 当内存不足时, 持有服务的进程将有较高的优先级:

如果服务正在它的 onCreate(), onStartCommand()或者onDestroy()中运行, 那么持有服务的进程将变为前台进程.

如果服务已经被启动了, 那么持有它的进程被认为比当前对用户可见的进程次要, 但比其它不可见的进程重要.

如果有客户连接到服务, 那么该服务的进程的重要性不低于重要性最高的客户进程.

一个已启动的服务可以诗意哦能够startForeground(int, Notification) API来将服务放在前台状态, 系统认为它是用户可见的, 因此在内存低的时候不会被kill.

注意这意味着大部分服务在运行的时候, 它有可能被系统Kill掉. 这样, 系统之后会重启该服务. 如果你实现onStartCommand()来安排异步工作或者在另一个线程中工作, 那么你可能需要使用START_FLAG_REDELIVERY来让系统重新发送一个intent这样如果你的服务在处理它的时候被Kill掉, Intent不会丢失.

Summary 总结

公有方法

final ApplicationgetApplication()

返回持有该服务的应用程序.

abstract IBinderonBind(Intent intent)

返回该服务的通信通道.

void onCreate()

该服务第一次被创建时调用.

Tags:Android SDK 开发

编辑录入:coldstar [复制链接] [打 印]
赞助商链接