Android基礎及應用 Service的使用

Walter Sun發表於2018-04-29

一、實驗目的

1. 瞭解Service的原理和用途;

2. 掌握本地服務的管理方法;

3. 掌握遠端服務的繫結和呼叫方法。

 

二、實驗過程

1、實現本地程式服務

在圖1.1的介面上新增計算按鈕。在介面上輸入姓名、身高和體重資料後,點選計算按鈕後呼叫本地服務來計算BMI指數,然後根據計算得出的BMI指數,給出對應的提示資訊。

1)新建一個繼承Service類的MyService,在類中過載onBind()方法,並在onBind()中返回MyService的例項:

public class MyService extends Service {

private final IBinder mBinder = new LocalBinder();

public class LocalBinder extends Binder{

MyService getService(){

return MyService.this;

}

}

@Override

public IBinder onBind(Intent intent) {

return mBinder;

}

}

 

(2)在MyService中新增一個計算BMI指數的方法:

public String gettizhi(double h,double w) {

String tizhi = null;

double bmi = w/((h/100)*(h/100));

if(bmi<18.5){

tizhi="體重偏瘦";

}

else if(bmi>=18.5&&bmi<24){

tizhi="體重正常";

}

else if(bmi>=24&&bmi<28){

tizhi="體重偏胖";

}

else if(bmi>=28){

tizhi="體重肥胖";

}

return tizhi;

}

3)因為如果在計算按鈕中啟動服務需要點選兩次才能獲取返回資訊,所以直接在MainActivityoncreate()中啟動服務,在計算按鈕中獲取返回資訊,在MainActivity中新增如下程式碼:

private MyService myservice;

String result;

Button b3 = (Button) findViewById(R.id.button3);

Intent serviceintent = new Intent(MainActivity.this,MyService.class);

    bindService(serviceintent, mConnection, Context.BIND_AUTO_CREATE);

b3.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

    result = myservice.gettizhi(Double.valueOf(e3.getText().toString()),Double.valueOf(e2.getText().toString()));

    Toast.makeText(getApplicationContext(), e1.getText().toString()+result, Toast.LENGTH_LONG).show();

}

});

 

private ServiceConnection mConnection = new ServiceConnection() {

@Override

public void onServiceDisconnected(ComponentName name) {

   myservice = null;

}

@Override

public void onServiceConnected(ComponentName name, IBinder service) {

myservice = ((MyService.LocalBinder)service).getService();

}

};

4)在AndroidManifest.xml中註冊MyService

5)效果如圖3.1所示:

 

3.1 “計算按鈕

在圖2.1的資訊顯示介面中新增一項體質,根據計算得出的BMI指數給出相應的體質狀況。

onContextItemSelected()中的檢視按鈕點選事件中新增:intent.putExtra("tizhi", result);

效果如下圖3.2所示:

 

3.2 新增“體質”項

2、實現跨程式服務

建立遠端服務,利用遠端服務實現與步驟2同樣的功能。

(1) 新建專案RemoteMyService

(2) 使用IMyService.aidl定義遠端服務的介面

package edu.cczu.remotemyservice;

interface IMyService{

String gettizhi(double h,double w);

}

(3) 通過繼承Service類的MyServiceSecond類實現遠端服務

public class MyServiceSecond extends Service {

 

private final IMyService.Stub mBinder = new IMyService.Stub(){

 

@Override

public String gettizhi(double h, double w) throws RemoteException {

String tizhi = null;

double bmi = w/((h/100)*(h/100));

if(bmi<18.5){

tizhi="體重偏瘦";

}

else if(bmi>=18.5&&bmi<24){

tizhi="體重正常";

}

else if(bmi>=24&&bmi<28){

tizhi="體重偏胖";

}

else if(bmi>=28){

tizhi="體重肥胖";

}

return tizhi;

}

};

@Override

public IBinder onBind(Intent intent) {

Toast.makeText(this, "遠端繫結", Toast.LENGTH_SHORT).show();

return mBinder;

}

}

(4) 編譯,上傳到模擬器中

(5) edu.cczu.myandroid中引入相同的AIDL檔案

(6) 繫結和使用遠端服務

與本地服務相比需要改變的地方:

1. 使用IMyService宣告遠端服務例項:

private IMyService imyservice;

2通過IMyService.StubasInterface()方法實現獲取伺服器例項:

    imyservice = IMyService.Stub.asInterface(service);

3.先通過setAction()方法宣告服務標識,然後呼叫bindService()繫結服務:

final Intent serviceintent = new Intent();

serviceintent.setAction("edu.cczu.remotemyservice.MyServiceSecond");

serviceintent.setPackage(getPackageName());

bindService(serviceintent,mConnection,Context.BIND_AUTO_CREATE);

效果如入3.3所示:

 

3.3 遠端服務

相關文章