Comment démarrer une activité depuis l'arrière-plan dans Android 10?

12

Je crée une application Android sur laquelle je dois démarrer une activité en arrière-plan. J'utilise un ForegroundStarter qui étend le service pour y parvenir. J'ai une activité Adscreen.class que je dois exécuter à partir de mon service Foreground. L'activité Adscreen.class fonctionne bien (commence à partir de l'arrière-plan) sur toutes les versions d'Android sauf 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);

    }
}

J'ai lu qu'il y avait des restrictions sur le démarrage d'activités à partir de l'arrière-plan sur Android 10. Ce code ne semble plus fonctionner. 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);

Des solutions de contournement pour démarrer une activité depuis l'arrière-plan sur Android 10?

SK707
la source
Une bonne solution?
Vishal Patel
Découvrir quelque chose?
WorieN
Avez-vous trouvé une solution?
Hamza Ezzaydia

Réponses:

4

Je ne sais pas si c'est bien de le faire de cette façon, mais je n'ai pas eu assez de temps (l'application est réservée à l'usage interne de l'entreprise).

J'ai utilisé des autorisations:

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

puis chaque utilisateur doit aller dans le paramètre -> autorisations de l'application, puis cochez la case dans les paramètres avancés pour la fonction "afficher l'application sur les autres"

Désolé pour mon anglais ou pas exactement la bonne solution, mais cela a fonctionné, donc bon correctif pour moi.

Sur Pixel 4, cela ressemblera à ceci: entrez la description de l'image ici

kamest
la source
3

Comme vous l'avez mentionné Restrictions concernant le démarrage d'activités à l'arrière-plan

Il est indiqué que

Android 10 (API niveau 29) et des restrictions plus strictes sur le moment où les applications peuvent démarrer des activités lorsque l'application s'exécute en arrière-plan.

Ils ont également mentionné dans leur note que.

Remarque: Aux fins du démarrage des activités, une application exécutant un service de premier plan est toujours considérée comme «en arrière-plan»

Cela signifie que si vous utilisez un service de premier plan pour démarrer une activité, il considère toujours que l'application est en arrière-plan et ne lancera pas d'activité d'application.

Solution: Tout d'abord, vous ne pouvez pas démarrer l'application si elle s'exécute en arrière-plan depuis Android 10 (niveau 29 de l'API) et plus. Ils ont fourni une nouvelle façon de surmonter ce comportement qui est qu'au lieu d'appeler l'application, vous pouvez afficher une notification de haute priorité avec une intention plein écran .

L'intention plein écran se comporte comme si l'écran de votre appareil était éteint. Cela lancera l'activité de l'application que vous souhaitez. mais si votre application est en arrière-plan et que l'écran est allumé, elle affichera simplement une notification. Si vous cliquez sur la notification, cela ouvrira votre application.

Pour plus d'informations sur les notifications haute priorité et l'intention en plein écran, vous pouvez les vérifier ici Afficher les notifications sensibles au facteur temps

Muhammad Farhan
la source
2

Vous devez inclure dans AndroidManifest.xml ci-dessous l'autorisation.

<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
mimu120
la source
je suis également confronté à ce problème, mais cette solution ne fonctionne pas pour moi
Rohit Sharma
@RohitSharma a encore trouvé une solution à ce problème? ou encore en attente d'un miracle.
asadullah
Toujours confronté à ce problème, je n'ai pas trouvé de solution parfaite pour cela.
Rohit Sharma
Avez-vous trouvé une solution?
Hamza Ezzaydia