有没有办法连续运行服务?

Posted

技术标签:

【中文标题】有没有办法连续运行服务?【英文标题】:Is there any way to run service continuously? 【发布时间】:2019-01-28 10:01:26 【问题描述】:

在 Stack Overflow 上几乎没有类似的问题,但没有一个解决方案对我有用

问题在于只有少数设备,如 OnePlus 和 MI,一旦用户从最近的应用中滑动应用,该服务就会被终止。

我了解到这些 OEM 使用一些激进的策略来终止服务。我只是想知道有什么方法可以让服务保持运行或在它被杀死后立即启动它。

我需要运行一项服务,该服务将在后台连续 (24/7) 提供位置(此应用仅适用于特定人群,因此无需担心电池寿命)。

我试过了:

    正在运行前台服务。

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) 
            startForegroundService(intent)
         else 
                startService(intent)
        
    

    同样在服务onCreate 方法以通知开始

    @Override
    public void onCreate() 
        Log.i("Service", "onCreate");
        startForeground(NOTIFICATION_ID, getnotification());
    
    

    onStartCommand中返回START_STICKY

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) 
    
        initLocationClient();
        initLocationSyncThread();
    
        return START_STICKY;
    
    

    onDestroyonTaskRemoved 中重新启动服务,但它们没有被调用。

    绑定服务

    调度警报管理器并频繁启动服务,但 Play 商店会警告我们的应用程序使用警报管理器过于频繁,这是一种不好的做法。而且现在有办法使用 workmanager 安排不到 15 分钟,但仍然不能保证在 15 分钟后开始。

那么除了上述选项之外,还有其他方法可以继续运行服务吗?

【问题讨论】:

相关***.com/questions/51289236/… 我从通知开始,但它仍然被杀死。 ***.com/a/43719950/7666442 @NileshRathod 也尝试过,但 onDestroy 没有被调用。 相关https://***.com/questions/53131441/a-foreground-service-gets-killed-and-notification-gets-removed-when-app-is-swipe和https://***.com/questions/53084293/android-kills-background-services-in-xiaomi-huawei-etc。 【参考方案1】:

如果你通过THE LINK,你会发现:

不幸的是,某些设备会从最近的菜单中终止应用程序作为强制停止。股票 Android 不这样做。当应用程序被强制停止时,它无法执行作业、接收警报或广播等。不幸的是,我们无法解决它 - 问题出在操作系统上,没有解决方法。

这是一个已知问题。很多厂商为了省电,强行关闭应用,取消所有的经期任务、闹钟、广播接收等。主要厂商有一加(可以选择切换)、红米、vivo、OPPO、华为。

这些设备中的每一个都有 AutoStartManagers/AutoLaunch/StartManager 类型的优化管理器。这会阻止后台活动重新开始。您必须手动要求用户将您的应用程序列入白名单,以便应用程序可以自动启动其后台进程。关注THIS 和THIS 链接,了解更多信息。

在this Stack Overflow answer中给出了不同制造商加入白名单的方法。即使添加到白名单后,您的应用也可能因为打盹模式而无法运行,为此您必须ignore battery otimizations

此外,如果您想知道,Gmail/Hangout/WhatsApp/Slack/LinkedIn 等应用程序已经被这些 AutoStart 管理器列入白名单。因此,对其后台进程没有影响。您总是会收到及时的更新和通知。

【讨论】:

dontkillmyapp.com 拥有每个设备的最新说明【参考方案2】:

这里有一些帮助不大的事情。

在AndroidManifest.xml中添加android:enabled="true"

<service
      android:name=".service.TrackingService"
      android:exported="false"
      android:enabled="true"
    />

内部服务添加闹钟2秒后再次唤醒。

@Override
public void onTaskRemoved(Intent rootIntent) 
    initAlarm();
    super.onTaskRemoved(rootIntent);


   private void initAlarm() 
    AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(this, StartServiceReceiver.class);
    PendingIntent alarmIntent = PendingIntent.getBroadcast(this, 0, intent, 0);

    alarmMgr.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
            SystemClock.elapsedRealtime() +
                    2000, alarmIntent);


创建一个接收器StartServiceReceiver 并在其中再次启动服务。

对于小米设备,我们需要在设置中允许权限以允许服务在后台启动

【讨论】:

如何在设备重启时启动这个前台服务【参考方案3】:

在后台监听位置的正确方法是使用来自播放服务的融合位置 API。

查看此处的示例。 https://github.com/googlesamples/android-play-location?files=1

这些 API 非常节能,我也会推荐它。

【讨论】:

请描述它对主题“有什么方法可以连续运行服务吗?”有帮助

以上是关于有没有办法连续运行服务?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法通过单击触发 Blazor 中的两个连续事件?

windows服务仍在运行但任务没有连续执行

在连续运行的 C 和 Python 应用程序之间传递数据

有没有办法在二维数组中提取连续特征

Python/Matplotlib - 有没有办法制作一个不连续的轴?

有没有办法以交互模式连续获取 python 文件?