我已经在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
答案 0 :(得分:1)
最近,在ThomasKünneth(各种Android书籍的作者)提出了必要的建议之后,我找到了解决方案。补救措施不是在源代码中,而是在智能手机的设置中。有一个启用后台处理的选项。在装有Android 8.0的华为P10 Lite上,它位于以下菜单树中(可能其他设备或android版本具有类似的选项):
就这样,很简单-如果您知道怎么做。
引人注目的是,谷歌提供了此选项,但并未在有关Android 8的讲座中重点介绍。当然,这与新政策“电池优先” 一致。