Estoy creando una aplicación de Android donde necesito comenzar una actividad desde el fondo. Estoy usando un ForegroundStarter que extiende el Servicio para lograr esto. Tengo una actividad Adscreen.class que necesito ejecutar desde mi servicio de primer plano. La actividad Adscreen.class funciona bien (comienza desde el fondo) en todas las versiones de Android, excepto Android 10.
ForeGroundStarter.class
public class ForeGroundStarter extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
Log.d("sK", "Inside Foreground");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("sK", "Inside Foreground onStartCommand");
Intent notificationIntent = new Intent(this, Adscreen.class);
PendingIntent pendingIntent =
PendingIntent.getActivity(this, 0, notificationIntent, 0);
Notification notification =
null;
//Launching Foreground Services From API 26+
notificationIntent = new Intent(this, Adscreen.class);
pendingIntent =
PendingIntent.getActivity(this, 0, notificationIntent, 0);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
String NOTIFICATION_CHANNEL_ID = "com.currency.usdtoinr";
String channelName = "My Background Service";
NotificationChannel chan = null;
chan = new NotificationChannel(NOTIFICATION_CHANNEL_ID, channelName, NotificationManager.IMPORTANCE_NONE);
chan.setLightColor(Color.BLUE);
chan.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
assert manager != null;
manager.createNotificationChannel(chan);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID);
notification = notificationBuilder.setOngoing(true)
.setSmallIcon(R.drawable.nicon)
.setContentTitle("")
.setPriority(NotificationManager.IMPORTANCE_MIN)
.setCategory(Notification.CATEGORY_SERVICE)
.build();
startForeground(2, notification);
Intent dialogIntent = new Intent(this, Adscreen.class);
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(dialogIntent);
Log.d("sk", "After startforeground executed");
}
else //API 26 and lower
{
notificationIntent = new Intent(this, Adscreen.class);
pendingIntent =
PendingIntent.getActivity(this, 0, notificationIntent, 0);
notification =
new Notification.Builder(this)
.setContentTitle("")
.setContentText("")
.setSmallIcon(R.drawable.nicon)
.setContentIntent(pendingIntent)
.setTicker("")
.build();
startForeground(2, notification);
Intent dialogIntent = new Intent(this, Adscreen.class);
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(dialogIntent);
}
return super.onStartCommand(intent, flags, startId);
}
}
Leí que hay algunas restricciones para iniciar actividades desde el fondo en Android 10. Este código ya no parece funcionar. https://developer.android.com/guide/components/activities/background-starts
Intent dialogIntent = new Intent(this, Adscreen.class);
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(dialogIntent);
¿Alguna solución para comenzar una actividad desde segundo plano en Android 10?
android
foreground-service
SK707
fuente
fuente
Respuestas:
No estoy seguro de si es correcto hacerlo de esta manera, pero no tuve suficiente tiempo (la aplicación es solo para uso interno de la empresa).
Usé permisos:
y luego cada usuario debe ir a la configuración -> permisos de la aplicación y luego marcar la casilla en la configuración avanzada para la función "mostrar la aplicación sobre otros"
Perdón por mi inglés o no es exactamente la solución correcta, pero funcionó, por lo que es una buena revisión para mí.
En Pixel 4 se verá así:
fuente
Como mencionó Restricciones para iniciar actividades desde el fondo
Se indica que
También mencionaron en su nota que es eso.
Esto significa que si está utilizando un servicio en primer plano para iniciar una Actividad, todavía considera que la aplicación está en segundo plano y no iniciará una Actividad de la aplicación.
Solución: en primer lugar, no puede iniciar la aplicación si se ejecuta en segundo plano desde Android 10 (nivel de API 29) y superior. Han proporcionado una nueva forma de superar este comportamiento, que es que en lugar de llamar a la aplicación, puede mostrar una notificación de alta prioridad con una intención de pantalla completa .
La intención de pantalla completa se comporta como si la pantalla de su dispositivo estuviera apagada. Iniciará la actividad de la aplicación que desea. pero si su aplicación está en segundo plano y la pantalla está encendida, solo mostrará una notificación. Si hace clic en la notificación, se abrirá su aplicación.
Para obtener más información sobre la notificación de alta prioridad y la intención de pantalla completa, puede consultarla aquí Mostrar notificaciones urgentes
fuente
Debe incluir a AndroidManifest.xml debajo del permiso.
fuente