Android Service 深度解析(1)

Android Service 深度解析(1)

这段时间我重新对Android基础进行了学习,还是先从官方文档开始,做了关于Service的文档翻译,熟悉了关于Service的知识点。但是在用的时候还是有很多需要注意的地方,需要把这些知识点联系起来,因此有了这篇文章。我将主要从以下几个方面对Service类进行深度解析: 1、 Service的生命周期(看起来简单,实际上很复杂的); 2、 绑定运行Service(Bound Service)的多种形式实现及其使用; 主要包括本地Service继承Binder类的实现、远程Service使用Messenger实现、远程Service的AIDL方式实现。(本来打算这篇一起写,篇幅太长,作为两篇吧) 如果您有兴趣继续阅读下去,但是您对Service的基础还不怎么熟悉的话,建议您先阅读以下三篇我对官方文档的翻译: Service API文档 翻译: Services 综合介绍 : Bound Service 以绑定方式运行的Service : *Service的生命周期* 虽然Service在它的生命周期中涉及到的方法一共只有onCreate、onStartCommand、onBind、onUnbind、onDestory这几个,但是由于Service拥有两种运行方式,而且可以实现同时为多个客户端服务,支持跨进程,使得它的运行时状态真的很难让人清楚地掌握。而官方给的这个图也很难将Service的生命周期详细地表述。

为了好好把握Service在不同状态下的运行,我做了多种可能情况下的测试: 在Android Studio下建立项目AndroidServiceFULLStudy,并新建一个名称为ServiceTest的工程。在ServiceTest工程下,建立一个ServiceLife类、一个MainActivity类,MainActivity与ServiceLife类中将我们执行的操作,与系统调用的生命周期方法都以日志的形式打印出来便于分析。 ServiceLife类:

{private String TAG = getClass().getSimpleName();MyBinder myBinder=new MyBinder();public ServiceLife() {}{public ServiceLife getService() {return ServiceLife.this; } }() {Log.d(TAG, “ServiceLife——>onCreate()”);super.onCreate(); }(Intent intent, int flags, int startId) {Log.d(TAG, “ServiceLife——>onStartCommand()”);return super.onStartCommand(intent, flags, startId); }@Overridepublic IBinder onBind(Intent intent) {Log.d(TAG, “ServiceLife——>onBind()”);return myBinder; }(Intent intent) {Log.d(TAG, “ServiceLife——>onRebind()”);super.onRebind(intent);}(Intent intent) {Log.d(TAG, “ServiceLife——>onUnbind()”);return true;}() {Log.d(TAG, “ServiceLife——>onDestroy()”);super.onDestroy();}}

MainActivity类:

{private String TAG = getClass().getSimpleName();Intent serviceIntent;(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Log.d(TAG, “MainActivity——>onCreate()”);serviceIntent = new Intent(this,ServiceLife.class);}(View v) {Log.d(TAG, “MainActivity——>startService()”);startService(serviceIntent);}(View v) {Log.d(TAG, “MainActivity——>stopService()”);stopService(serviceIntent);}(View v) {Log.d(TAG, “MainActivity——>bindService()”);bindService(serviceIntent, serviceConnection, Service.BIND_AUTO_CREATE);}(View v) {Log.d(TAG, “MainActivity——>unBindService()”);unbindService(serviceConnection);} () {Log.d(TAG, “MainActivity——>onDestroy()”);super.onDestroy();}ServiceConnection serviceConnection = new ServiceConnection() {(ComponentName name, IBinder service) {Log.d(TAG, “MainActivity——>onServiceConnected()”);ServiceLife.MyBinder binder = (ServiceLife.MyBinder) service;ServiceLife serviceLife = binder.getService();}(ComponentName name) {Log.d(TAG, “MainActivity——>onServiceDisconnected()”);}};}

MainActivity的界面布局这里就不再附上代码,贴上截图:

图中四个按钮分别对应执行MainActivity中startService、stopService、bindService、unBindService四个方法。 我们测试的过程如下,然后通过打印的日志进行分析: ○1多次点击STARTSERVICE按钮,再多次点击STOPSERVICE按钮:

>>>>>>>>>>>>>>>>onDestroy()

如上日志得出结论,第一次点击STARTSERVICE时,将执行ServiceLife的onCreate与onStartCommand方法,此后,由于Service已经构建运行,之后点击STARTSERVICE按钮时,就只会执行onStartCommand方法;无论我们点击多少次STARTSERVICE按钮,我们只需点击一次STOPSERVICE按钮,Service就会执行onDestory销毁,之后我们继续点击STOPSERVICE按钮将不会有任何作用。 ○2多次点击BINDSERVICE按钮,再多次点击UNBINDSERVICE按钮:

————-15 17:04:16.944 W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception 谁也不跟谁一辈子,有些事情没必要记在心上。

Android Service 深度解析(1)

相关文章:

你感兴趣的文章:

标签云: