【Android学习系列】Android- Service总结

来源:互联网 发布:监控录像播放软件 编辑:程序博客网 时间:2024/05/16 04:44

同事问起Service的相关概念,也觉的自己有点模模糊糊,本身并有在项目中实际用到过,于是写个小Demo,对这个Service进行下小小的总结,以免总是忘记。

【基础】

android中服务是运行在后台的东西,级别与activity差不多。既然说service是运行在后台的服务,那么它就是不可见的,没有界面的东西。你可以启动一个服务Service来播放音乐,或者记录你地理信息位置的改变,或者启动一个服务来运行并一直监听某种动作。


服务一般分为两种:
1:本地服务, Local Service 用于应用程序内部。在Service可以调用Context.startService()启动,调用Context.stopService()结束。在内部可以调用Service.stopSelf() 或 Service.stopSelfResult()来自己停止。无论调用了多少次startService(),都只需调用一次stopService()来停止。

2:远程服务, Remote Service 用于android系统内部的应用程序之间。可以定义接口并把接口暴露出来,以便其他应用进行操作。客户端建立到服务对象的连接,并通过那个连接来调用服务。调用Context.bindService()方法建立连接,并启动,以调用 Context.unbindService()关闭连接。多个客户端可以绑定至同一个服务。如果服务此时还没有加载,bindService()会先加载它。

提供给可被其他应用复用,比如定义一个天气预报服务,提供与其他应用调用即可。

context.startService() ->onCreate()- >onStart()->Service running--调用context.stopService() ->onDestroy()

context.bindService()->onCreate()->onBind()->Service running--调用>onUnbind() -> onDestroy()

参考文章:http://www.cnblogs.com/zhangdongzi/archive/2012/01/08/2316711.html

【笔者注】其实所谓的远程和进程,只是按照service的不同应用场景来分的,并没有这种概念。而其创建的两种方式,倒是有其一定的特殊性。


【例子程序】

1. 最简单的例子程序:两个button,分别启动和停止service。

UI的布局就不贴了,放上两个button就行。

先看service类。

public class LocalService extends Service{private static String TAG  = "LocalService";@Overridepublic IBinder onBind(Intent intent){// 为了回调的需要,暂时保留return null;}public void onCreate() {         Log.i(TAG, "onCreate");         super.onCreate(); } @Override public void onStart(Intent intent, int startId) {         Log.i(TAG, "onStart");         super.onStart(intent, startId); } @Override public int onStartCommand(Intent intent, int flags, int startId) {       Log.i(TAG, "onStartCommand");     return START_STICKY;}@Override public void onDestroy(){Log.i(TAG, "onDestroy");super.onDestroy(); } }

程序中,onBind方法,是为了回调的需要,比如UI层想要call service中的一些方法时,就可以通过它来传递相关的信息(有待验证)。

1. 这里有点奇怪,service生命周期中的onStart是什么时候调用呢?

2. 出现个error: 09-15 04:16:50.816: E/Trace(779): error opening trace file: No such file or directory 不影响程序运行。


启动和结束service的code:

Intent intent  = new Intent(this,LocalService.class);MainActivity.this.startService(intent);MainActivity.this.stopService(intent);

还有另外一种方式:

<service android:name=".localityservice.MusicPlayerService">  //在Manifest中先进行注册<intent-filter><action android:name="com.yang.music" />  //标明只有该名字的intent才可以call它</intent-filter></service>Intent i = new Intent("com.yang.music"); //在程序汇总启动该servicestartService(i);