AIDL を介して外部アクティビティにコマンドを送信するサービスを作成しました。このアクティビティがサービスにバインドされた後、サービスにコールバックが送信されるため、双方向通信が確立され、正しく機能します。
代わりに、サービスから受け取ったコマンドに従ってアプリケーションの UI を変更したい場合に問題が発生します。単純なトースト通知でテストを行ったのですが、いくつかエラーが発生してしまいました...
AIDL を介して新しいコマンドを受信すると、外部アクティビティのonExecute
メソッドが呼び出されます。トースト通知を削除すると、すべてが正常に機能しますが、サービスから受け取ったコマンドに従って UI を変更する必要があります。
protected void onExecute(Bundle params) {
Log.i(LOG_TAG, "onExecute(): " + params);
if (params.containsKey("command01")) {
Log.i(LOG_TAG, "onExecute(): " + params.getString("command01"));
Toast
.makeText(this, "Command 1...", Toast.LENGTH_SHORT)
.show();
}
else if (params.containsKey("command02")) {
Log.i(LOG_TAG, "onExecute(): " + params.getString("command02"));
Toast
.makeText(this, "Command 2...", Toast.LENGTH_SHORT)
.show();
}
else {
Log.w(LOG_TAG, "onExecute() - unknown command: " + params);
}
}
以下は、エラー中に LogCat によって記録されたログを示しています。
05-07 12:45:30.676: W/dalvikvm(363): JNI WARNING: JNI method called with exception raised
05-07 12:45:30.676: W/dalvikvm(363): in Ldalvik/system/NativeStart;.run ()V (CallStaticVoidMethodV)
05-07 12:45:30.676: W/dalvikvm(363): Pending exception is:
05-07 12:45:30.676: I/dalvikvm(363): Ljava/lang/RuntimeException;: Can't create handler inside thread that has not called Looper.prepare()
05-07 12:45:30.706: I/dalvikvm(363): at android.os.Handler.<init>(Handler.java:121)
05-07 12:45:30.706: I/dalvikvm(363): at android.widget.Toast.<init>(Toast.java:68)
05-07 12:45:30.706: I/dalvikvm(363): at android.widget.Toast.makeText(Toast.java:231)
05-07 12:45:30.706: I/dalvikvm(363): at org.example.android.applicationdemo.ApplicationDemoActivity.onExecute(ApplicationDemoActivity.java:130)
05-07 12:45:30.706: I/dalvikvm(363): at org.example.android.applicationdemo.ApplicationDemoActivity$2.execute(ApplicationDemoActivity.java:100)
05-07 12:45:30.706: I/dalvikvm(363): at org.example.android.servicedemo.IServiceCallback$Stub.onTransact(IServiceCallback.java:55)
05-07 12:45:30.706: I/dalvikvm(363): at android.os.Binder.execTransact(Binder.java:320)
05-07 12:45:30.706: I/dalvikvm(363): at dalvik.system.NativeStart.run(Native Method)
05-07 12:45:30.706: I/dalvikvm(363): "Binder Thread #2" prio=5 tid=8 NATIVE
05-07 12:45:30.706: I/dalvikvm(363): | group="main" sCount=0 dsCount=0 obj=0x405116f0 self=0x1f1590
05-07 12:45:30.706: I/dalvikvm(363): | sysTid=370 nice=0 sched=0/0 cgrp=default handle=2037072
05-07 12:45:30.714: I/dalvikvm(363): | schedstat=( 18375041 37002039 19 )
05-07 12:45:30.714: I/dalvikvm(363): at dalvik.system.NativeStart.run(Native Method)
05-07 12:45:30.714: E/dalvikvm(363): VM aborting