korechi’s diary

とあるVR/ARエンジニアのブログ

Activity(端末)とExtension(グラス)間の通知

まず、ActivityとControlExtenstionとのやりとりはExtensionServiceを介して行われます

ControlExtenstionはExtensionService内でつくられるので問題ないのですが、Activity側はExtensionServiceを持っていないので持ってこなきゃダメ

Activity -> ControlExtensionへの通知

これはホストApp(MainActivity)でGPSを取得して、それをControlExtensionでGPSの情報を表示したい時などに役立ちます。

まずActivity内でExtensionServiceを持ってきます

public void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (SampleExtensionService.Object == null) {
            Intent intent = new Intent(Registration.Intents
                    .EXTENSION_REGISTER_REQUEST_INTENT);
            Context context = getApplicationContext();
            intent.setClass(context, SampleExtensionService.class);
            context.startService(intent);
        }
}

SampleExtensionService.Objectがない場合はSampleExtensionService内で

public static SampleExtensionService Object;

と宣言してください

そして、Extensionに通知したいタイミングで

if (HelloWorldExtensionService.Object != null) {
  HelloWorldExtensionService.Object.SendMessageToExtension("Hello SmartEyeglass");
}

を行えばExtensionServiceに対してメッセージが送られます。 もちろんExtensionServiceはsendMessageToExtensionを受け取った時の処理を記述する必要があります
まずはExtensionService内でControlExtenstionのインスタンスを作ります(作り方は自由)

そして、そのインスタンスメソッドに対してメッセージを送ります

public void SendMessageToExtension (String message) { 
    // ControlExtensionにメッセージを送るメソッド
    SampleControlExtenstion.DisplayMessage(message);
}

ここではDisplayMessageというメソッドをSampleControlExtenstion内に作りましたが、なんでもいいです。もちろん引数はStringじゃなくてもOK

ExtensionServiceを経由することを忘れず注意すれば意外と簡単にできましたね

ControlExtension -> Activity

これもExtensionServiceを経由するので頑張るのはExtensionService

ExtenstionService内でインテントを作成して、その中にメッセージを埋め込みます
・ExtensionService

public void sendMessageToActivity(final String message) {
        Intent intent = new Intent();
        intent.setClass(getBaseContext(), HelloWorldActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.putExtra("Message", message);
        startActivity(intent);
    }

・Activity

// Intent内のExtras()を取得する
Bundle extras = getIntent().getExtras();
if (extras != null) {
  String message = extras.getString("Message");
  Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();
}