Android学习笔记17——Service(3)

来源:互联网 发布:java md5密钥加密算法 编辑:程序博客网 时间:2024/06/11 14:43

创建一个Bound Service

      一个bound Service用于建立一个长连接并允许应用程序组 件通过调用bindService方法绑定,一般来说它不运行组件通过调用startService方法来启动它。

      当我们想要我们应用程序的Activities和其他组件与这个Service交互,或者想要通过内部进程调用来使自己应用程序的一部分功能开放给其他应用程序的时候,我们可以创建一个Bound Service。

      为了创建一个Bound Service,我们必须实现onBind()这个回调方法并且返回一个IBinder对象,这个对象定义了和这个Service交流的接口。这样其他应用程序组件就能够通过调用bindService方法来连接这个接口并且开始调用这个Service中的方法。这个Service就是为了服务于这些绑定到它的组件的,因此当这些组件全部与这个Service解除绑定的时候,系统会自动销毁这个Service,我们不需要自己去停止他们。

      而为了创建一个Bound Service,我们首先应该做的事情是定义一个客户端怎么和这个Service交互的接口。在这个Service和客户端之间的接口必须是一个IBinder的实现,并且必须从你的Service的这个onBind回调方法返回。一旦客户端收到了这个IBinder,客户端就会通过这个接口和这个Service进行交互。

      多个客户端能够一次绑定到这个Service。当一个客户端和这个Service完成交互的时候,它能通过调用unbindService解除绑定,一旦没有任何客户端绑定到这个Service的时候,系统将会销毁这个Service。

发送通知给用户

      一旦Service运行以后,它能够通过用Toast Notifications或着Status Bar Notifications来通知用户事件。

     一个Toast Notification就是一条出现在当前窗体很短一段时间的消息,然后就会消失。而一个状态栏通知就是一条在状态栏中拥有图标的消息体,用户能够通过他进行一些操作。

    通常,状态栏通知是一个最好的技术,当一些后台操作完成的时候,用户能够通过它进行一些操作。当用户通过扩展的视图来选择某个通知的时候,这个通知能够开启一个Activity。

在前台运行一个Service

     一个前台的Service通常是一个用户积极去做的事情并且当系统内存较低的时候不能被杀死。一个前台的Service必须在状态栏提供一个通知,这个通知不会消失直到这个Service停止或者从前台移除掉。

     例如,一个播放音乐的Service应该被设置为前台的Service,因为这样用户能够很清楚的知道它的操作,在状态栏中的通知可能会推测出当前播放的音乐并且允许用户通过一个Activity来和这个播放器进行交互。

     我们可以通过调用startForeground方法来开启一个前台的Service。这个方法需要两个参数:一个整数用来标识出这个通知,和通知栏的这个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_ID, notification);
注意:这个ID不能是0.

        为了在前台中移除这个Service,我们可以调佣stopForeground方法。这个方法需要一个boolean参数,用来标识是否移除这个状态栏的通知,这个方法不会停止这个Service。然而,如果当一个前台Service正在运行的时候,你停止了这个Service,那么这个通知也就会被移除。

0 0