服务在android 8下意外停止(oreo)

时间:2018-10-12 13:29:39

标签: java android service

我已经在Google Play商店中编写并发布了一个应用程序(“传感器记录”)。这是关于读取传感器数据(例如位置,加速度计,陀螺仪等),以数字或图形方式显示它们并将它们存储到kml和csv文件中以进行进一步处理的,例如使用Google Earth或MS Excel。我已经建立了一项服务,即使在屏幕关闭的情况下,也可以在后台读取和处理数据。

在Android 8之前,一切都可以正常工作。但是在Oreo中,该服务会由操作系统自动停止。屏幕关闭后5分钟。 Google故意引入此功能以节省电池寿命。我在互联网上发现了一些应该避免的措施,但到目前为止没有任何效果。

我做了什么:

1。)在呼叫活动中,我已将startService()替换为startForegroundService()

2。)在服务本身中,我根据发现的提示在onStartCommand()中进行了一些修改。

使用wakeLock进行的测试也没有结果。任何进一步的想法表示赞赏。

private NotificationManager notMan;

@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
    // show notification + startForeground

    int id = 42;
    String channelId = "42";
    String text = "Sensors active";

    Intent notificationIntent = new Intent(this, SensorService.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
    Notification notification;

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O)
    {
        NotificationChannel channel = new NotificationChannel(channelId,
                getString(R.string.app_name),
                NotificationManager.IMPORTANCE_DEFAULT);

        notMan = getSystemService(NotificationManager.class);

        notMan.createNotificationChannel(channel);

        Notification.Builder builder = new Notification.Builder(this, channelId);

        builder.setSmallIcon(R.drawable.vector3d_bg_transp)
                .setContentTitle("Sensor Service")
                .setContentText(text)
                .setTicker(text)
                .setSubText("Start Service")
                .setShowWhen(true);

        notification = builder.build();
    }
    else
    {
        notMan = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

        notification = new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.vector3d_bg_transp)
                .setContentTitle("Sensor Service")
                .setContentText(text)
                .setTicker(text)
                .setSubText("Start Service")
                .setPriority(PRIORITY_DEFAULT)
                .setShowWhen(true).build();
    }

    startForeground(id, notification);

    return super.onStartCommand(intent, flags, startId);    // = 1, same as START_STICKY
}  // onStartCommand

1 个答案:

答案 0 :(得分:1)

最近,在ThomasKünneth(各种Android书籍的作者)提出了必要的建议之后,我找到了解决方案。补救措施不是在源代码中,而是在智能手机的设置中。有一个启用后台处理的选项。在装有Android 8.0的华为P10 Lite上,它位于以下菜单树中(可能其他设备或android版本具有类似的选项):

  • 设置
  • 电池
  • 启动
  • 选择有问题的应用。
  • 将开关从“自动管理”设置为“手动管理”。
  • 在弹出菜单中将开关设置为“在后台运行”。

就这样,很简单-如果您知道怎么做。

引人注目的是,谷歌提供了此选项,但并未在有关Android 8的讲座中重点介绍。当然,这与新政策“电池优先” 一致。