Service
Service与Activity都是Android系统中的运行单元,只是后者有接口布局文件作为其操作界面,而前者无操作界面,专门负责运行一项制定的工作,直到完成或被其控制程序停止。
Service与Thread很相似,都是独立运行的对象,也是幕后运行无界面,Thread是java内建类,而Service是Android根据其特性和架构设计的,所以在Android中优先建议使用Service。
Service的两种调用方法:startService();bindService()。
Service的生命周期:
startService():onCreate()、onStart()/onStartCommand()(Android2.0以前只有onStart())、onDestroy()
bindService():onCreate()、onStart()/onStartCommand()(Android2.0以前只有onStart())、onUnbind()、onDestroy()
1、新建一个继承Service的新类,利用右键Source > Override/Implement Methods 重写onCreate()、onStartCommand()、onDestroy()、onUnbind():
1 package com....; 2 3 import android.app.Service; 4 import android.content.Intent; 5 import android.os.Binder; 6 import android.os.IBinder; 7 8 public class MyService extends Service { 9 10 public class LocalBinder extends Binder 11 { 12 MyService getService() { 13 return MyService.this; 14 } 15 16 } 17 private LocalBinder mLocBin = new LocalBinder(); 18 @Override 19 public IBinder onBind(Intent arg0) { 20 // TODO Auto-generated method stub 21 return mLocBin; 22 } 23 24 @Override 25 public void onCreate() { 26 // TODO Auto-generated method stub 27 super.onCreate(); 28 } 29 30 @Override 31 public void onDestroy() { 32 // TODO Auto-generated method stub 33 super.onDestroy(); 34 } 35 36 @Override 37 public int onStartCommand(Intent intent, int flags, int startId) { 38 // TODO Auto-generated method stub 39 return super.onStartCommand(intent, flags, startId); 40 } 41 42 @Override 43 public boolean onUnbind(Intent intent) { 44 // TODO Auto-generated method stub 45 return super.onUnbind(intent); 46 } 47 48 }
其中onBind()方法必须传回类中建立的一个LocalBinder类的对象,否则无法完成Bind Service的动作。LocalBinder是内部类,继承Binder类,其中有getService方法,传回MyService对象,就是根据这个方法才能调用bindService()时取得MyService对象。
2、在AndroidManifest.xml中注册Service:
<service android:name=".MyService" android:enabled="true" />
3、在程序中启动Service:
startService():
Intent it = new Intent(类名称.this,Service类名称.class); startService(it);
...
stopService(it);
bindService():
首先建立ServiceConnection对象,取得Service对象,并存入定义在主程序中的MyService属性;
onServiceConnected()在bind Service时系统调用;onServiceDisconnected()在Service对象不正常结束时运行,一般情况不允许。
private ServiceConnection mServConn = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub } @Override public void onServiceConnected(ComponentName name, IBinder service) { // TODO Auto-generated method stub
//取得Service对象 MyService mMyServ = ((MyService.LocalBinder)service).getService(); } };
2、建立Intent对象并指定要启动的Service类,调用bindService()。
Intent it = new Intent(类名称.this,Service类名称.class); bindService(it, mServConn, BIND_AUTO_CREATE); ... unbindService(mServConn);