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