Android之四大元件(2)(Service)
一、Service是android的四大元件,於activity最相似,於activity的區別在於,service一直執行在後臺,它沒有介面,所以絕不可能跑到前臺,一旦service被啟動起來,它就有它自己的額生命週期。service是四大元件,也是需要到androidManifest.xml檔案中配置宣告。
二、開發service的兩個步驟。
1、定義一個繼承service的子類。
2、在androidManifest.xml檔案中配置宣告。
(service和ctivity還有一袋奶相識的地方就是,他們都是從context派生出來的,因此都可以呼叫Context中的getResources(),getContentResoler()等方法)
三、Service也定義了一系列的生命週期。
1、IBinder onBind(Intent intent):該方法是service子類必須要實現的方法,該方法返回一個IBinder物件,應用程式就可以通過IBinder物件,呼叫IBinder類中的方法,實現activity於service的通訊。
2、void onCreate():該service第一次被建立後就立即回撥該方法。
3、void onDestroy():該方法在service關閉之前呼叫。
4、void onStartCommand(Intent intent,int flags,int startId):該方方法每次客戶端呼叫startService(Intent)方法啟動該方法。
5、boolean onUnbind(Intent intent):方法在service上繫結所有客戶端都斷開時就將回調該方法。
四、在android執行service有兩個方式:
1、通過context的startService()方法,該方法啟動了service,訪問者就和service之間就沒有任何關聯了,即使訪問者推推出,service也執行。
(其中onCreate()方法之呼叫一次,其它時候啟動就呼叫onStartCommand();)
(停止service的方法就是呼叫stopService()方法)
例、
Intent intent=new Intent(this,FristService.class);
startService(intent);
stopService(intent);
2、通過context中的bindService()方法,呼叫該方法,service就啟動,訪問者就和service之間繫結在一起了,訪問者一但推出,service也終止。
五、繫結本地Service並與之通訊
要實現service和訪問者之間的通訊,就需要將service和訪問者繫結。
1、繫結:bindService(Intent intent,ServiceConnection conn,int flags)
intent:用intent啟動service
conn:該ServiceConnection物件用於監聽Service和訪問者之間的連線情況。
(連線成功就回調方法:onServiceConnected(ComponentName,IBinder ibinder);該方法將ibinder匯出,就可實現通訊)
(連線失敗回撥:onServiceDisconnected(ComponentName name);)
flags:為指定繫結時是否自動建立Service,若引數為0(不自動建立),若為BIND_AUTO_CREATE(自動建立);
2、解綁:unbinService(ServiceConnection conn)
例、
重寫的一個service的子類:
public class MyService extends Service { private int count=0; private boolean quit=false; private MyBinder binder=new MyBinder();//次物件用於方法public IBinder onBind(Intent intent)返回 public class MyBinder extends Binder{ //定義的一個MyBinder類可呼叫其中的方法 public int getCount(){ return count; } } @Nullable @Override public IBinder onBind(Intent intent) { System.out.print("Service is Binder"); return binder; } public void onCreate(){ //建立的時候開啟一個執行緒 super.onCreate(); System.out.print("Service is Create"); new Thread(){ public void run() { while (!quit) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } count++; } } }.start(); } public boolean onUnbind(Intent intent){ //解幫的時候回撥 System.out.print("Service is onUnbind"); return true; } public void onDestroy(){ //銷燬的時候回撥 super.onDestroy(); this.quit=true; System.out.print("Service is onDestroy"); } }
在activity中來使用service
public class ServiceActivity extends AppCompatActivity implements View.OnClickListener{ MyService.MyBinder myBinder; private ServiceConnection connection=new ServiceConnection() {//用於監聽連線情況 @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { //連線成功 System.out.print("service Connected"); myBinder=(MyService.MyBinder)iBinder; //將使用iBinder } @Override public void onServiceDisconnected(ComponentName componentName) { //連線失敗 System.out.print("service Disconnected"); } }; protected void onCreate(Bundle saveInstanceState) { super.onCreate(saveInstanceState); setContentView(R.layout.service_activity); Button bind=findViewById(R.id.bind); Button unbind=findViewById(R.id.unbind); Button state=findViewById(R.id.state); bind.setOnClickListener(this); unbind.setOnClickListener(this); state.setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()){ case R.id.bind:{ //繫結service Intent intent=new Intent(this,MyService1.class); bindService(intent,connection, Service.BIND_AUTO_CREATE); //繫結的時候自動建立service break; } case R.id.unbind:{ unbindService(connection); //解綁 break; } case R.id.state:{ //呼叫服務的方法實現通訊 Toast.makeText(ServiceActivity.this,"Count:"+myBinder.getCount(),Toast.LENGTH_SHORT).show(); break; } default: break; } } }
六、service的生命週期:
1、如果用startService啟動服務
呼叫---->onCreate()----->onStartCommand()--->service自己執行----->onDestroy()---->service關閉
七、IntentService
對於非同步的startService請求,每當客戶通過Intent請求來啟動該服務,Intent會將Intent加入佇列中,然後開啟一條新的worker執行緒來處理Intent,因此不會阻塞主執行緒。IntentService自己處理耗時的任務。
特徵:
1、單獨地建立worker執行緒來處理Intent請求;
2、單獨地worker執行緒來處理onHandleIntent()方法實現地 ,開發者無需處理多執行緒問題。
3、當請求處理完成,IntentService會自動停止,開發者無需呼叫stopSelf()方法。
4、onBinder()方法預設實現,預設返回null
5、startCommand()地方法預設實現,實現將請求地Intent新增到佇列中。
系統服務將在下一節講到。