Как сделать уведомление службы переднего плана Android липким в китайских ПЗУ?

#android #foreground-service #notification-channel #foregroundnotification

#Android #передний план-сервис #уведомление-канал #Уведомление переднего плана

Вопрос:

Я перепробовал все, чтобы запустить службу в фоновом режиме с помощью службы переднего плана, и это работает на всех устройствах, кроме китайских устройств, таких как vivo, oppo, oneplus. Эти устройства отключают службу, как только приложение удаляется из списка последних.

Даже уведомление переднего плана не является липким. Его можно прокручивать. Тем не менее, я хочу снова показать уведомление, как только оно будет очищено, есть ли какой-либо способ сделать это?

Например, я видел в приложении, подобном IDM (Internet download manager), при загрузке любого файла уведомление остается видимым. Даже если оно очищено, уведомление появляется снова.

Как получить этот тип функциональности?

Мой код:

MainActivity.java

 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void startService(View v) {
        Intent serviceIntent = new Intent(this, ExampleService.class);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            startForegroundService(serviceIntent);
        } else startService(serviceIntent);
    }

    public void stopService(View v) {
        Intent serviceIntent = new Intent(this, ExampleService.class);
        stopService(serviceIntent);
    }

}
  

ExampleService.java

 
    final Handler worker = new Handler();

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d("Foreground Service", "*********** Service Created ***********");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        worker.removeCallbacksAndMessages(null);
        Log.d("Foreground Service", "*********** Service Destroyed ***********");
    }

    @Override
    public int onStartCommand(final Intent intent, int flags, int startId) {
        Intent notificationIntent = new Intent(this, MainActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

        final NotificationCompat.Builder notification = new NotificationCompat.Builder(this, App.NOTIFICATION_CHANNEL_ID)
                .setContentTitle("Example Service")
                .setContentText("Working in background")
                .setSmallIcon(android.R.drawable.sym_def_app_icon)
                .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
                .setAutoCancel(false)
                .setOngoing(true)
                .setContentIntent(pendingIntent);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            notification.setCategory(Notification.CATEGORY_PROGRESS);
        }
        startForeground(1, notification.build());

        worker.post(new Runnable() {
            @Override
            public void run() {
                Log.i("Info", Thread.currentThread().getName());
                Toast toast = Toast.makeText(getApplicationContext(), "Service Ping", Toast.LENGTH_SHORT);
                toast.show();
                Log.d("Foreground Service", "*********** Service working ***********");
                worker.postDelayed(this, 5000);
            }
        });
        return START_STICKY;
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}