Android开发之Service服务

原创 2016年05月30日 12:06:36

一.什么是service
Service是Android的四大组件之一,是一种可以在后台长期运行,而且不提供任何用户接口的应用组件。即使启动了其他的应用,之前的启动的服务仍会运行。其他的非service组件可以与service绑定并交互,甚至允许多进程交互(IPC)。service应用在例如:音乐播放器可以后台的播放,可以后台下载文件和上传文件等。

二.service的两种形式

service的两种形式:启动形式、绑定形式

1.启动形式:这种形式的service如果一旦被应用组件启动(比如activity),就会一直在后台运行,即使启动他的activity被销毁了。通常情况下启动形式的service只执行单一的操作而不会返回结果给调用者。比如:service后台上传或者下载文件,当完成操作后service就应该自己停掉。

public class ServiceDemo extends Service {  
    public static final String TAG ="ServiceDemo";
    /**
     * Service创建时调用
     */
    @Override
    public void onCreate() {

        super.onCreate();

        Log.i(TAG, "ServiceDemo---------->onCreate() ");
    }
    /**
     * Service启动后会回调此方法
     */
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        Log.i(TAG, "ServiceDemo---------->onStartCommand() ");

        return super.onStartCommand(intent, flags, startId);
    }
    /**
     * Service销毁时调用
     */
    @Override
    public void onDestroy() {

        super.onDestroy();

        Log.i(TAG, "ServiceDemo---------->onDestroy() ");
    }
    /**
     * 这个是绑定服务需要用到的方法 所以启动形式service这个返回空
     */
    @Override
    public IBinder onBind(Intent intent) {

        return null;
    }
}

上述方法演示了创建了一个简单的Service方法,但是并不推荐大家创建Service时直接继承Service类。因为Service是运行在主线程中的,他不会创建一个新线程,这也就意味着,Service中不适合执行任何的耗时的操作,因为一旦你执行耗时的操作主线程就会出现“”假死“”状态会影响用户的使用体验。最好是创建一个新的线程,这样就降低了没有响应错误(ANR not Responding Error),而主线程也能专注于与用户交互。
为了方便创建启动形式的Service并且不必担心ANR ,Android提供了一个Service的拓展类:IntentService。

IntentService类会使用队列的形式将请求的Intent加入队列,然后开启一个默认的线程来处理请求,如果你连续的启动IntentService,应用程序也不会阻塞,因为它会处理完上一个请求后再请求下一个。

创建IntentService类只需要实现onHandleIntent()方法来处理请求工作。(注意在实现IntentService时必须要实现一个构造函数

public class IntentServiceDemo extends IntentService {

    public IntentServiceDemo() {
        super("IntentServiceDemo");
    }
    @Override
    protected void onHandleIntent(Intent intent) {      

    }       
}

注意:因为大多数的服务不必处理同时发生的多个请求(多线程方案很复杂并且危险),所以最好使用IntentService ,但是IntentService 毕竟是单一线程处理,每次只能处理一个。如果业务实在是需要同时处理多个请求那最好还是使用直接继承Service类。

2.绑定形式:这种形式主要是指应用组件通过调用bindService()方法来绑定Service。绑定形式的service会提供一个允许应用组件与Service 交互的“”客户端–服务“”的接口,通过这个接口应用组件可以对service发送请求,获取结果,甚至还能跨进程通信(IPC)。绑定形式的service运行时间与绑定它的组件一致。多个组件可以一次性的绑定到service,但是当这些组件都取消绑定,这个service也就销毁了。

其实绑定形式 的service的核心就是IBinder ,当访问者访问service时,service会返回给访问者一个IBinder对象,访问者拿着这个IBinder对象 去获取service中相应的方法

public class BindService extends Service {

    private IBinder iBinder = new LocalBinder();

    public class LocalBinder extends Binder {

        public BindService getService() {

            return BindService.this;
        }
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    @Override
    public IBinder onBind(Intent intent) {

        return iBinder;
    }
}

可能大家会发现启动形式Service和绑定形式的Service,同样继承Service类只是相差了返回的一个iBinder,只要这些区别,但是还是有很多的区别。

三.service的生命周期

这里写图片描述
左边的是启动形式的,右边的是绑定形式的生命周期的函数是不一样的。

启动形式的Service的真正的活动中(有效寿命)是从onStartCommand方法开始的,之后需要调用stopService 或者stopSelf方法来停止该Service。
绑定形式的Service的真正的活动中(有效寿命)是从onBind 方法开始的,直到所有的组件都调用onUnbind方法,停止该service。

四.service小例子

在AndroidMainifest.xml中声明我们要用到service。

启动形式service

public class MainActivity extends ActionBarActivity {
    private Button mService;
    private Button mStartIntentService;
    private Button mStopIntentService;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mService = (Button) findViewById(R.id.mService);
        mStartIntentService = (Button) findViewById(R.id.mStartIntentService);
        mStopIntentService = (Button) findViewById(R.id.mStopIntentService);

        mStartIntentService.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(MainActivity.this, IntentServiceDemo.class);
                startService(i);
            }
        });
        mStopIntentService.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(MainActivity.this, IntentServiceDemo.class);
                stopService(i);
            }
        });
        mService.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(MainActivity.this, ServiceDemo.class);
                startService(i);
            }
        });
    }
}

