作为一个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  

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

  1. javascript开发 ios和android app的简单介绍

    先看几个名词解释: nodejs ionic,Cordova,phoneGap,anjularjs react-native,reactjs nodeJs 的介绍参见这里,写的很好http://www ...

  2. android之PackageManager简单介绍

    PackageManager相关 本类API是对全部基于载入信息的数据结构的封装,包含下面功能: 安装,卸载应用查询permission相关信息 查询Application相关信息(applicati ...

  3. android Service 的简单使用(转)

    1.要使用Service,首先就是在配置文件里吗添加Service,如果不填加,你的Service是不能够使用的.目前学到的方法有两种    方法一:<service android:enabl ...

  4. android MVP模式简单介绍

    原文 http://zhengxiaopeng.com/2015/02/06/Android%E4%B8%AD%E7%9A%84MVP/ 前言 MVP作为一种MVC的演化版本在Android开发中受到 ...

  5. Android 使用 Application 简单介绍

    Application 配置全局Context 第一步.写一个全局的单例模式的MyApplication继承自Application 覆盖onCreate ,在这个方法里面实例化Application ...

  6. android handler机制简单介绍

    我们需要了解4个类: handler:处理者,用于发送和接收信息 massage:消息.里面可以存储消息的许多信息 looper:循环泵,用于循环取出消息队列中的消息 MessageQueue(一般不 ...

  7. Android ExpandableListActivity的简单介绍及小例子

    Android中常常要用到ListView,但也经常要用到ExpandableListView,ListView是显示列表,而ExpandableListView显示的是分类的列表: 下面用一个例子来 ...

  8. android application类简单介绍(一)

    每次应用程序执行时.应用程序的application类保持实例化的状态. 通过扩展applicaiton类,能够完毕下面3项工作: 1.对android执行时广播的应用程序级事件如低低内做出响应. 2 ...

  9. Android MediaScanner使用简单介绍

    1. 运行扫描 仅仅有系统开机的时候才会运行MediaScanner,其他情景下须要手动运行扫描(拍摄,下载等). 手动运行扫描的方法是发送MediaScanner广播: 1.1 扫描指定文件: In ...

随机推荐

  1. 大家好,请问在DELPHI中#13和#10是表示什么含义的?

    #13: 表示"回车"#10: 表示"换行" ASCII码    Delphi字符     C程序      含义-------    ----------     -----     ------  ...

  2. adb使用过程常见的几种错误总结

    问题1:Failure [INSTALL_FAILED_ALREADY_EXISTS] 问题原因:该程序已存在. 解决方法:增加-r参数,即可成功覆盖安装 问题2:Failure [INSTALL_F ...

  3. HDU4790_Just Random

    这个题目我只能说我一看就知道是这么做的,但是由于实现能力略水,Wa了3发. 题意为给你两个区间[a,b]和[c,d],两个区间分别任取一个数,现在要你求出这个数模p的值为m的概率有多大. 其实是这么做 ...

  4. 树状数组模板(pascal) 洛谷P3374 【模板】树状数组1

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. ...

  5. shell的tr命令

    tr,translate的简写,即翻译的意思.主要用来从标准输入中通过替换或删除操作进行字符转换.只接受标准输入,不接受文件参数. 命令语法: tr [–c/d/s/t] [SET1] [SET2] ...

  6. 转:python的nltk中文使用和学习资料汇总帮你入门提高

    python的nltk中文使用和学习资料汇总帮你入门提高 转:http://blog.csdn.net/huyoo/article/details/12188573 nltk的安装 nltk初步使用入 ...

  7. bzoj3143: [Hnoi2013]游走(贪心+高斯消元)

    考虑让总期望最小,那么就是期望经过次数越多的边贪心地给它越小的编号. 怎么求每条边的期望经过次数呢?边不大好算,我们考虑计算每个点的期望经过次数f[x],那么一条边的期望经过次数就是f[x]/d[x] ...

  8. [学习笔记]矩阵乘法及其优化dp

    1.定义: $c[i][j]=\sum a[i][k]\times b[k][j]$ 所以矩阵乘法有条件,(n*m)*(m*p)=n*p 即第一个矩阵的列数等于第二个矩阵的行数,否则没有意义. 2.结 ...

  9. 【hash】【P5079】P5079 Tweetuzki 爱伊图

    Description Input 第一行两个正整数 \(r~,~c\),表示矩阵的行数和列数. 接下来 \(r\) 行,每行输入 \(c\) 个字符,用空格隔开,保证只含有 . 和 # 两种字符.输 ...

  10. Python之旅:数字、字符串

    一 数字 整型与浮点型 #整型int 作用:年纪,等级,身份证号,qq号等整型数字相关 定义: age=10 #本质age=int(10) #浮点型float 作用:薪资,身高,体重,体质参数等浮点数 ...