かなり基本的なサービスを考えてみましょう。
class KeepANumberService extends Service {
// The codes used in incoming messages
final static int REQUEST_SET_NUMBER = 0;
final static int REQUEST_GET_NUMBER = 1;
// The information this service works with internally
int numberToKeep = 0;
// The handler for incoming messages
private IncomingMessageHandler incomingMessageHandler = new IncomingMessageHandler();
// Start up and close down stuff
< Insert standard start up and close down code OnCreate, OnBind etc etc here >
void returnNumber(Messenger destination) {
Message msg = <construct message with numberTo>;
destination.send(msg);
}
// Handler that receives messages from the thread
private class IncomingMessageHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case REQUEST_SET_NUMBER:
numberToKeep = msg.whatever; // get data from wherever it's hidden in the msg
break;
case REQUEST_GET_NUMBER:
returnNumber(msg.replyTo);
break;
}
}
}
}
}
さて、lintを実行してEclipseでこれを開発している場合、現在2つのオプションから選択できます。
- 上記のコードでは、プライベート最終クラスのIncomingMessageHandler行に警告が表示され、実行時にすべてが機能するように、静的としてデカラリングする必要があることが示されます。
- そのクラス(IncomingMessageHandler)を静的にすると、クラス全体(KeepANumberService)のデータと関数にアクセスできなくなります。これは、コーディングが面倒です(場合によっては不可能ですか?)。
では、メッセージハンドラーを静的にすることはどれほど重要ですか?なぜ?