Android Service使用简单介绍

作为一个android初学者,经常对service的使用感到困惑。今天结合Google API 对Service这四大组件之一,进行简单使用说明。

希望对和我一样的初学者有帮助,如有不对的地方,也希望及时指出。

Service :就是长时间运行在后台,没有用户界面的一个应用组件。即便,用户切换到其他的应用,Service依然可以在后台运行。

除此之外,一个组件可以将自己和Service进行绑定,甚至是进程间通信。例如,Service可以处理网络请求,播放音乐,

处理I/O操作,和Content provider进行交互。

上述是API 对Service的介绍,简单来说,Service就是可以长时间运行在后台,不需要界面的一个组件。

Service的存在形式,也就是启动方式有两种。需要通过Intent启动。

1,Stared(启动)   组件通过调用startService()启动Service,即便组件被销毁,Service依然可以在后台运行。调用stopService(),stopSelf()销毁Service。

startService( serviceIntent); stopService( serviceIntent);

2,Bound(绑定)   组件通过调用bindService ()和Service进行绑定启动。Service执行onBind()。通过unbindService()将Service和组件进行解绑。

解绑时,Service执行onUnbind(),若此时没有任何组件和Service存在绑定关系,会接着执行onDestroy();

绑定启动的Service提供了client-server(IBinder通信机制),使得组件和service之间可以进行交互。

多个组件可以和一个service进行绑定,当所有组件都解绑的时候,service执行onDetroy()被销毁。

public abstract boolean bindService (Intent service, ServiceConnection conn,

int flags);

   public abstract void unbindService(ServiceConnection conn);

通过Bound方式进行启动的时候,需要创建ServiceConnetction,并重写onServiceDisconnected,onServiceConnected方法,这就是Service

提供的client-server(IBinder通信)。

   private ServiceConnection connection = new ServiceConnection() {

@Override

public void onServiceDisconnected(ComponentName arg0) {

Log. e(TAG, "onServiceDisconnected");

}

@Override

public void onServiceConnected(ComponentName arg0, IBinder service) {

Log. e(TAG, "onServiceConnected");

MyService   mService =  ((MyService.MyBinder)service).getService();

}

};

在Service中的onBind()方法中,要返回一个Binder。Binder可以自定义。例如:

public    IBinder myBinder = new MyBinder();

@Override

public IBinder onBind(Intent arg0) {

// TODO Auto-generated method stub

Log. e(TAG, "onBind");

return myBinder ;

}

      public class  MyBinder extends Binder{

public    TestService getService(){

return TestService. this;

}

}

在onBind()中返回的这个Binder,可以在onServiceConnected()中拿到,这样就可以拿到Service对象,并对其操作。

MyService   mService =  ((MyService.MyBinder)service).getService();

**关于IBinder的通信机制,可以深入研究下。

##Service可以被启动多次,也可以被绑定多次,也可以既绑定,也启动。

## Service默认情况下,是存在于主进程的主线程(UI线程)中,Service不会自己创建新的自己的线程,也不会运行在不同的进程。除非对service进行特别声明。

这就意味着,如果在service中进行一些耗时或者复杂密集的操作时,应该放到线程中去做。

## Service如果被started方式启动,又被Bound方式启动,此时调用stopService()是不能够销毁掉Service,只有当Unbind()掉所有的绑定,才能执行Service的onDestroy();

## Service和Activity组件一样,使用的时候需要在manifest中进行声明设定。可以将Service设定成私有的,或者增加intent filter等设定参数。

OK,Service启动后,再来关注下它的生命周期。

第一种方式:startService()

onCreate()                         创建Service,此回调方法只会执行一次。Service多次启动并不会多次创建。

onStartCommand()           每次startService()都会执行。如下图,创建Service后执行此方法。启动Service的时候可以通过Intent传递数据。在此方法中进行处理。

onDestroy()                     调用stopService() stopSelf() 或者Unbind()后,执行此方法,Service进行销毁。

