GPS値またはその他のセンサー値を定期的に(10〜60秒ごとに)ログに記録するサービスを実装するためのベストプラクティスを探しています。電話機がスリープ状態になったときに、サービスはスタンバイモードを処理する必要があります。
どんな助け(擬似コードまたはチュートリアル)も大歓迎です!
GPS値またはその他のセンサー値を定期的に(10〜60秒ごとに)ログに記録するサービスを実装するためのベストプラクティスを探しています。電話機がスリープ状態になったときに、サービスはスタンバイモードを処理する必要があります。
どんな助け(擬似コードまたはチュートリアル)も大歓迎です!
デバイスがスリープ状態になったとしても、方向センサーを何時間も継続的に動作させることは不可能のようです( http://code.google.com/p/android/issues/detail?id=3708#makechangesを参照)
ディスプレイが消えるとすぐに、センサーは同じように動作します... :(
ウェイクロックを実装しました(許可が必要です)
<uses-permission android:name="android.permission.WAKE_LOCK" />
タイマーと放送受信機と組み合わせて、ディスプレイを再びオンにします。もちろん、これはバッテリーの寿命に夢中ですが、これまでのところ他の方法は見つかりませんでした。
これは、サービスのonCreateメソッドです。
@Override
public void onCreate() {
mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
CONTEXT = this;
PowerManager pm = (PowerManager) CONTEXT.getSystemService(Context.POWER_SERVICE);
this.mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "my tag");
mWakeLock.acquire();
Log.d(TAG, "Wakelock acquired");
// register receiver that handles screen on and screen off logic
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
BroadcastReceiver mReceiver = new ScreenReceiver();
registerReceiver(mReceiver, filter);
}
これはサービスのonStartメソッドです。
@Override
public void onStart(Intent intent, int startid) {
Toast.makeText(this, "My Service Started", Toast.LENGTH_SHORT).show();
Log.d(TAG, "onStart");
boolean screenOn = intent.getBooleanExtra("screen_state", false);
if (!screenOn) {
Log.d(TAG, "Screen is on");
} else {
Log.d(TAG, "Screen is off");
Timer timer = new Timer("DigitalClock");
timer.schedule(new TimerTask() {
@Override
public void run() {
Log.d(TAG,"Waiting 1 sec for switching the screen back on again...");
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP,
"my tag");
mWakeLock.acquire();
}
}, 1000);
mWakeLock.acquire();
}
}
これはBroadcastReceiverクラスです。
public class ScreenReceiver extends BroadcastReceiver { private boolean screenOff; @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { screenOff = true; } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { screenOff = false; } Intent i = new Intent(context, MyService.class); i.putExtra("screen_state", screenOff); context.startService(i); }
}
この回避策は、USB経由でデバッガーからプラグを抜いたデバイスでも実行できます(私は最初にこれに問題がありました)。
より良い解決策があるかどうか、または2.3で修正があるかどうかを教えてください。ありがとう!