如何在奥利奥中运行后台服务就像下面的奥利奥一样,不启动前台服务



我有一个应用程序,它需要始终在后台运行并侦听服务器更改。当我的目标API低于奥利奥,我可以在后台运行服务。但现在我的目标是API版本28。但奥利奥改变了不允许在后台运行的服务。

解决方案:我需要让它成为前台服务(但我不想做前台服务(。

我想至少在后台运行我的服务30分钟。我使用过JobService和JobIntentService。但奥利奥在一段时间后就终止了这些服务。

可能的解决方案是什么?

您不喜欢不能使用加号"+"运算符来减去数字。如果一个东西是为一种特定的行为而开发/创建的,那么这个东西只以这种方式工作是很常见的。出于安全原因,开发人员有义务创建Foreground服务,让用户知道有一些Process正在后台工作。这是一个很好的练习。

最后:你不能。

试试这个,这对我有效

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扩展了服务级别

我希望这能帮助你。。。

@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();
}
}
}
}

最新更新