第二种方式 bindService()

onCreate()                      创建Service,此回调方法只会执行一次。Service多次启动并不会多次创建。

onBind()                         绑定Service,并回调Ibinder.

onUnbind()                     解除绑定

onDestroy()                    销毁

**关于onStartCommand()返回值的说明:

START_NOT_STICKY
系统将Service杀死之后,不重新创建Service。除非有pending intents 传过来要重新启动Service.
START_STICKY
系统将Service杀死之后,重新创建Service并执行onstartCommand(),但是不传递最后的Intent,而是系统会在重新执行onStartCommand()时们传入一个空的intent.
START_REDELIVER_INTENT
系统将Service杀死之后,重新创建Service并执行onstartCommand().传入最后接收的intent.

IntendService

android  中还有一个class,IntentService.

public abstract class IntentService extends Service {

private volatile Looper mServiceLooper;

private volatile ServiceHandler mServiceHandler;

从源码中可以看到,IntentService继承自Service,而且有自己的looper和handler。

Google Api 中说:

The IntentService does the following:

  • Creates a default worker thread that executes all intents delivered to onStartCommand() separate from your application‘s main thread.
  • Creates a work queue that passes one intent at a time to your onHandleIntent() implementation, so you never have to worry about multi-threading.
  • Stops the service after all start requests have been handled, so you never have to call stopSelf().
  • Provides default implementation of onBind() that returns null.
  • Provides a default implementation of onStartCommand() that sends the intent to the work queue and then to your onHandleIntent() implementation.

IntentService 主要作用:

自己管理一个工作消息序列,同一时刻只有一个任务会被执行,也就是说它不支持多任务并发处理。

不需要调用stopSelf来停止Service,当没有任务执行的时候,会自己停止。使用的时候,只需要实现onHandleIntent()

@Override

protected void onHandleIntent(Intent intend) {

// TODO Auto-generated method stub

}

**经常看到有人问,怎么保证Service不被杀死。个人认为,不被杀死,从两点考虑。

1.提高优先级

2.杀死后再重启

提高Service优先级,可以使用setForeground(true),将Service变为前台运行。

在onStartCommand()中使用回调返回值,使得Service杀死后再重启。

还看到有大神说创建守护进程,在service被杀死后重启。这个我不是很了解。

关于Service的介绍就是这些,深入的东西,我也不是很懂。写的有点乱。欢迎大家批评指正,互相学习,求大神教育。

我的qq:1921991896

时间: 2024-10-14 18:23:59

Android Service使用简单介绍的相关文章

android MVP模式简单介绍

原文 http://zhengxiaopeng.com/2015/02/06/Android%E4%B8%AD%E7%9A%84MVP/ 前言 MVP作为一种MVC的演化版本在Android开发中受到了越来越多的关注,但在项目开发中选择一种这样的软件设计模式需保持慎重心态,一旦确定 使用MVP作为你App的开发模式那么你就最好坚持做下去,如果在使用MVP模式开发过程中发现问题而且坑越来越大,这时你想用MVC等来重新设计的话基 本上就等于推倒重来了.要知道在Android上MVP在现在为止并没有统

android之PackageManager简单介绍

PackageManager相关 本类API是对全部基于载入信息的数据结构的封装,包含下面功能: 安装,卸载应用查询permission相关信息 查询Application相关信息(application,activity,receiver,service,provider及对应属性等) 查询已安装应用 添加?,删除permission 清除用户数据.缓存,代码段等 /** * PackageManager介绍: * 本类API是对全部基于载入信息的数据结构的封装,包含下面功能: * 安装,卸载

Android开发布局简单介绍

Android开发布局介绍 1.线性布局 LinearLayout 布局中的组件会一个挨着一个排列起来,android:orientation属性可以控制排列方向,horizontal-水平.vertical-垂直 线性布局不会自动换行,当超出屏幕范围时,剩下的组件不会显示出来. 2.表格布局 TableLayout 继承自LinearLayout,其本质依然是LinearLayout.通过TableRow来管理表格的行数和列数.添加一个TableRow就是一行. 3.帧布局 FrameLayo

android application类简单介绍(一)

每次应用程序执行时.应用程序的application类保持实例化的状态. 通过扩展applicaiton类,能够完毕下面3项工作: 1.对android执行时广播的应用程序级事件如低低内做出响应. 2.在应用程序组件之间传递对象(全局变量). 3.管理和维护多个应用程序组件使用的资源. 当中,后两项工作通过使用单例类来完毕会更好.application会在创建应用程序进程的时候实例化. 以下是扩展Application的演示样例代码: import android.app.Application

Android MVP模式简单介绍:以一个登陆流程为例

老的项目用的MVC的模式,最近完成了全部重构成MVP模式的工作,虽然比较麻烦,好处是代码逻辑更加清楚.简洁,流程更加清晰,对于后续版本迭代维护都挺方便.对于一些想要学习MVP模式的同学来讲,百度搜出来的好多都没法直接转化为项目里可以直接用的东西,所以这里正好拿出自己项目里已经用了的,你们可以直接用到自己的项目里.当然,不可能把所有项目代码在这里放出来,所以就拿登陆的流程出来,这个比较合适也比较常用. 1.先看下包结构: model:放一些bean类,以及网络处理类RetrofitManager,

Android:(本地、可通信的、前台、远程)Service使用全面介绍

前言 Service作为Android四大组件之一,应用非常广泛 本文将介绍Service最基础的知识:Service的生命周期 如果你对Service还未了解,建议先阅读我写的文章: Android四大组件:Service史上最全面解析 目录 1. Service分类 1.1 Service的类型 1.2 特点 2.具体使用解析 2.1 本地Service 这是最普通.最常用的后台服务Service. 2.1.1 使用步骤 步骤1:新建子类继承Service类 需重写父类的onCreate()

Android——DDMS简单介绍

DDMS 的全称是Dalvik Debug Monitor Service,是 Android 开发环境中的Dalvik虚拟机调试监控服务. 它为我们提供例如:为测试设备截屏,针对特定的进程查看正在运行的线程以及堆信息.Logcat.广播状态信息.模拟电话呼叫.接收SMS.虚拟地理坐标等等. 一,切换DDMS视图 在左侧的Devices中,可以看到正在运行的虚拟设备. 二,DDMS各个菜单简单介绍 Debug Process 断点调试程序: 个人总结断点调试程序有2种情况.1.eclipse中的

Android开发自学笔记(Android Studio)—4.界面编程与View组件简单介绍

一.引言 Android应用开发最重要的一份内容就是界面的开发,无论你程序包含的内容多么优秀,如若没有一个良好的用户交互界面,最终也只是会被用户所遗弃.Android SDK提供了大量功能丰富的UI组件,开发者只需要拖拖拽拽就能完成简单的应用,这些只是界面的展示,如果要完成优秀的用户交互,事件响应机制当然也是重点,这是后话. Android SDK中绝大部分UI组件都在androd.widget及其子包.android.view及其子包下,Android应用中的所有UI组件都继承了View类,V

Android中Intent具体解释(二)之使用Intent广播事件及Broadcast Receiver简单介绍

通过第一篇的解说,我们已经看到了怎样使用Intent来启动新的应用程序组件,可是实际上他们也能够使用sendBroadcast方法来在组件间匿名的广播消息. 作为一个系统级别的消息传递机制,Intent能够在进程之间发送结构化的消息. 因此,通过实现Broadcast Receiver来监听和响应应用程序内的这些Broadcast Intent. 通过使用Intent来广播一个事件,能够在不改动原始的应用程序的情况下.让我们开发者对事件做出反应.Android大量使用了Broadcast Rec