サービスへのプロセス間通信

「サービス側」

  1. AIDLファイルを定義する
  2. サービスの処理を作成
  3. マニフェストにサービスのインテントフィルタを定義する

1. AIDLの定義

 AIDLの書き方については@IT様を参照するとよい。

package com.example.myiservice;

interface IService {
 void message(in String msg);
}

2. サービスでの処理部分

 Handler mHandler = new Handler();

 IService.Stub mBinder = new IService.Stub(){
  @Override
  public void message(final String msg) throws RemoteException {
   mHandler.post(new Runnable(){
    @Override
    public void run() {
     // Handlerを使ってServiceのToastを呼び出す
     Toast.makeText(Service.this, "Hello,World!", Toast.LENGTH_SHORT).show();
    }
   });
  }
 }

3.  インテントフィルタの追加

マニフェストファイルにServiceのインテントフィルタを設定しないと接続できない。
        <service
            android:name="com.example.myiservice.Service"
            android:enabled="true">
            <intent-filter>
                <action android:name="ncom.example.myiservice.IService" />
            </intent-filter>
        </service>

「クライアント側」

  1. AIDLファイルをリンクする
  2. 接続の処理を作成
  3. バインドする

1. AIDLをリンク

プロジェクト内にパッケージ[com.example.myiservice]を作成する
File | New | Package

ファイルをリンクする
File | New | File より Advanced の Link to file in the file system にチェックして取り込む

2. 接続のための準備

 // サービスコネクション
 private IService mService;
 private ServiceConnection mServiceConnection = new ServiceConnection(){
  @Override
  public void onServiceConnected(ComponentName name, IBinder service) {
   mService = IService.Stub.asInterface(service);
  }
  @Override
  public void onServiceDisconnected(ComponentName name) {
   
  }
 };

3.バインドする部分

onCreate()等に書くのだ。
  // サービスにバインド
  mIntent = new Intent(IService.class.getName());
  boolean ret = bindService(mIntent, mServiceConnection, Context.BIND_AUTO_CREATE);

ふんどしの持ち主

コメント

このブログの人気の投稿

Pythonのソースファイルの行番号を取得したい

Raspberry Pi 3 シリアルコンソール&シリアル通信

学習リモコン「リモコソ (RIMOKOSO1)」の設定