Androidバインドサービスの理解方法

4229 ワード

バインドサービスはアンドロイドプログラミングの過程で避けられない問題であり、クライアントとサービス側の相互作用をさらに完成させる上で優れた優位性があるが、学習を始めたばかりの頃、この部分のプログラミング構想は理解しにくく、自分の学んだことと結びつけて、筆者は初心者の角度からバインド時のサービスの応用方法を分析した.
バインド時のサービス実装手順
基本的なプログラムを用いて、バインディングサービスの符号化手順をまとめます.
1.カスタムサービスクラス
GetDistanceService
private Random random=new Random();
private  IBinder mybinder=new IBinder();

public GetDistanceService() {

}

public class IBinder extends Binder {

    GetDistanceService  getGetDistanceService(){
        return GetDistanceService.this;
    }

}

@Override
public IBinder onBind(Intent intent) {
    // TODO: Return the communication channel to the service.
    return mybinder;
}

public double getDistance(){
    return random.nextDouble();
}

ここで特に注意しなければならないのは、BindのサブクラスIBinderをカスタマイズすることであり、このクラスはバインド時のサービスのコンテンツ実装にとって非常に重要であり、IBinderクラスはサービスとフロントActivityのチャネルとして理解することができ、カスタマイズされたIBinderサブクラスに実際にいくつかの機能方法を追加し、onBind(Intent intent)関数の戻り値をカスタムIBinderサブクラスの一例に変更することができる.カスタム・サービス・クラスでは、フロント・コールを容易にする方法(本明細書ではgetDistance)をカスタマイズできます.
2.サービス接続クラスのインスタンス化
フロントのActivityクラスに新しいServiceConnectionクラスのインスタンスconectionをメンバー変数として作成し、OnCreate()メソッドでconection変数をインスタンス化します.
protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       connection = new ServiceConnection() {
           @Override
           public void onServiceConnected(ComponentName name, IBinder service) {
               GetDistanceService.IBinder binder = (GetDistanceService.IBinder) service;
               disService = binder.getGetDistanceService();
               binded = true;
           }

           @Override
           public void onServiceDisconnected(ComponentName name) {
               binded = false;
           }
       };
       displayDis();
   }

ServiceConnectionクラスは、フロントエンドActivityとサービスのインタラクション機能を実現する鍵であり、フロントがサービス側を呼び出す必要がある機能、すなわちインタラクションの論理定義を定義しています.ただし、この時点ではサービスはバインドされていません.
3.フロントのActivityクラスのOnStart()メソッドでサービスをバインドする
        super.onStart();
        Intent intent = new Intent(MainActivity.this, GetDistanceService.class);
      

このセクションはonCreate()メソッドの後でなければなりません.前のステップでServiceConnection変数のインスタンスが完了したため、bindService(intent,connection,BIND_AUTO_CREATE)によってサービスバインド作業が完了しました.
4.インタフェースActivityでの対応機能の実現
MainActivity
private ServiceConnection connection;
private GetDistanceService disService;
private Boolean binded = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            GetDistanceService.IBinder binder = (GetDistanceService.IBinder) service;
            disService = binder.getGetDistanceService();
            binded = true;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            binded = false;
        }
    };

    displayDis();


}

private void displayDis() {


    final Handler handler = new Handler();
    handler.post(new Runnable() {
        @Override
        public void run() {
            if (disService != null || binded) {
                TextView disText = findViewById(R.id.destanceDisplay);
                disText.setText(Double.toString(disService.getDistance()));
            } else
                Toast.makeText(MainActivity.this, "disService=null", Toast.LENGTH_LONG);
            handler.postDelayed(this, 1000);
        }
    });


}

@Override
protected void onStart() {
    super.onStart();
    Intent intent = new Intent(MainActivity.this, GetDistanceService.class);
    bindService(intent, connection, BIND_AUTO_CREATE);
}

@Override
protected void onStop() {
    super.onStop();
    unbindService(connection);
}

キー解読
ServiceConnectionの主な機能は,サービスクラスインスタンスの取得など,サービスインタラクションによって伝達されたBindクラスのインスタンスを用いて機能論理の準備を完了することである.Bindクラスは主にフロントエンドActivityとサービスが相互作用するチャネルに提供され、メッセージングなどのように相互作用するメディアはbindService()の呼び出しタイミングに注意し、サービス接続がインスタンス化された後にエラーが発生する必要があります.
あなたに役に立つことを望んで、ありがとうございます!