创建一个可绑定的service
可绑定的service语序应用程序组件通过调用bindService()绑定自己来,创建一个保持长时间的连接,一般来说这种情况下不允许组件通过startService()启动它。
当你想让activity和应用程序里的其他组件与service交互,或者通过IPC通信为其他应用程序提供一些功能,这是你就应该创建一个可绑定的service。
要创建一个可绑定的service,你必须实现onBind()回调方法,并返回一个IBinder对象,该对象定义了与service通信的接口。其他应用程序组件通过调用bindService()方法得到接口,并调用service中的方法。当没有组件绑定一个service是,系统会销毁它。你不需要主动停止一个可绑定的service,但是当service是通过调用onStartCommand()启动时则必须考虑合适停止它。
创建可绑定的service第一件必须做的事情就是定义一个接口,接口定义了客户端如何与service通信。介于service与客户端之间的接口必须是IBinder对象的实现,并且从onBind()返回此对象个客户端。一旦客户端接收到IBinder对象,他就可以通过接口与service交互。
多个客户端可以同时绑定一个service。当客户端与service完成交互后,调用unbindService()方法解除绑定。一旦没有客户端与service绑定,系统就会销毁该service。
实现一个可绑定的service有许多方式,实现方式比创建一个可启动的service负责许多,所以将另开一个可绑定的service章节来讨论。
给用户发送通知
service一旦运行,可以通过Toast Notifications(Toast通知)或者Startus Bar Notifications(状态栏通知)来通知用户信息。
toast通知是在当前的窗口界面中短时间地显示一个信息,然后消失。而状态栏通知是在状态栏中显示信息并提供一个icon,用户可以选择该条通知进行操作如启动一个相关的activity。
通常来说,当后台工作完成后如文件下载完成后,使用状态栏通知是最好的技术,用户可以操作它。当用户从扩展视图里选择通知后,通知可以启动一个相关的activity如显示下载完成的文件。
在前台运行一个service
前台service被看作成是用户主动知道运行着的service,它既是在系统低内存时也不会被杀死。前台service必须提供一个状态栏通知,该通知放置在“Ongoing”标题下,这意味着除非service停止或者从前台移除,否则通知不能被解除。
例如,音乐播放器从service播放音乐,该service应该被设置成前台运行,因为用户明确的知道这个操作。状态栏中的通知可能显示当前播放的歌曲,并允许用户启动activity与音乐播放器交互。
要请求service运行在前台,需要调要startForeground()方法。此方法接收两个参数:一个integer值作为通知的唯一标识,还有提供给状态栏的Notification对象。例如:
Notification notification = new Notification(R.drawable.icon,getText(R.string.ticker_text),
System.currentTimeMillis());
Intent notificationIntent = new Intent(this, ExampleActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
notification.setLatestEventInfo(this, getText(R.string.notification_title),
getText(R.string.notification_message), pendingIntent);
startForeground(ONGOING_NOTIFICATION, notification);
从前台移除service要调用stopForeground()方法,该方法接收一个布尔值,指明时候一起移除状态栏的通知。此方法不停止service。但是,如果你停止了service,那么该通知也将被移除。
注意:startForeground()和stopForeground()方法是在android2.0引入的。为了在更旧的版本中在前台运行service,你必须使用以前版本中的的setForeground()方法。要了解更多如何向后兼容的信息请参看startForeground()文档。
留言列表