チャット サーバーへのネットワーク接続を維持する必要がある Android アプリに取り組んでいます。サーバーへの接続を開始するサービスを作成できることは理解していますが、このサービスは Android アクティビティに新しい受信メッセージをどのように通知しますか? アクティビティは、新しいメッセージを表示するためにビューを更新する必要があります。私はAndroidにかなり慣れていないので、助けていただければ幸いです。ありがとう!
3 に答える
ハンドラーをサービスに渡すことはできますか?
まず、ハンドラーをインターフェースとして定義します。これは例であるため、より複雑になる可能性があります。
public interface ServerResponseHandler {
public void success(Message[] msgs); // msgs may be null if no new messages
public void error();
}
アクティビティでハンドラーのインスタンスを定義します。これはインターフェースであるため、ここでアクティビティに実装を提供し、ハンドラー内から囲んでいるアクティビティのフィールドとメソッドを参照できるようにします。
public class YourActivity extends Activity {
// ... class implementation here ...
updateUI() {
// TODO: UI update work here
}
ServerResponseHandler callback = new ServerResponseHandler() {
@Override
public void success(Message[] msgs) {
// TODO: update UI with messages from msgs[]
YourActivity.this.updateUI();
}
@Override
public void error() {
// TODO: show error dialog here? (or handle error differently)
}
}
void onCheckForMessages() {
networkService.checkForMessages(callback);
}
NetworkServiceには次のようなものが含まれます。
void checkForMessages(ServerResponseHandler callback) {
// TODO: contact server, check for new messages here
// call back to UI
if (successful) {
callback.success(msgs);
} else {
callback.error();
}
}
また、Aleadamが言うように、サービスがデフォルトで同じスレッドで実行されることも避けてください。これは、ネットワーキングのようなものでは好ましくない動作であることがよくあります。サービスに関するAndroidの基本ページでは、個別のスレッドがないネットワークに対して明示的に警告しています。
注意:サービスはホスティングプロセスのメインスレッドで実行されます。サービスは独自のスレッドを作成せず、別のプロセスで実行されません(特に指定しない限り)。つまり、サービスがCPUを集中的に使用する作業やブロック操作(MP3再生やネットワークなど)を実行する場合は、その作業を実行するためにサービス内に新しいスレッドを作成する必要があります。別のスレッドを使用することで、Application Not Responding(ANR)エラーのリスクを軽減し、アプリケーションのメインスレッドをユーザーによるアクティビティの操作専用に保つことができます。
サービスでスレッドを使用する方法の詳細については、SOの記事「アプリケーションスレッドとサービススレッド」およびAndroidの新しいスレッドでサービスを開始する方法を確認してください。
サービス API ページを確認しましたか: http://developer.android.com/reference/android/app/Service.html ?
サービスと対話する方法の例がいくつかあります。
サービスは、アクティビティと同じスレッドおよび同じコンテキストで実行されます。ここもチェックしてください:http://developer.android.com/reference/android/content/Context.html#bindService%28android.content.Intent,%20android.content.ServiceConnection,%20int%29
最後に、Lars Vogel の記事もご覧ください: http://www.vogella.de/articles/AndroidServices/article.html