【问题标题】:How to run background Service in Oreo Just like below oreo without starting foreground service?如何在奥利奥中运行后台服务就像下面的奥利奥而不启动前台服务?
【发布时间】:2018-12-07 06:27:01
【问题描述】:

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

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

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

对此有什么可能的解决方案?

【问题讨论】:

  • "I need to make it foreground service ( but I don't want to make a foreground service )." - 这真的没有意义 - 前台服务有什么问题?那个小通知图标?
  • 如果应用程序崩溃,请分享您的 logcat。向我们展示一些我们可以更好理解的代码。
  • @pskink 前台服务没有错。实际上,这是我们不想显示前台服务通知的要求。
  • 有一个解决方案,我们可以在Oreo以下设置min sdk版本。这样服务总是可以在后台运行。但我们需要让应用程序以最新的 API 版本 28 为目标。
  • 我想在后台运行Service,它会录制30分钟的音频而不显示通知。当我必须启动该服务时,我的应用程序处于后台。

标签: android service android-8.0-oreo


【解决方案1】:

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

结论:你不能。

【讨论】:

    【解决方案2】:

    试试这个,这对我有用

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

    希望对你有所帮助...

    【讨论】:

    • 你能分享一下 Job Service 的实现吗?
    • 我试过了 就像你提到的那样?但对我不起作用。您可以检查以下答案和代码
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-30
      • 1970-01-01
      • 2020-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多