我有一项检查手机是否响铃的服务。在这项服务中,我也在检查手机是否转过来。在服务运行期间一直运行此传感器检查是否有用,或者这对电池和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;
}
}
}
}
答案 0 :(得分:2)
关于CPU和电池,始终运行服务的成本很高。我知道有两个选项可以帮助您减少CPU负载,我建议尽可能使用它们。
选项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>
注意:这些不是完整/正在运行的示例。代码片段应该可以帮助您从正确的关键字开始。希望这有助于...干杯!