在后台更新位置的后台服务
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) 工作经理
这种方法不太可靠,因为您将无法控制调用它的确切时间,但如果您根本不想向用户显示通知,则可以使用这种方法。
它会杀死后台服务,要解决您的问题,您应该使用前台服务。
我的后台粘性服务在 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) 工作经理
这种方法不太可靠,因为您将无法控制调用它的确切时间,但如果您根本不想向用户显示通知,则可以使用这种方法。