android 服务记录传感器数据不间断
android service logging sensor data uninterrupted
我正在尝试为 android 应用程序编写一个服务,该应用程序以固定采样率 连续 监控加速度传感器值。下面是我用来保持服务 运行ning.
的代码片段
public class MyService extends Service {
...
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
Intent mainIntent = new Intent(this, MainActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(MainActivity.class);
stackBuilder.addNextIntent(mainIntent);
PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
Notification notification = new Notification.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(getString(R.string.app_name))
.setAutoCancel(true)
.setOngoing(true)
.setContentIntent(pendingIntent)
.setContentText(TAG)
.build();
context.startForeground(1, notification);
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakelockTag");
wakeLock.acquire();
//Register Accelerometer Sensor Listener Here
return START_STICKY;
}
当设备运行使用电池供电几分钟后,它会进入休眠状态。该服务将偶尔重新启动,但不一致。我现在正在考虑的想法是:
但我希望没有必要。有谁知道实现此传感器记录功能的方法 运行 总是?
--
我还尝试将传感器侦听器更改为简单的重复线程,以防只有传感器进入休眠状态,但效果是一样的。我相信它只与 android
的电源管理有关
我知道这对能源效率的影响,但此应用程序有必要保证日志记录不间断且采样率高。
已编辑:更改标题以澄清
更新:将其转换为 persistent system application 没有帮助
我能够解决这个问题。实际上这是代码中的错误。我发布的片段中的 WakeLock 是一个局部变量,当函数 returns 时会被垃圾收集,因此实际上并没有锁。我通过更改此修复它:
public class MyService extends Service {
private PowerManager powerManager;
private static PowerManager.WakeLock wakeLock;
...
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
...
powerManager = (PowerManager) getSystemService(POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakelockTag");
wakeLock.acquire();
...
}
我正在尝试为 android 应用程序编写一个服务,该应用程序以固定采样率 连续 监控加速度传感器值。下面是我用来保持服务 运行ning.
的代码片段public class MyService extends Service {
...
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
Intent mainIntent = new Intent(this, MainActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(MainActivity.class);
stackBuilder.addNextIntent(mainIntent);
PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
Notification notification = new Notification.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(getString(R.string.app_name))
.setAutoCancel(true)
.setOngoing(true)
.setContentIntent(pendingIntent)
.setContentText(TAG)
.build();
context.startForeground(1, notification);
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakelockTag");
wakeLock.acquire();
//Register Accelerometer Sensor Listener Here
return START_STICKY;
}
当设备运行使用电池供电几分钟后,它会进入休眠状态。该服务将偶尔重新启动,但不一致。我现在正在考虑的想法是:
但我希望没有必要。有谁知道实现此传感器记录功能的方法 运行 总是?
--
我还尝试将传感器侦听器更改为简单的重复线程,以防只有传感器进入休眠状态,但效果是一样的。我相信它只与 android
的电源管理有关我知道这对能源效率的影响,但此应用程序有必要保证日志记录不间断且采样率高。
已编辑:更改标题以澄清
更新:将其转换为 persistent system application 没有帮助
我能够解决这个问题。实际上这是代码中的错误。我发布的片段中的 WakeLock 是一个局部变量,当函数 returns 时会被垃圾收集,因此实际上并没有锁。我通过更改此修复它:
public class MyService extends Service {
private PowerManager powerManager;
private static PowerManager.WakeLock wakeLock;
...
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
...
powerManager = (PowerManager) getSystemService(POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakelockTag");
wakeLock.acquire();
...
}