1. 程式人生 > >Android之四大元件(2)(Service)

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新增到佇列中。

 

系統服務將在下一節講到。