studio servicios segundo plano android android-notifications android-8.0-oreo foreground-service

servicios - foreground service android



Oreo-El servicio de primer plano no muestra la notificación de primer plano (2)

Codigo en kotlin

private fun customNotification(title: String,notificationID: Int) { val intent = Intent(this, MainActivity::class.java) val pendingIntent = PendingIntent.getActivity(this, 0 /* request code */, intent, PendingIntent.FLAG_UPDATE_CURRENT) val builder = NotificationCompat.Builder(this, title) .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)) .setContentText("Notification description") .setSmallIcon(R.drawable.ic_mark_map) .setContentIntent(pendingIntent) .setOnlyAlertOnce(true) val mNotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val channel = NotificationChannel(title, "Channel human readable title", NotificationManager.IMPORTANCE_DEFAULT) mNotificationManager.createNotificationChannel(channel) } val notification = builder.build() startForeground(notificationID, notification) }

Utilizar:

customNotification("Title",101)

Hasta ahora, he adjuntado mi código para usar ContextCompat.startForegroundService(context, intentService); para iniciar mi servicio. De esta manera, funciona en android <26 y también en android 26 (Oreo).

Todavía veo una diferencia, en Android oreo no veo mi notificación personalizada en primer plano (solo veo la notificación "la aplicación se está ejecutando en segundo plano"). ¿Tengo que ajustar algo allí también?

Mi servicio se ve así:

public class BaseOverlayService extends Service { @Override public void onCreate() { super.onCreate(); moveToForeground(); } private void moveToForeground() { Notification notification = ...; super.startForeground(NOTIFICATION_ID, notification); } }

Ejemplo oficial

Este ejemplo ( https://github.com/googlesamples/android-play-location/blob/master/LocationUpdatesForegroundService/app/src/main/java/com/google/android/gms/location/sample/locationupdatesforegroundservice/LocationUpdatesService.java#L200 ) muestra como comentario, que debería usar siguiente, pero startServiceInForeground no existe ...

if (Build.VERSION.SDK_INT == Build.VERSION_CODES.O) { NotificationManager mNotificationManager = ((NotificationManager) getSystemService(NOTIFICATION_SERVICE)); mNotificationManager.startServiceInForeground(new Intent(this, BaseOverlayService.class), NOTIFICATION_ID, notification); } else { startForeground(NOTIFICATION_ID, notification); }

Editar

Mi notificación se crea así, que está funcionando en miles de dispositivos Android con API <26 hasta ahora:

protected Notification foregroundNotification(int notificationId) { boolean paused = MainApp.getPrefs().sidebarServicePaused(); NotificationCompat.Builder builder = new NotificationCompat.Builder(this); builder.setSmallIcon(R.drawable.icon_not); builder.setContentIntent(notificationIntent()); builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.icon)); builder.setContentTitle(getString(R.string.derived_app_name)); builder.setContentText(getString(checkStatus() ? (paused ? R.string.service_notification_text_paused : R.string.service_notification_text_running) : R.string.service_notification_text_preparing)); builder.setColor(Color.parseColor("#25baa2")); if (MainApp.getPrefs().hideNotificationIcon()) builder.setPriority(NotificationCompat.PRIORITY_MIN); else builder.setPriority(NotificationCompat.PRIORITY_MAX); if (paused) builder.addAction(R.drawable.ic_play_arrow_black_24dp, getString(R.string.resume), resumeIntent(this)); else builder.addAction(R.drawable.ic_pause_black_24dp, getString(R.string.pause), pauseIntent(this)); return builder.build(); }


Es posible que deba definir el Canal de notificación para su aplicación. Revise el registro, debe haber una advertencia. Compruebe this para la introducción

Te voy a dar un ejemplo, sería en kotin. Primero, haz una clase como esta. Deberá llamar a createMainNotificationChannel () una vez al inicio de su aplicación.

class NotificationManager(private val context: Context) { companion object { private val CHANNEL_ID = "YOUR_CHANNEL_ID" private val CHANNEL_NAME = "Your human readable notification channel name" private val CHANNEL_DESCRIPTION = "description" } @RequiresApi(Build.VERSION_CODES.O) fun getMainNotificationId(): String { return CHANNEL_ID } @RequiresApi(Build.VERSION_CODES.O) fun createMainNotificationChannel() { val id = CHANNEL_ID val name = CHANNEL_NAME val description = CHANNEL_DESCRIPTION val importance = android.app.NotificationManager.IMPORTANCE_LOW val mChannel = NotificationChannel(id, name, importance) mChannel.description = description mChannel.enableLights(true) mChannel.lightColor = Color.RED mChannel.enableVibration(true) val mNotificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as android.app.NotificationManager mNotificationManager.createNotificationChannel(mChannel) } }

Entonces puedes usar util como este

fun createNotificationCompatBuilder(context: Context): NotificationCompat.Builder { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { return NotificationCompat.Builder(context, NotificationManager(context).mainNotificationId) } else { return NotificationCompat.Builder(context) } }