我有一个应用程序,每隔5分钟在后台使用定位服务。我们正在前台服务中使用Fusedlocationproviderclient。当应用程序处于打开状态时,它工作正常。
当我把应用程序放在后台或从后台滑动杀死时,前台服务会被Android8.0及更高版本的操作系统自动杀死。
我们在三星note 8、one plus 5t和red mi设备中面临问题。
请告诉我如何实现与所有设备兼容的服务。
这是我的位置服务类。
public class TrackingForgroundService extends Service {
private final long UPDATE_INTERVAL = (long) 2000;
private static final long FASTEST_INTERVAL = 2000;
public BookingTrackingForgroundService() {
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (intent != null) {
String action = intent.getAction();
switch (action) {
case ACTION_START_FOREGROUND_SERVICE:
startForegroundService();
break;
case ACTION_STOP_FOREGROUND_SERVICE:
stopForegroundService();
break;
}
}
return START_STICKY;
}
private class TimerTaskToGetLocation extends TimerTask {
@Override
public void run() {
mHandler.post(new Runnable() {
@Override
public void run() {
// Call webservice evry 5 minute
}
});
}
}
private void startForegroundService() {
Log.d(TAG_FOREGROUND_SERVICE, "Start foreground service.");
context = this;
startLocationUpdates();
notify_interval1 = Prefs.with(this).readLong("notify_interval1", 5000);
mTimer = new Timer();
mTimer.scheduleAtFixedRate(new TimerTaskToGetLocation(), 15000, notify_interval1);
mTimer.scheduleAtFixedRate(new TimerTaskToSendCsvFile(), 60000, 1200000);
prefsPrivate = getSharedPreferences(Constants.prefsKeys.PREFS_PRIVATE, Context.MODE_PRIVATE);
internet = new NetConnectionService(context);
Intent notificationIntent = new Intent(this, ActTherapistDashboard.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle(getString(R.string.app_name))
.setContentText("Geolocation is running")
.setTicker("Geolocation").setSmallIcon(R.drawable.app_small_icon_white)
.setContentIntent(pendingIntent);
Notification notification = builder.build();
if (Build.VERSION.SDK_INT >= 26) {
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT);
channel.setDescription(CHANNEL_DESCRIPTION);
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.createNotificationChannel(channel);
}
startForeground(SERVICE_ID, notification);
}
private void stopForegroundService() {
stopLocationUpdates();
Log.d(TAG_FOREGROUND_SERVICE, "Stop foreground service.");
if (mTimer != null) {
mTimer.cancel();
} else {
mTimer = null;
}
// Stop foreground service and remove the notification.
stopForeground(true);
// Stop the foreground service.
stopSelf();
}
public static boolean isServiceRunningInForeground(Context context, Class<?> serviceClass) {
ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if (serviceClass.getName().equals(service.service.getClassName())) {
if (service.foreground) {
return true;
}
}
}
return false;
}
private void startLocationUpdates() {
// create location request object
mLocationRequest = LocationRequest.create();
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mLocationRequest.setInterval(UPDATE_INTERVAL);
mLocationRequest.setFastestInterval(FASTEST_INTERVAL);
// initialize location setting request builder object
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
builder.addLocationRequest(mLocationRequest);
LocationSettingsRequest locationSettingsRequest = builder.build();
// initialize location service object
SettingsClient settingsClient = LocationServices.getSettingsClient(this);
Task<LocationSettingsResponse> task = settingsClient.checkLocationSettings(locationSettingsRequest);
task.addOnSuccessListener(new OnSuccessListener<LocationSettingsResponse>() {
@Override
public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
registerLocationListner();
}
});
}
private void registerLocationListner() {
locationCallback = new LocationCallback() {
@Override
public void onLocationResult(LocationResult locationResult) {
super.onLocationResult(locationResult);
onLocationChanged(locationResult.getLastLocation());
}
};
//location permission
LocationServices.getFusedLocationProviderClient(this).requestLocationUpdates(mLocationRequest, locationCallback, null);
}
private void onLocationChanged(Location location) {
if (location != null) {
latitude = location.getLatitude();
longitude = location.getLongitude();
latitudeTemp = latitude;
longitudeTemp = longitude;
}
}
}
请参阅此处对类似问题的回答以及链接的网站dontkillmyapp,该网站为开发人员提供了非常有用的摘要,以帮助他们了解不同手机制造商和Android操作系统版本的这个问题。
如何在Android奥利奥继续后台服务而不显示通知点?我使用通知继续我的后台服务,但我不想显示运行服务的通知。
Firebase onMessageReceived从未在应用程序未运行时调用,并从最近的应用程序列表中删除。我正在使用Firebase并从服务器向我的应用程序发送数据负载通知,我尝试使用JobScheduler每隔1分钟启动一次MyFirebaseMessagingService以防系统关闭我的服务,但这种方法在一加3上对我不起作用。我知道android增加了后台服务的限制来优化电池使用,但是这
问题内容: 如何在不显示通知点的情况下继续在Android Oreo中进行后台服务?我使用通知继续后台服务,但我不想显示正在运行的服务的通知。 问题答案: 如果您可以在此处的某处正确阅读 Android Oreo 8.0 文档,则可能未在此处发布此问题。 步骤1: 确保您将服务作为前台启动,如以下代码所示 步骤2: 使用通知显示您的服务正在运行。在的方法中的代码下面添加一行。 步骤3:在服务停止或
更长的版本:我有一个“提醒”通知,在用户设定的一天的特定时间发出。到目前为止,我已经使用警报管理器在设定的时间发布通知。这会向用户发送一个通知,即使应用程序在后台。但在Android Oreo/8.0中,这是不允许的。大多数后台服务、接收器等都相当有限。我已经设置了一个作业调度程序,但不允许有一个确切的时间。作业计划程序中的定期设置不能提前到特定时间设置。因此,尽管Android声称作业调度器是警
我创建了一个跟踪设备移动位置的服务。服务由绑定到它的活动启动,在该活动中有一个“开始跟踪”按钮。当按下这个按钮时,我需要服务在前台启动,这样它就可以存储设备移动到的位置,即使与它绑定的活动已经关闭,或者应用程序被最小化。 以下是我的服务:
我们在让后台服务工作方面遇到了一些麻烦。即使在应用程序关闭和手机锁定的情况下,计时器也应该每秒执行一次代码。只要应用程序打开或在后台,手机正在使用,这就可以正常工作,但当手机被锁定并处于待机状态时,服务会在一段时间后自动停止。 代码是根据以下示例建模的:http://arteksoftware.com/backgrounding-with-xamarin-forms/ 然后,在PCL中: 最后,当