可能很多人都不解这个题目,我就先说下原因吧!
做android开发也快两年了,service这个东西我一直是介于陌生和熟悉之间吧!开发的时候也用到service,都是随便去网上找些资料,实现功能了也就不再深究了;可是最近的一次面试让我很不舒服,被问到service和activity的交换问题时,我只能凭着印象回答了他的问题!结果可想而知,我明明使用过service而且也做过service与activity的数据交互问题,但是我却没有回答上来!
上面就是促使我写这篇service的原因,要仔细的了解下这个让我产生畏惧的东西!如果正好能帮助某些人的话,那就很高兴了!
被问到的关键的问题有:
- 怎么样才能保证service不被关闭?
- 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 方法可能会重复调用多次。
所以调用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销毁成功了!
(以上为纯手工,有错的地方请通知我,我尽快改进;所有资料都是在网上查找的,如果涉及到你的版权问题,请通知我,我给你加注释啊!)