0

私のサービスでは、インターネットからたくさんのものをダウンロードしており、これをx時間ごとに実行したいと考えています([設定]で選択)

私がメインアクティビティでこのコードに書いた現在の実装:

    Intent svc = new Intent(this, AlarmService.class);

    if (startService(svc)!=null) {
        Log.i(this.getClass().toString(), "Service already running");
    } else {
        Log.i(this.getClass().toString(), "Service Started");
    }

なぜなら、ドキュメントによると

特定のアプリケーションサービスの開始を要求します。インテントには、開始する特定のサービス実装の完全なクラス名、または開始するサービスの種類のアクションおよびその他のフィールドによる抽象的な定義のいずれかを含めることができます。このサービスがまだ実行されていない場合は、インスタンス化されて開始されます(必要に応じてプロセスを作成します)。実行中の場合は実行中のままです。

私が強調した最後の文は、サービスのonCreateにすべての重いコードを記述でき、それが変更されないことを願っていますが、残念ながら、ユーザーがアプリを起動するたびに、サービスが再開され、大量のダウンロードが行われ、無駄になりますバッテリー。

サービスが実行されているかどうかの表示は正しいです:

戻り値サービスが開始されているか、すでに実行されている場合、開始された実際のサービスのComponentNameが返されます。それ以外の場合、サービスが存在しない場合はnullが返されます。

それで、私の質問、サービスがすでに開始されている場合はそのままにして、まだ開始されていない場合はサービスを開始するにはどうすればよいですか?

ありがとう

編集:

サービスは停止しませんでした:

public class AlarmService extends Service {

    Alarm alarm = new Alarm();

    public void onCreate() {
        super.onCreate();
        Log.i("**", "onCreate");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i("LocalService", "Received start id " + startId + ": " + intent);
        // DO NOTHING FOR TESTING alarm.SetAlarm(this);
        return START_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}
4

1 に答える 1

1

私のサービスでは、インターネットからたくさんのものをダウンロードしており、これをx時間ごとに実行したいと考えています([設定]で選択)

IntentServiceうまくいけば、あなたは(おそらく私のWakefulIntentService)とでこれをやっていますAlarmManager

私が強調した最後の文は、サービスのonCreateにすべての重いコードを記述でき、それが変更されないことを願っていますが、残念ながら、ユーザーがアプリを起動するたびに、サービスが再開され、大量のダウンロードが行われ、無駄になりますバッテリー。

これは、サービスが(stopService()またはを介してstopSelf())停止されたか、アプリのプロセスが終了したためです。

すでに開始されている場合はサービスをそのままにして、まだ開始されていない場合は開始するにはどうすればよいですか?

startService()ドキュメントに示されているように、を呼び出します。

しかし、あなたが本当に「これをx時間ごとにやろうとしている」なら、あなたのサービスがその時間の間に固執しようとしてRAMを浪費しなければ、ユーザーは本当にそれを高く評価するでしょう。したがって、ユーザーまたはOSは、「x時間」の間にプロセスを削除する可能性があります。「x時間」ごとに「大量のダウンロード」を実行したくない場合は、その情報をある種のファイルにローカルに保存する必要があります。

于 2012-11-21T22:48:20.470 に答える