開発者サイトとここにstackoverflowでAndroidサービスに関する利用可能なドキュメントのほとんどを読んだ後、私はまだ別のタスクでサービスを実行するいくつかの側面に混乱しています。うまくいけば、誰かが私を正しい軌道に乗せることができます。
たとえば、次のような些細なサービスフレームワークがあるとします。
public class HliService extends Service {
@Override
public void onCreate() {
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// If we get killed, after returning from here, restart
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
// We don't provide binding, so return null
return null;
}
@Override
public void onDestroy() {
}
}
そしてマニフェストでは、私は持っています
<service android:name=".HliService" android:process=":HLI_Comms"/>
サービスが独自のスレッドで実行されるようにします。
このサービスの目的は、TCPソケットを使用してデバイスと通信し、その他の処理を行うバックグラウンドタスクを提供することです。バッテリーの問題などを無視するリスクを冒して、基本的には永久に実行したいと思います。
何かのようなもの
// Method that communicates using a TCP socket, and needs to send
// information back to the activity and receive messages from activity
// not shown here.
private void dummytask() {
boolean keepGoing = true;
while (keepGoing) {
// do useful stuff in here
// sets keepGoing false at some point
}
stopSelf();
}
このメソッド/タスクを開始するための最良の方法は何ですか?
私はメッセージハンドラーとルーパーを使用する開発者サイトのコードを見てきましたが、それは部分的にしか理解していませんが、それは非常に複雑で、おそらく私が必要とする以上のものに見えますか?
どちらからでもこのメソッドを呼び出すことができないと思いますかonCreate()
、それonStartCommand()
以降、システムから呼び出されたときにどちらも完了しませんか?タイマーまたはアラームで開始する必要がありますか?
GUIアクティビティと通信するためにメッセージハンドラを追加する必要がありますが、別のスレッドでサービスを開始しているため(マニフェストの「プロセス」命令により)、代わりにAIDLを使用する必要がありますか?
Serviceを拡張するのではなくAysnchTaskを使用することも検討しましたが、タスクを実行してから終了する方が適しているようです。