创建一个可绑定的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 NotificationsToast通知)或者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()文档。

 

 

管理service的生命周期

arrow
arrow
    全站熱搜

    戮克 發表在 痞客邦 留言(0) 人氣()