绑定形式的service:

mService.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent i = new Intent(MainActivity.this, BindService.class);

            bindService(i, serviceConnection, Context.BIND_AUTO_CREATE);
        }
});

private ServiceConnection serviceConnection = new ServiceConnection() {
        //当我们调用unbindService 方法时,会调用onServiceDisconnected方法,将service对象置为空
        //;调用bindService方法时,会调用onServiceConnected方法获取service对象
        @Override
        public void onServiceDisconnected(ComponentName name) {

        }

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {

        }
};
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

android开发中Service启动BroadastService监听系统剪切板服务

近来做项目时,突然想到,能不能做点坏事呢。。。啧啧,感觉蛮有意思!!!然后想着通过android的service服务,不停截取用户的剪切板服务,获取用户剪切内容,实现起来很简单,勿喷!!!     ...

android开发 - Service服务

Service没有UI,因为service是后台运行 如:下载,网络I/O 等等 Service的生命周期     从它被创建开始,到它被销毁为止,     onCre...

Android开发学习之路-- 关于服务Service

开启服务: Intent intent = new Intent(this,MyService.class); startService(intent); 关闭服务: Intent intent = ...
  • Ace_312
  • Ace_312
  • 2016年08月02日 19:27
  • 158

Android开发之 Service后台服务进程的守护

Service组件在android开发中经常遇到,其经常作为后台服务,需要始终保持运行,负责处理一些必要(见不得人)的任务。而一些安全软件,如360等,会有结束进程的功能,如果不做Service的保持...

Android开发指南----Service(服务)

英文原文:http://developer.android.com/guide/topics/fundamentals/services.html o 服务能在后台运行,这样即使用户不在当前应...

Android开发_Service服务相关

Hello,我是杨焕州,你没听错,传说中的杨焕州就是我啦!——QQ:804212028 原文链接 主题:Service服务相关内容 -Android开发中Service服务是非常重要滴,也是有一...

Android开发之如何监听让服务不被杀死(service+broadcast)

转自:http://blog.csdn.net/mad1989/article/details/22492519  最近项目要实现这样一个效果:运行后,要有一个service始终保持...

Android开发中后台的Service服务探索

最近在编写一个基于Android 2.1 的手机应用程序,其中的一个功能是利用Google 的地图API接口实现足迹追踪,整个程序设计大概分为三个部分,UI设计、GoogleMapAPI接口调用以及后...

Android开发之Service服务详解

服务,作为Android四大组件之一,必然是重点。我们今天就来讲解一下有关服务的生命周期、两种开启方式以及相关用法。 服务有两种开启方式,一种是正常开启, 一种是以绑定的方式开启,当然,这两种方式可...

Android开发之如何保证Service不被杀掉(前台服务)

序言     最近项目要实现这样一个效果:运行后,要有一个service始终保持在后台运行,不管用户作出什么操作,都要保证service不被kill。参考了现今各种定制版的系统和安全厂商牛虻软件...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android开发之Service服务
举报原因:
原因补充:

(最多只允许输入30个字)