2010-12-14 5 views
2

gpsやその他のセンサー値を定期的(10〜60秒ごと)に記録するサービスを実装するベストプラクティスを探しています。電話がスリープ状態になると、サービスはスタンバイモードに対処する必要があります。Android:gps/sensor loggingのサービス

ヘルプ(擬似コードまたはチュートリアル)は大変ありがとうございます。

答えて

3

デバイスは、センサが似行いますとすぐに表示がオフになるようhttp://code.google.com/p/android/issues/detail?id=3708#makechanges

を参照してください(眠りに落ちる場合でも、方位センサは時間絶えず働くようにすることは不可能であるように見えます。.. 。:(

私は今(の許可が必要です)再度の表示に変わりますタイマーとbroadcastrecieverと一緒に

<uses-permission android:name="android.permission.WAKE_LOCK" /> 

をwakelockを実施しました。これはもちろんですバッテリーの寿命に狂ったが、私はこれまでに他の方法を見つけた。

これは、サービスの私の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経由でデバッガからUNプラグが差し込まれたデバイス(これは最初に問題がありました)にも対応します。

より良い解決策がある場合、または2.3に修正がある場合はお知らせください。ありがとう!

+0

それはまだ唯一の方法ですか?つまり、センサーのアンドロイドを常に監視するには良い方法がありますか? – Demiurg

1

ここに、Androidサービスの使用方法に関するチュートリアルへのリンクがあります。 LINK センサーからデータを読み取る方法に関するチュートリアルへのリンクです。 LINK