AndroidService 深度解析(1)
这段时间我重新对Android基础进行了学习,还是先从官方文档开始,做了关于Service的文档翻译,熟悉了关于Service的知识点。但是在用的时候还是有很多需要注意的地方,需要把这些知识点联系起来,因此有了这篇文章。我将主要从以下几个方面对Service类进行深度解析:
1、 Service的生命周期(看起来简单,实际上很复杂的);
2、 绑定运行Service(Bound Service)的多种形式实现及其使用;
主要包括本地Service继承Binder类的实现、远程Service使用Messenger实现、远程Service的AIDL方式实现。(本来打算这篇一起写,篇幅太长,作为两篇吧)
如果您有兴趣继续阅读下去,但是您对Service的基础还不怎么熟悉的话,建议您先阅读以下三篇我对官方文档的翻译:
Service API文档 翻译:
Services 综合介绍 :
Bound Service 以绑定方式运行的Service :
http://blog.csdn.net/chtsx/article/details/44276241
Service的生命周期
虽然Service在它的生命周期中涉及到的方法一共只有onCreate、onStartCommand、onBind、onUnbind、onDestory这几个,但是由于Service拥有两种运行方式,而且可以实现同时为多个客户端服务,支持跨进程,使得它的运行时状态真的很难让人清楚地掌握。而官方给的这个图也很难将Service的生命周期详细地表述。
为了好好把握Service在不同状态下的运行,我做了多种可能情况下的测试:
在Android Studio下建立项目AndroidServiceFULLStudy,并新建一个名称为ServiceTest的工程。在ServiceTest工程下,建立一个ServiceLife类、一个MainActivity类,MainActivity与ServiceLife类中将我们执行的操作,与系统调用的生命周期方法都以日志的形式打印出来便于分析。
ServiceLife类:
public class ServiceLife extends Service { private String TAG = getClass().getSimpleName(); MyBinder myBinder=new MyBinder(); public ServiceLife() { } public class MyBinder extends Binder { public ServiceLife getService() { return ServiceLife.this; } } @Override public void onCreate() { Log.d(TAG, "ServiceLife------>onCreate()"); super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d(TAG, "ServiceLife------>onStartCommand()"); return super.onStartCommand(intent, flags, startId); } @Override public IBinder onBind(Intent intent) { Log.d(TAG, "ServiceLife------>onBind()"); return myBinder; } @Override public void onRebind(Intent intent) { Log.d(TAG, "ServiceLife------>onRebind()"); super.onRebind(intent); } @Override public boolean onUnbind(Intent intent) { Log.d(TAG, "ServiceLife------>onUnbind()"); //return false; return true; } @Override public void onDestroy() { Log.d(TAG, "ServiceLife------>onDestroy()"); super.onDestroy(); } }
MainActivity类:
<pre name="code" class="java">public class MainActivity extendsActionBarActivity { private String TAG = getClass().getSimpleName(); Intent serviceIntent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d(TAG,"MainActivity------>onCreate()"); serviceIntent = newIntent(this,ServiceLife.class);} publicvoid startService(View v) { Log.d(TAG,"MainActivity------>startService()"); startService(serviceIntent); } public void stopService(View v) { Log.d(TAG,"MainActivity------>stopService()"); stopService(serviceIntent); } public void bindService(View v) { Log.d(TAG,"MainActivity------>bindService()"); bindService(serviceIntent, serviceConnection,Service.BIND_AUTO_CREATE); } public void unBindService(View v) { Log.d(TAG, "MainActivity------>unBindService()"); unbindService(serviceConnection); } @Override protected void onDestroy() { Log.d(TAG,"MainActivity------>onDestroy()"); super.onDestroy(); } ServiceConnection serviceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentNamename, IBinder service) { Log.d(TAG,"MainActivity------>onServiceConnected()"); ServiceLife.MyBinderbinder = (ServiceLife.MyBinder) service; ServiceLifeserviceLife = binder.getService(); } @Override public voidonServiceDisconnected(ComponentName name) { Log.d(TAG,"MainActivity------>onServiceDisconnected()"); } }; }
MainActivity的界面布局这里就不再附上代码,贴上截图: