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

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

2012-09-15 12:30 344 查看
同事问起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";

@Override
public 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"); //在程序汇总启动该service
startService(i);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: