Reputation: 149
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