Come avviare un'attività dallo sfondo in Android 10?


12

Sto costruendo un'app Android dove devo iniziare un'attività dallo sfondo. Sto usando un ForegroundStarter che estende il servizio per raggiungere questo obiettivo. Ho un'attività Adscreen.class che devo eseguire dal mio servizio Foreground. L'attività Adscreen.class funziona correttamente (inizia dallo sfondo) su tutte le versioni di Android tranne 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);

    }
}

Ho letto che ci sono alcune restrizioni sull'avvio delle attività dallo sfondo su Android 10. Questo codice sembra non funzionare più. 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);

Qualche soluzione alternativa per iniziare un'attività dallo sfondo su Android 10?


Qualche soluzione adeguata?
Vishal Patel,

Scoprire qualcosa?
WorieN,

Hai trovato una soluzione?
Hamza Ezzaydia,

Risposte:


4

Non sono sicuro che sia giusto farlo in questo modo, ma non ho avuto abbastanza tempo (l'app è solo per uso interno dell'azienda).

Ho usato le autorizzazioni:

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

e quindi ogni utente deve andare alle impostazioni -> autorizzazioni dell'app e quindi selezionare la casella di controllo nelle impostazioni avanzate per la funzione "mostra l'app sugli altri"

Ci scusiamo per il mio inglese o non è esattamente la soluzione giusta, ma ha funzionato, quindi un buon aggiornamento rapido per me.

Su Pixel 4 sarà simile a questo: inserisci qui la descrizione dell'immagine


3

Come hai detto Restrizioni sull'avvio di attività in background

Si afferma che

Android 10 (livello API 29) e restrizioni più alte quando le app possono iniziare attività quando l'app è in esecuzione in background.

Hanno anche menzionato nella loro nota è che.

Nota: ai fini dell'avvio delle attività, un'app che esegue un servizio di primo piano è ancora considerata "in background"

Ciò significa che se stai utilizzando un servizio in primo piano per avviare un'attività, considera comunque l'app in background e non avvia un'attività.

Soluzione: in primo luogo, non è possibile avviare l'app se è in esecuzione in background da Android 10 (livello API 29) e versioni successive. Hanno fornito un nuovo modo per superare questo comportamento che è che invece di chiamare l'app puoi mostrare una notifica ad alta priorità con un intento a schermo intero .

L'intento a schermo intero si comporta come se lo schermo del dispositivo è spento. Avvia l'attività dell'app desiderata. ma se la tua app è in background e lo schermo è acceso, mostrerà solo una notifica. Se fai clic sulla notifica, aprirà la tua app.

Per ulteriori informazioni sulla notifica ad alta priorità e l'intento a schermo intero, è possibile controllarlo qui Visualizza le notifiche sensibili al tempo


2

Dovresti includere in AndroidManifest.xml sotto l'autorizzazione.

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

Sto affrontando anche questo problema, ma questa soluzione non funziona per me
Rohit Sharma,

@RohitSharma ha ancora trovato una soluzione a questo problema? o ancora aspettando qualsiasi miracolo.
asadullah,

Ancora affrontando questo problema, non ho ottenuto alcuna soluzione perfetta per questo.
Rohit Sharma,

Hai trovato una soluzione?
Hamza Ezzaydia,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.