Java 前台服务在几个小时后停止

Java 前台服务在几个小时后停止,java,android,google-contacts-api,foreground-service,Java,Android,Google Contacts Api,Foreground Service,我有一个应用程序,使用3个前台服务来扫描和处理BluetoothLeScanner的信标。其中只有一个具有扫描它们的代码,其他两个服务处理扫描的信标并进行一些api调用。 几个小时后,前台服务停止工作,并显示通知 通过ScanResult上的ScanCallback进行扫描。扫描每5分钟重新启动一次,以避免Android停止扫描 我用START\u STICKY运行前台服务。我制作了一个广播接收器,在调用onDestroy()方法时重新启动服务 @Override public voi

我有一个应用程序,使用3个前台服务来扫描和处理BluetoothLeScanner的信标。其中只有一个具有扫描它们的代码,其他两个服务处理扫描的信标并进行一些api调用。 几个小时后,前台服务停止工作,并显示通知

通过ScanResult上的ScanCallback进行扫描。扫描每5分钟重新启动一次,以避免Android停止扫描

我用START\u STICKY运行前台服务。我制作了一个广播接收器,在调用onDestroy()方法时重新启动服务

 @Override
    public void onCreate() {
        Log.i("EntryDetectionService", "Starting Service");
        super.onCreate();
        if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            String CHANNEL_ID = "Beacon Reader";
            String CHANNEL_NAME = "Scanning Beacons";

            NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH);
            ((NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE)).createNotificationChannel(channel);

            Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
                    .setCategory(Notification.CATEGORY_SERVICE).setPriority(PRIORITY_HIGH)
                    .setSmallIcon(R.drawable.ic_launcher)
                    .build();

            startForeground(101, notification);
        }
    }
ScanSettings=new ScanSettings.Builder()
.setScanMode(扫描设置.SCAN\u模式\u低延迟)
.build();
列表过滤器=新的ArrayList();
ScanFilter filter=new ScanFilter.Builder()
.setManufacturerData(76,新字节[]{})
.build();
过滤器。添加(过滤器);
if(bluetoothAdapter.isEnabled())
bleScanner.startScan(过滤器、设置、扫描回调);
谢谢

让应用程序保持活动状态 当api>21时,您可以使用

某些设备可能会使应用程序保持活动状态

开始作业时检查服务是否有效

public boolean isServiceRunning(Context context, String serviceName) {
        boolean isRunning = false;
        ActivityManager am = (ActivityManager) this
            .getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> lists = am.getRunningAppProcesses();

        for (ActivityManager.RunningAppProcessInfo info : lists) {
            System.out.println(info.processName);
            if (info.processName.equals(serviceName)) {
                isRunning = true;
            }
        }
        return isRunning;

    }
public boolean isServiceRunning(上下文上下文,字符串serviceName){
布尔值isRunning=false;
ActivityManager am=(ActivityManager)此
.getSystemService(Context.ACTIVITY\u服务);
List List=am.getRunningAppProcesses();
对于(ActivityManager.RunningAppProcessInfo:列表){
System.out.println(info.processName);
if(info.processName.equals(serviceName)){
isRunning=true;
}
}
返回正在运行;
}
让应用程序保持活动状态 当api>21时,您可以使用

某些设备可能会使应用程序保持活动状态

开始作业时检查服务是否有效

public boolean isServiceRunning(Context context, String serviceName) {
        boolean isRunning = false;
        ActivityManager am = (ActivityManager) this
            .getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> lists = am.getRunningAppProcesses();

        for (ActivityManager.RunningAppProcessInfo info : lists) {
            System.out.println(info.processName);
            if (info.processName.equals(serviceName)) {
                isRunning = true;
            }
        }
        return isRunning;

    }
public boolean isServiceRunning(上下文上下文,字符串serviceName){
布尔值isRunning=false;
ActivityManager am=(ActivityManager)此
.getSystemService(Context.ACTIVITY\u服务);
List List=am.getRunningAppProcesses();
对于(ActivityManager.RunningAppProcessInfo:列表){
System.out.println(info.processName);
if(info.processName.equals(serviceName)){
isRunning=true;
}
}
返回正在运行;
}
public boolean isServiceRunning(Context context, String serviceName) {
        boolean isRunning = false;
        ActivityManager am = (ActivityManager) this
            .getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> lists = am.getRunningAppProcesses();

        for (ActivityManager.RunningAppProcessInfo info : lists) {
            System.out.println(info.processName);
            if (info.processName.equals(serviceName)) {
                isRunning = true;
            }
        }
        return isRunning;

    }