0

私のアプリケーションの目的は、位置情報の更新を 20 分ごとに保存することです。

サービスを使用しましたが、正常に機能しましたが、画面をロックしたり、自動的にロックされたりすると、サービスの実行が停止します。ロックを解除すると、サービスが再び実行されます。

私のコードでハイライト:

サービス()

onCreat(){
   call timer();
 }

timer(){
   code
 }

すべての条件で常にコードを実行するにはどうすればよいですか?

4

2 に答える 2

0

はい、AlarmManager を使用して、たとえば以下のように setRepeating を使用して 10 分ごとにサービスを開始します。サービスのタイマーを取り除き、サービスが oncreate または onCommand で開始から完了までタスクを実行できるようにします。

    int SECS = 1000;
    int MINS = 60 * SECS;
    Calendar cal = Calendar.getInstance();
    Intent in = new Intent(context, YourService.class);
    PendingIntent pi = PendingIntent.getService(context, 0, in, PendingIntent.FLAG_UPDATE_CURRENT);

    AlarmManager alarms = (AlarmManager)context.getSystemService(
            Context.ALARM_SERVICE);
    alarms.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 
            10 * MINS, pi);

ボタンから onclick ハンドラーにこのコードを含めるアクティビティを作成して、サービスを開始できます。起動時に実行したい場合は、デバイスが起動したときに通知されるブロードキャストレシーバーにこれを配置する必要がありますが、それ自体は別のトピックです。

デバイスがスリープ状態のときにサービスとタイマーが機能しない理由は、CPU がオフになっていて、コードにウェイク ロックがないためです。AlarmManager は、サービスを実行するために CPU をわずかに起動します。

于 2011-01-06T07:00:59.817 に答える
0

デバイスのウェイクアップを含め、サービスがスケジュールに基づいて動作するように調整する正しい方法 (例: "call timer()") は、おそらく myまたは類似のものとAlarmManager一緒にを使用することです。WakefulIntentService

于 2010-05-22T15:10:27.343 に答える