转载地址:http://www.cnblogs.com/zhangdongzi/archive/2012/01/08/2316711.html

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

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()会先加载它。
提供给可被其他应用复用,比如定义一个天气预报服务,提供与其他应用调用即可。

那么先来看Service的生命周期吧:如图:

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

context.bindService()->onCreate()->onBind()->Service running--调用>onUnbind() -> onDestroy() 从上诉可以知道分别对应本地的,,以及远程的,也对应不同的方式启动这个服务。

二.实战

我们可以定义一个本地服务继承Service,然后在这个服务里播放媒体播放器或者记录地理位置变化。通常有时候我们的Service要与Activity交互,那么可以可以定义一个内部类,返回这个Service,当然我们要考虑到如果是以绑定方式启动服务,那么内部类可以定义为继承Binder,然后返回本地服务,具体代码如下。

package com.dongzi;import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;public class LocalService extends Service {private static final String TAG = "LocalService"; private IBinder binder=new LocalService.LocalBinder();@Overridepublic IBinder onBind(Intent intent) {return binder;}MediaPlayer mediaPlayer=null;@Override public void onCreate() { Log.i(TAG, "onCreate"); //这里可以启动媒体播放器// if(mediaPlayer==null)//     mediaPlayer=MediaPlayer.create(this, uri);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(); } //定义内容类继承Binderpublic class LocalBinder extends Binder{//返回本地服务
        LocalService getService(){return LocalService.this;}}}

我们可以从上面知道

//定义内容类继承Binder
    public class LocalBinder extends Binder{
        //返回本地服务
        LocalService getService(){
            return LocalService.this;
        }
    }

可以返回这个服务,然后activity可以通过服务调用服务的方法了。

那么如何启动服务呢?从上面基础知识中,我们知道有2种方法,如下:

 //启动服务private void startCustomService(){Intent intent=new Intent(this,LocalService.class);startService(intent);

第2种绑定方式:

LocalService localService=null;//用bindService方法启动服务private void BinderService(){Intent intent=new Intent(this,LocalService.class);bindService(intent, new ServiceConnection(){@Overridepublic void onServiceConnected(ComponentName componentName, IBinder binder) {//调用bindService方法启动服务时候,如果服务需要与activity交互,//则通过onBind方法返回IBinder并返回当前本地服务localService=((LocalService.LocalBinder)binder).getService();//这里可以提示用户,或者调用服务的某些方法
            }@Overridepublic void onServiceDisconnected(ComponentName componentName) {localService=null;//这里可以提示用户
            }     }, Context.BIND_AUTO_CREATE);}

在绑定服务的时候,需要一个服务连接对象,ServiceConnection,服务一旦连接,就会调用onServiceConnected方法,我们可以在这个方法里面返回我们的本地服务对象,具体看代码;而在服务断开时候会调用onServiceDisconnected方法,我们可以清理一些服务资源。

接下来,我们会讲解一些AIDL的一些知识。这些与服务息息相关。

转载于:https://www.cnblogs.com/songyao/p/4142026.html

Android服务之Service(其一)相关推荐

  1. Android 服务类Service 的详细学习

    http://blog.csdn.net/vipzjyno1/article/details/26004831 Android服务类Service学习四大组建 目录(?)[+] 什么是服务 服务有什么 ...

  2. Android 服务(Service)

    一.服务的解释 服务(Service)是Android中实现后台运行的解决方案,它适合那些去执行不需要和用户交互而且还要求长期运行的任务.服务的运行不依赖任何的与任何用户界面,即使程序被切换到后台,或 ...

  3. Android服务之Service(四)--ASDL传递复杂数据对象

    此实例与前面aidl不同之处在于,传递的数据比较复杂,传递了自定义数据对象,本实例使用到了两个数据对象Person和Pet,其中Person是作为远程调用Service传递的参数,Pet是远程Serv ...

  4. android 粘性service,Android服务1 Service

    四大组件全部要注册 Service特点:用于在后台耗时操作 1. public class MyService extends Service { public IBinder onBind(Inte ...

  5. android服务程序开发,android 服务(service)开发

    一.通过startService方式启动的服务:(后台处理工作),只能通过intent传递参数,但不能与Activity交互. 服务不能自己启动,需要通过其他的应用程序调用才能启动. 启动服务的应用, ...

  6. android必须服务,说说在Android如何使用服务(Service)的方法

    Android 服务(Service)适合执行那些不需要和用户交互而且还要求长期运行的任务. 服务的运行不依赖于任何用户界面,即使 APP 被切换到后台,或者打开了另外一个 APP,服务仍然能够保持正 ...

  7. Android 编程下的四大组件之服务(Service)

    服务(Service) 是一种在后台运行,没有界面的组件,由其他组件调用开始.Android 中的服务和 Windows 中的服务是类似的东西,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类 ...

  8. android服务无法启动,Android服务无法启动(Android service would't start)

    Android服务无法启动(Android service would't start) 我正在尝试在Android中实现简单的服务,但我无法统计基本服务. 这是我的主要课程: import java ...

  9. android服务常驻内存,android service常驻内存的一点思考

    我们总是不想自己的Android service被系统清理,以前时候大家最常用的办法就是在JNI里面fork出子进程,然后监视 service进程状态,被系统杀死了就重启它. 我分别在android4 ...

最新文章

  1. python max()_Python Decimal max()用法及代码示例
  2. 栈判断字符串是否为中心对称_数据结构和算法入门之判断括号字符串的合法性(valid parentheses)...
  3. 安装Kerberos服务端和客户端
  4. Vmware15的安装(ps解决:重装Vmware出现无法安装服务Vmware Authorization Service)
  5. CocoaPods did not set the base configuration of your project 问题解决方案
  6. Flink的异步I/O及Future和CompletableFuture
  7. Python | 这是过七夕吗?这是趁机学习一下下,就一下~~
  8. 马斯克谈买比特币:当法币实际利率为负时 只有“傻子”才不放眼他处
  9. 一致性Hash简单介绍和使用
  10. docker-compose 安装mongodb集群==多台服务器
  11. iPhone开发知识和项目
  12. python第二课知识点总结
  13. TPC,TPCC,TPMC(计算机性能衡量指标)
  14. 初步搭建 prometheus+ Grafana服务器性能监控平台
  15. python table类中的 可以作为初步观察工具_《趣学Python编程》习题总结
  16. [LeetCode] 969. 煎饼排序
  17. java在线编译器_java在线编译器-youjavait.com
  18. wpf实现类似word文档的标尺功能
  19. excel查重技巧:如何用组合函数快速统计重复数据(上)
  20. php7安装详解(windows环境)

热门文章

  1. ArcGIS在线资源集
  2. 图解NHibernate项目框架
  3. [Codeforces741D]Arpa's letter-marked tree and Mehrdad's Dokhtar-kosh paths——dsu on tree
  4. nginx安装和基础代理配置
  5. 2、Python连接Mysql数据库。
  6. HDU 1693(状态压缩 插头DP)
  7. 计算神经网络隐藏层节点数极小值
  8. img 隐藏_CSS3界面样式和溢出文字隐藏overflow
  9. 【控制】二阶 UGV 的 时间-输入 指标性能最优解算
  10. TCL with SNPS - get_object_namesizeof_collectionstring