心中畏惧的service(一)

可能很多人都不解这个题目,我就先说下原因吧!
做android开发也快两年了,service这个东西我一直是介于陌生和熟悉之间吧!开发的时候也用到service,都是随便去网上找些资料,实现功能了也就不再深究了;可是最近的一次面试让我很不舒服,被问到service和activity的交换问题时,我只能凭着印象回答了他的问题!结果可想而知,我明明使用过service而且也做过service与activity的数据交互问题,但是我却没有回答上来!
上面就是促使我写这篇service的原因,要仔细的了解下这个让我产生畏惧的东西!如果正好能帮助某些人的话,那就很高兴了!

被问到的关键的问题有:
  1.     怎么样才能保证service不被关闭?
  2.     service和activity是怎么传递数据的?

当然了还有关于service的一些基本知识的问题,这里我就不一一列举了;并不是不重要而且那些都是你必须掌握的,否则你没有办法很好的使用
service;比如:1、怎么启动service? 2、service的生命周期?

首先来了解下service:
    1、service的分类:本地service和远程service;
         本地service和远程service的最基本的区别就是:是否依附于应用的主进程。
我们平常所说的service都是本地线程,都是通过在应用中startService()和bindService()来启动service的,本地服务和应用在同一个进程中,你可以通过正在运行的服务中查看;而远程service的调用则是通过AIDL来实现调用的,大概的意思就是从一个应用(A)调用另一个应用(B)的服务,并且B的服务也允许其他应用调用,提供AIDL接口供别的应用使用;我们知道android为每个应用都提供一个独立的进程, 也就是说应用A和应用B不在一个进程中,所以远程service和应用不在同一个进程中。
    2、service的生命周期:
        service的生命周期根据调用方式的不同周期也不同:
        a、使用startService()方法启动Service的生命周期:
              其生命周期为startService() ->onCreate()- >  onStartCommand ()->(onStart()->)Service running-->context.stopService() | ->onDestroy() ->Service stop
            如果Service还没有运行,则android先调用onCreate()然后调用 onStartCommand ();
            如果Service已经运行,则只调用 onStartCommand (),所以一个Service的 onStartCommand 方法可能会重复调用多次。 

            stopService的时候直接onDestroy, 如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。              该Service的调用者再启动起来后可以通过stopService关闭Service。

            所以调用startService的生命周期为:onCreate -->  onStartCommand (可多次调用) -->(onStart()->)onDestroy

            这里要说下:android2.0及以前的版本都是使用onStart()方法并没有onStartCommand()方法,但是在android2.0以后的版本都是使用onStartCommand()方法代替了,但是onStart()方法还是存在的;如果我们没有重写onStartCommand()方法的话,onStart()方法是会被调用的,还是会执行;如果我们重写了onStartCommand()方法的话,onStart()方法就不会被调用;为什么要用onStartCommand()来替代onStart()由于篇幅问题我会在下一篇中介绍下。
        b、使用bindService()方法启动service的生命周期:
              bindService()->onCreate()->onBind()->Service running-->onUnbind() -> onDestroy() ->Service stop

   onBind将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service运行的状态或其他操作。
   这个时候把调用者(Context,例如Activity)会和Service绑定在一起,Context退出了, Srevice就会调用onUnbind->onDestroy相      应退出,这里是自动的即使你不调用onUnbind也会退出。 

   所以调用bindService的生命周期为:onCreate --> onBind(只一次,不可多次绑定) --> onUnbind --> onDestory。

   一但销毁activity它就结束,如果按home把它放到后台,那他就不退出。

service代码:

public class MyService extends Service {

	private String TAG = "MyService";
	
	@Override
	public IBinder onBind(Intent intent) {
		Log.d(TAG, "----------------onBind()----------------");
		return null;
	}

	@Override
	public void onCreate() {
		super.onCreate();
		Log.d(TAG, "----------------onCreate()----------------");
	}

	@Override
	@Deprecated
	public void onStart(Intent intent, int startId) {
		super.onStart(intent, startId);
		Log.d(TAG, "----------------onStart()----------------");
	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		Log.d(TAG, "----------------onStartCommand()----------------");
		return super.onStartCommand(intent, flags, startId);
	}

	@Override
	public void onDestroy() {
		Log.d(TAG, "----------------onDestroy()----------------");
		super.onDestroy();
	}

	@Override
	public boolean onUnbind(Intent intent) {
		Log.d(TAG, "----------------onUnbind()----------------");
		return super.onUnbind(intent);
	}
	
}

当我使用onstartService()方法启动时打印的log为:


第二次调用onstartService()方法时:

发现没有再次调用onCreate()方法,只是重新调用了一次onStartCommand()和onStart();请注意当重写了onStartCommand()方法之后,只调用onStartCommand()而不会调用onStart();

现在我修改一下代码,重新onstartCommand()方法:

@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		Log.d(TAG, "----------------onStartCommand()----------------");
		return START_REDELIVER_INTENT;
	}

看下效果:


和第一次使用startService()相比就少了onStart()方法;

现在来看下调用stopService()方法所打印出来的log:

Intent serviceIt3 = new Intent(MainActivity.this, MyService.class);
			mContext.stopService(serviceIt3);


只打印了onDestroy()方法,说明service销毁成功了!

(以上为纯手工,有错的地方请通知我,我尽快改进;所有资料都是在网上查找的,如果涉及到你的版权问题,请通知我,我给你加注释啊!)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值