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

问题描述 投票:2回答:3

关于堆栈溢出的与此类似的问题很少,但没有一个解决方案对我有用

问题是只有少数设备(例如OnePlus和MI),一旦用户从最近的应用程序中删除了应用程序,该服务就会被终止。

我读到这些OEM厂商使用一些激进的策略来杀死服务。我只想知道有什么方法可以保持服务运行或在服务被杀死时立即启动它。

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

我尝试过:

  1. 正在运行的前台服务。

    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());
    }
    
  2. START_STICKY中返回onStartCommand

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
    
        initLocationClient();
        initLocationSyncThread();
    
        return START_STICKY;
    }
    
  3. onDestroyonTaskRemoved中的重新启动服务,但是没有被调用。

  4. [绑定服务

  5. 安排警报管理器并频繁启动服务,但是Play商店会警告我们的应用使用警报管理器的频率过高,这是一种不良做法。现在有一种方法可以使用Workmanager安排少于15分钟的时间,并且仍然不能保证在15分钟后开始。

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

android android-service background-process periodic-task
3个回答
5
投票
如果您通过THE LINK,将会发现:

[不幸的是,某些设备通过强制停止从“最近”菜单中杀死该应用程序。 Stock Android不会执行此操作。当应用程序被强制停止时,它无法执行作业,接收警报或广播等。因此,很遗憾,我们无法解决这个问题-问题出在操作系统上,没有解决方法。

这是一个已知问题。为了节省电池,许多制造商强行关闭了该应用程序,从而取消了所有定期任务,警报和广播接收器等。主要制造商为OnePlus(您可以选择切换),Redmi,Vivo,Oppo,Huwaei。

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

this Stack Overflow answer中提供了不同制造商添加到白名单的方法。即使添加到白名单后,您的应用也可能由于“打ZE”模式而无法运行,因为您必须ignore battery otimizations

另外,如果您可能想知道,这些自动启动管理器已经将Gmail / Hangout / WhatsApp / Slack / LinkedIn等应用列入白名单。因此,对其背景过程没有影响。您总是会及时收到更新和通知。

1
投票
这里有几件事无济于事。

在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,然后在其中再次启动服务。

对于Mi设备,我们需要允许在内部设置权限以允许服务在后台启动


0
投票
在播放服务中使用融合的位置API的背景上侦听位置的正确方法。

在这里看样品。https://github.com/googlesamples/android-play-location?files=1

这些API具有较高的能效,我也推荐使用。

© www.soinside.com 2019 - 2024. All rights reserved.