7

開発者サイトとここに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を使用することも検討しましたが、タスクを実行してから終了する方が適しているようです。

4

2 に答える 2

2

サービスが独自のスレッドで実行されるようにします。

これにより、サービスは独自のプロセスになります。これは、余分なRAMとCPU(IPC用)を消費するため、一般的には避けるべきものです。スレッドを作成するには、Threadまたはその他の手段をいくつでも作成するだけです。そのほとんどは、Javaで10年ほど使用されています。

バッテリーの問題などを無視するリスクを冒して、基本的には永久に実行したいと思います。

サービスを永久に実行することはほとんど不可能です。ユーザーまたはOSは、最終的にサービスを削除します。

このメソッド/タスクを開始するための最良の方法は何ですか?

dummytask()バックグラウンドスレッドから呼び出します。

代わりにAIDLを使用する必要がありますか?

いいえ。サービスは、アクティビティによって提供されるをブロードキャストしIntentたり、呼び出したり、アクティビティによって提供された経由でPendingIntent送信したりすることができます。Androidサポートパッケージのを使用するのが最善ですが、プロセスの境界を越えて機能することはありません。より高価な通信オプションを強制します。MessageMessengerLocalBroadcastManager

于 2012-05-18T00:53:30.237 に答える
0

を含む(通常の)アラーム( )をIntentService設定することで、実行する を使用できると思います。からインテントをブロードキャストし、を介して UI で受信することにより、UI に通知できます。AlarmManager.setRepeatingPendingIntentIntentServiceBroadcastReceiver

于 2012-05-18T01:02:38.440 に答える