Anurag Mishra
Anurag Mishra

Reputation: 149

How to make android Foreground Service Notification Sticky in Chinese ROMs?

I tried everything to run service in background using foreground service and it works on all devices except chinese devices like vivo, oppo, oneplus. These devices kills the service as soon as the app is killed from recent list.

Even the foreground notification is not sticky. It is swipeable. However, i want to show notification again as soon as it is cleared, Is there any way to do it?

For example i have seen in app like IDM (Internet download manager) when downloading any file the notification remain visible. Even if it is cleared the notification pops again.

How to get this type of functionality?

My Code:

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;
    }
}

Upvotes: 1

Views: 370

Answers (0)

Related Questions