您的位置:首页 > 移动开发 > Android开发

android service相关

2011-06-30 11:30 148 查看
一个service主要有两种方式:

I started

一个组件(如一个activity)可以通过startService()启动一个service。一旦service启动后,他就可以无限制的

运行在后台,即使启动它的组件已经结束了。通常,一个启动后的service拥有自己独立的操作,并且不需要对调用者

返回结果。

II bound

当一个service被一个组件通过bindservice()绑定,那么这个service就是bound。这样的service提供了一中

客户-服务器的接口,允许组件与service交互,发送请求,获得结果甚至进程间的通信。多个组件可以绑定到一个service上

但当这些组件撤销绑定时,service就结束了。

 

这两种service是可以联系在一起的,当一个组件启动一个service后,这是第一种service,然后又有组件绑定到这个service

就变成了第二种service。如果你实现了一对回调函数:允许组件启动service的onStartCommand()和允许绑定的onBind()

,那么创建两种service是简单的。

注意service最好不要用主线程运行,因为他无法创建自己的线程和在单独的进程运行。当进行一项非常耗时的任务时

会导致系统无响应错误。

 

你只有创建一个Service的子类去创建以service,在你实现中,你需要重写一些回调函数它们包含了service生命周期的主要方面

并且提供为组件去绑定的机制。最重要的几个需要重写的回调方法:

I onStartCommand()

当组件通过调用startService()启动一个service时,系统就会调用这个方法。一旦这个方法被调用,这个service就会启动,

并在后台无限制的运行。如果你实现这个,那么当这个service的工作完成后你得通过调用stopSelf()或stopService()去结束他

但是,如果你的service是提供绑定的,那么就不必重写这个方法。

II onBind()

当组件想要通过bindService()绑定这个service时,系统就会调用这个方法。在你实现这个函数时,你必须提供一个用户用来与

这个service通信的借口,通过返回一个IBind对象。如果你不想让别的组件绑定,可以返回null。

III onCreate()

当service最开始创建时,系统调用这个方法。在上面两种函数之前一次性的设置程序。如果这个service已经运行了

这个方法将不再调用。

IIII onDestroy()

当这个service不再使用时要结束它时,系统就会调用这个方法。你应该用这个方法去清除所用到的资源,例如线程,监视器,接收器等

。这是service最后的调用。

 

如果一个组件启动一个service通过调用startService()(这个将导致调用service的onStartCommand()并且系统会传递给他intent),然后service回一直运行

直到用stopSelf()停止自己。或是另一个组件通过stopService()去结束他。

 

如果一个组件通过bindService()去创建一个service(onStartCommand()将不会被调用,无论是否实现了)。一旦这个service

不被绑定了,系统将销毁它。

 

当系统的内存很少时,系统将会强制停止这个service,回收资源给正在系统聚焦的组件。如果这service是由系统聚焦的组件

绑定的,那么将不大可能被杀死。

 

创建各种类型的service和怎样使用他们

 

1.在manifest中描述一个service

定义的组件必须在manifest中描述

 service在manifest中的描述类似于activity,可以定intent-filter。类似于activity,另一个组件可以用startService()

启动它,如果匹配上service描述的intent-filter条件。

如果你只想本地使用的(不想被其他组件使用),那么你就不需要提供intent-filter,直接使用精确名称的intent去启动。

而且如果你的service包含android:exported的属性并且把它设置为false,你就可以让这个service私有于你的application

即使你提供了intent-filter。

2.创建一个service

组件启动service可以通过startservice()或由指定service或者包含特定信息的

intent。这个service在onstartCommand()中接收intent。

一般上,你可以继承两个类Service和IntentService去创建service

前者是所有service的基础,当你继承它时,你就为你的service创建了一个新的线程,在这个线程做所有的服务工作,因为这个service使用了你应用的主线程。你的activity表现就会变慢。

后者是前者的子类,它可以用一个工作线程去处理一次一个所有的请求,如果你的service需要同时接收多个请求你所要做的事

实现onHandleIntent(),它可以接收每个启动要求。对于多请求是最好的解决方案。

继承intentservice类只需要实现它的父类构造函数和onHandleIntent(Intent)。而且除了onbind(),其他可以重写的函数,

必须返回父类的默认对应的函数。

 

拓展service也可以实现intentservice的功能,通过在其内使用多线程。但onstartCommand()必须返回一个如下整数之一,

START_NOT_STICKY
START_STICKYSTART_REDELIVER_INTENT,它们代表不同的onstartCommand结束后的后续动作。
 

started 的service可以通过一种方式还返回启动它的组件一个结果。用户可以创建一个pendingIntent用于广播(通过getBroadcast接收),通intent传递给service,然后service可以用这个广播传递结果。

 

一旦service它可以通过Toast NotificationsStatus Bar Notifications通知用户事件。toast是在现有窗口显示一个信息,随后消失。status bar 通知可以在状态栏上提供一个提示图片,当用户点击时启动一个activity。

 

前台service是用户需要积极的注意,且当内存低时不会被系统杀死。一个前台service必须提供在状态栏的通知,除非停止或结束这个前台service,这个通知才会消失。

比如音乐播放时,就可以是前台service,在状态栏上显示曲目,当用用户点击时可以启动播放器

通过startForeground()让service工作在前台,两个参数,一个唯一定义的整数和状态栏通知。

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);

 

通过stopForeground()停止前台服务。其有一个boolean参数,表示是否同时移除状态栏通知标志。


当service绑定后,
stopService()
 或 
stopSelf()并没有实际停止service,除非unbind()它。


 

service生命周期


 

 


 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息