android服务日志传感器数据不间断

时间:2016-07-12 10:14:50

标签: java android service wakelock

我正在尝试为Android应用程序编写一项服务,该应用程序以固定的采样率连续加速计传感器值进行监控。下面是我用来保持服务运行的代码片段。

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无济于事

1 个答案:

答案 0 :(得分:0)

我能够解决这个问题。实际上这是代码中的错误。我发布的片段中的WakeLock是一个局部变量,当函数返回时会收集垃圾,所以实际上并没有锁定。我通过修改它来修复它:

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();
        ...
}