#android #android-intent #android-service #android-notifications #foreground-service
#Android #android-намерение #android-сервис #android-уведомления #передний план-сервис
Вопрос:
Я хочу запустить фоновую службу так, чтобы она продолжала работать, даже если приложение закрыто,
Для этого я сделал запуск службы зависшим и превратил его в процесс. Затем проблема сохраняется, поэтому я провел некоторое исследование и обнаружил, что на последних устройствах Android мы должны запускать такие службы на переднем плане: — используя startForegroundService для запуска службы, -и startForeground в onStartCommand службы, -показывая уведомление с постоянным каналом.
Я сделал это, но та же проблема, уведомление для службы переднего плана не отображается,
Команда onStartCommand моей службы :
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent,flags,startId);
Intent intent2 = new Intent(this, RDVSearchService.class);
intent2.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent2, 0);
Notification.Builder builder = new Notification.Builder(getApplicationContext())
.setContentTitle("Pratikk")
.setContentText("Subject")
.setSmallIcon(R.drawable.ok_done)
.setContentIntent(pendingIntent);
Notification notif;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
notif = builder.build();
}else{
notif = builder.getNotification();
}
startForeground(1234, notif);
return START_STICKY;
}
как я запускаю службу :
Intent intent = new Intent(context, RDVSearchService.class);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
context.startForegroundService(intent);
}else{
context.startService(intent);
}
Мое объявление службы в манифесте :
<service
android:name=".services.RDVSearchService"
android:exported="false"
android:process=":rdv_search" />
Ответ №1:
Начиная с Android 8.0, необходимо создать канал.
String channelId = "channelId";
NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext(), channelId)
.setContentTitle("Pratikk")
.setContentText("Subject")
.setSmallIcon(R.drawable.ok_done)
.setContentIntent(pendingIntent);
startForeground(1234, builder.build());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(channelId,
"name", NotificationManager.IMPORTANCE_LOW);
channel.setDescription("description");
channel.enableLights(false); // light
channel.enableVibration(false); // vibration
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
if (manager != null) {
manager.createNotificationChannel(channel);
}
}