¿Cómo iniciar una actividad desde el fondo en Android 10?

12

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?

SK707
fuente
¿Alguna solución adecuada?
Vishal Patel
Descubre algo?
WorieN
¿Encontraste una solución?
Hamza Ezzaydia

Respuestas:

4

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:

<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

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í: ingrese la descripción de la imagen aquí

kamest
fuente
3

Como mencionó Restricciones para iniciar actividades desde el fondo

Se indica que

Android 10 (nivel de API 29) y las restricciones de lugar más altas sobre cuándo las aplicaciones pueden iniciar actividades cuando la aplicación se ejecuta en segundo plano.

También mencionaron en su nota que es eso.

Nota: A los efectos de iniciar actividades, una aplicación que ejecuta un servicio en primer plano todavía se considera "en segundo plano"

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

Muhammad Farhan
fuente
2

Debe incluir a AndroidManifest.xml debajo del permiso.

<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
mimu120
fuente
También soy Frente a este problema, pero esta solución no funciona para mí
Rohit Sharma
@RohitSharma encontró alguna solución a este problema todavía? o aún esperando algún milagro.
Asadullah
Aún enfrentando este problema, no obtuve ninguna solución perfecta para eso.
Rohit Sharma
¿Encontraste una solución?
Hamza Ezzaydia