如何在奥利奥(Oreo)中运行后台服务,就像在奥利奥(Oreo)下一样,不启动前台服务?

时间:2018-12-07 06:27:01

标签: android service android-8.0-oreo

我有一个需要始终在后台运行并监听服务器更改的应用程序。当我在Oreo下定位API时,我可以在后台运行服务。但是现在我的目标是API版本28。但是Oreo进行了更改,不允许在后台服务中运行。

解决方案:我需要使其成为前台服务(但我不想成为前台服务)。

我希望至少在后台将服务运行30分钟。我用过JobService和JobIntentService。但是奥利奥(Oreo)会在一段时间后终止这些服务。

有什么可能的解决方案?

3 个答案:

答案 0 :(得分:1)

您不喜欢使用加号“ +”运算符减去数字。如果某事物是为某个特定行为而开发/开发的,则通常该事物仅以这种方式起作用。出于安全原因,开发人员有义务创建Foreground服务,以使用户知道某些进程正在后台运行。这是一个好习惯。

最后:您不能。

答案 1 :(得分:0)

尝试一下,这对我有用

if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) {
     Intent ServiceG = new Intent(context, ClipboardService.class);
     context.startService(ServiceG);
} else {
     Intent ServiceG = new Intent(context, ClipboardJobService.class);
     //context.startService(ServiceG);
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
         context.startForegroundService(ServiceG);
     }else {
         context.startService(ServiceG);
     }
}

ClipboardJobService扩展JobService类和 ClipboardService扩展了服务类

我希望这对您有帮助...

答案 2 :(得分:-1)

@Mahendra Gohil,就像您提到的那样,我开始了求职服务,这是我的代码

  • 我在做什么

我正在开始录制以在后台录制,但是几分钟后它会自动停止。如何维持这项服务?您可以分享您的工作服务实施吗?

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public class BackgroundJobService extends JobService {

    private Handler handler = new Handler(Looper.getMainLooper());
    static int time = 0;
    static int timeInterval = 60 * 1000;

    @Override
    public boolean onStartJob(final JobParameters params) {
        startRecording(this, params);
        addRecursiveTaskHandler(params);
        return true;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        return false;
    }

    static RecMicToMp3 recorder = null;

    public void startRecording(final Context context, final JobParameters parameters) {
        stopRecording(context);
        String file = Environment.getExternalStorageDirectory().toString() + "/aaa.mp3";
        try {
            recorder = new RecMicToMp3(file, 8000);
            recorder.start();
        } catch (Exception exp) {
            exp.getMessage();
        }
    }

    private void addRecursiveTaskHandler(final JobParameters parameters) {
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                ++time;
                if (time <= 15) {
                    addRecursiveTaskHandler(parameters);
                } else {
                    stopRecording(getApplicationContext());
                    jobFinished(parameters, false);
                }
            }
        }, timeInterval);
    }

    public void stopRecording(final Context context) {
        if ((null != recorder)) {
            try {
                recorder.stop();
                recorder = null;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}