2

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

我尝试了以下解决方案。

  1. 覆盖OnStartCommand()活动返回START_STICKY。在应用程序按预期关闭后,这仍然不会重新启动活动。

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

  3. 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. 我还尝试使用广播管理器来启动我的服务,在活动关闭时接收来自活动的广播。

    <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 和一些著名应用程序的后台服务返回。请提出正确的方法来实现这一点。

我已经尝试过后台服务提供的解决方案在 oppo、vivo、mi android 版本 7.1.2中被杀死后没有重新启动,如上所述。它不能解决我的问题。

4

2 回答 2

2

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

正如您已经尝试过我的解决方案,但您仍然在某些设备中遇到此问题,所以这里有一个替代解决方案,用于从最近的应用程序列表中滑动时杀死应用程序,

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

或者

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

    android:excludeFromRecents="true"

于 2020-04-10T08:39:24.200 回答
0

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

于 2020-04-04T12:17:07.660 回答