中文 Android 设备终止后台服务

Chinese Android Devices Killing Background Service

我正在尝试 运行 android 应用程序中的后台服务。我已经尝试了这样做的标准方法和许多其他调整。问题是当应用程序从最近的应用程序关闭时,该服务被终止。这只发生在中国 Android 设备,如 Oppo、Vivo、Xiomi 等。它在所有其他品牌上工作正常。

我尝试了以下解决方案。

  1. 将 activity 的 OnStartCommand() 覆盖到 return START_STICKY。在按预期关闭应用程序后,这仍然不会重新启动 activity。

    @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
    
            return START_STICKY;
        }
    
  2. 将应用程序添加到节电例外,以便在DOZE模式下不会关闭它以节省电池。

  3. 通过 phone 的安全设置将应用程序权限授予 Auto-Start

  4. 将服务作为前台服务启动,包括持续通知。

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        String input = intent.getStringExtra("inputExtra");
        createNotificationChannel();
        Intent notificationIntent = new Intent(this, MainActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(this,
                0, notificationIntent, 0);
        Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
                .setContentTitle("Foreground Service")
                .setContentText(input)
                .setSmallIcon(R.drawable.ic_launcher_foreground)
                .setContentIntent(pendingIntent)
                .build();
        startForeground(1, notification);
        //do heavy work on a background thread
        //stopSelf();
        return START_NOT_STICKY;
    }
    
  5. 实现了在 onTaskRemoved()onDestroy() 服务方法中终止服务后启动服务的警报管理器方法。

    <service
         android:name=".MyService"
         android:enabled="true"
         android:exported="true"
         android:stopWithTask="false" />
    
    @Override
        public void onTaskRemoved(Intent rootIntent){
            Log.d("Service:","I am being closed!");
            Intent restartServiceIntent = new Intent(getApplicationContext(), this.getClass());
            restartServiceIntent.setPackage(getPackageName());
    
            PendingIntent restartServicePendingIntent = PendingIntent.getService(getApplicationContext(), 1, restartServiceIntent, PendingIntent.FLAG_ONE_SHOT);
            AlarmManager alarmService = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
            alarmService.set(
                    AlarmManager.ELAPSED_REALTIME,
                    SystemClock.elapsedRealtime() + 1000,
                    restartServicePendingIntent);
            super.onTaskRemoved(rootIntent);
        }
    
  6. 我也尝试过使用广播管理器启动我的服务,在它关闭时接收来自 activity 的广播。

    <receiver
         android:name=".SensorRestarterBroadcastReceiver"
         android:enabled="true"
         android:exported="true"
         android:label="RestartServiceWhenStopped"
         />
    
    public class SensorRestarterBroadcastReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.i(SensorRestarterBroadcastReceiver.class.getSimpleName(), "Service Stops!");
            context.startService(new Intent(context, MyService.class));;
        }
    }
    

但是,在这些中文设备中,服务并没有再次启动。而 Whatsapp、Facebook 和一些著名应用程序的后台服务 return 在关闭应用程序几分钟后。请建议实现此目的的正确方法。

我已经尝试过 Background Service is not restarting after killed in oppo, vivo, mi android version 7.1.2 中提供的解决方案,如上所述。它没有解决我的问题。

这些品牌都有可以正常存活的应用白名单。如果您的应用不在白名单中 os 强制停止任何在最近使用屏幕上滑动的应用。您必须告诉用户手动将您的应用添加到白名单。

这主要是为了优化电池和提高 phone 性能,

您已经尝试了我的 solution 但您在某些设备上仍然遇到这个问题, 所以这是从最近的应用程序列表中滑动杀死应用程序的替代解决方案,

  1. 要求用户向下滑动应用程序,将应用程序锁定为白名单,不会被杀死

  1. 为清单中的每个 activity 添加以下行,这将从最近的应用列表中隐藏您的应用。因此用户无法从最近的应用列表中滑动应用。

    android:excludeFromRecents="true"