在后台更新位置的后台服务

Background Service for update location in background

它会杀死后台服务,要解决您的问题,您应该使用前台服务。

我的后台粘性服务在 oreo 和 heigher 设备上被终止了 Activity 处于后台时在后台服务上获取位置的任何解决方案

您必须显示 ForegroundService 的通知

    public class ForegroundService extends Service {
    public static final String CHANNEL_ID = "ForegroundServiceChannel";
    @Override
    public void onCreate() {
        super.onCreate();
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        String input = intent.getStringExtra("inputExtra");
        createNotificationChannel();
        Intent notificationIntent = new Intent(this, MainActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(this,
                0, notificationIntent, 0);
        Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
                .setContentTitle("Foreground Service")
                .setContentText(input)
                .setSmallIcon(R.drawable.ic_stat_name)
                .setContentIntent(pendingIntent)
                .build();
        startForeground(1, notification);
        //do heavy work on a background thread
        //stopSelf();
        return START_NOT_STICKY;
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
    }
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

并添加权限

<uses-permissionandroid:name=”android.permission.FOREGROUND_SERVICE” />

您将无法 运行 在 Oreo 中长期 运行ning 后台服务,因为行为发生了变化,现在 Oreo 优化系统内存、电池等,它会杀死后台服务,以解决你的问题你应该使用前台服务。

查看后台执行限制https://developer.android.com/about/versions/oreo/android-8.0-changes

我的一个建议,如果你可以使用 FCM,那就去吧,因为像微信、Facebook 这样的应用程序使用它来传递通知,他们不会遇到任何问题。

由于客户要求 运行 在后台更新位置的服务,我选择了没有 FCM 的替代解决方案。以下是步骤:-

  • 您需要在 Oreo 及更高版本中启动显示通知的后台服务。
  • 之后你需要记住,一段时间后 phone 进入打瞌睡模式,所以你也必须解决这个问题
  • 此外,还必须为应用程序禁用电池优化。
  • 在某些自定义 ROM 中,如果服务被 android 杀死,您需要管理自动启动权限以重新启动服务。
  • 最重要的部分是,如果服务被 android 系统终止,则向广播接收器发送广播消息以重新启动您的服务

希望你们多做一些研发工作。 我已经分享了我的经验以及我对后台服务 运行 执行相同操作的过程。

这是因为 Android Oreo 后台执行的行为发生了变化。建议的替代方案是

1) 前台服务。

如果您在尝试使用 Location API 检索位置时可以向用户显示通知,请使用此选项。这将是可靠的,并且在文档中有建议。

Sample app from the documentation : LocationUpdatesForegroundService project on GitHub

An example of an app that allows the app to continue a user-initiated action without requesting all-the-time access to background location.

References
https://developer.android.com/training/location/receive-location-updates

2) 工作经理

这种方法不太可靠,因为您将无法控制调用它的确切时间,但如果您根本不想向用户显示通知,则可以使用这种方法。