1

電話が鳴っているかどうかをチェックするサービスがあります。このサービスでは、電話が回っているかどうかも確認しています。サービスの実行中に常にこのセンサー チェックを実行するのは良いことですか、それともバッテリーと CPU リソースに負担がかかりすぎますか?

@Override
    public void onSensorChanged(SensorEvent event) {
        if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {

            boolean turnAroundToStop = some code is executed

            if (turnAroundToStop) {
                float value = Math.abs(event.values[1]);
                if (value > orientationLim && !stopped) {
                    // Down
                    do some code
                    stopped = true;
                } else {
                    // Up
                    stopped = false;
                }
            }
        }
    }
4

1 に答える 1

2

サービスを常に実行すると、CPU とバッテリーに関してコストがかかります。CPU負荷を軽減するのに役立つ可能性があると私が知っている2つのオプションがあり、可能であればそれらを使用することをお勧めします.

オプション 1: ディスプレイがオフになったらサービスを停止し、ディスプレイがオンになったらサービスを開始します。を使用してこれを実現できますBroadcastReceiver

public class ScreenReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
            // stop service
        } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
            // start service
        }
    }
}

重要: イベントをプログラムで登録します。

IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
BroadcastReceiver receiver = new ScreenReceiver();
registerReceiver(receiver, filter);

オプション 2:AlarmManager代わりに使用します。このオプションは、デバイスのスタンバイ中にもセンサー チェックを実行する必要がある場合に適しています。ただし、短い間隔 (30 分未満としましょう) には適していないという欠点があります。

 public void SetAlarm(Context context) {
    AlarmManager manager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
    am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 *60 , pendingIntent);
 }

おそらくマニフェストでこれが必要です:

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

注: これらは完全な/実行中の例ではありません。コード フラグメントは、適切なキーワードから始めるのに役立ちます。とにかくこれが役に立てば幸いです...乾杯!

于 2013-04-08T19:40:53.037 に答える