Voici mon scénario: j'ai un service qui lit la musique diffusée et crée (et met à jour) une notification. Lorsqu'il appuie sur la notification, l'utilisateur est dirigé vers l'activité B.

La structure de mon application est A -> B.

Lorsque l'utilisateur va à l'écran d'accueil avec le flux suivant: B -> A -> Écran d'accueil (le service continue de jouer de la musique), appuyer sur la notification amène l'utilisateur à l'activité B, mais maintenant il ne peut pas revenir à l'activité A. Il est dirigé vers l'écran d'accueil.

Je dois implémenter un ordre B -> A pour chaque situation.

Voici mes extraits de code:

AndroidManifest.xml:

<activity
    android:name=".ChannelListActivity"
    android:configChanges="locale|keyboard|keyboardHidden|screenLayout|fontScale|uiMode|orientation|screenSize"
    android:launchMode="singleTask" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<activity
    android:name=".NowPlayingActivity"
    android:parentActivityName=".ChannelListActivity"
    android:launchMode="singleTop" >
</activity>

Et le code pour créer la notification:

Intent intentGoToApp = new Intent(this, NowPlayingActivity.class);
intentGoToApp.putExtra(NowPlayingFragment.EXTRA_CHANNEL_ID, mUserData.getPlayingChannelId());
intentGoToApp.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent piGoToApp = PendingIntent.getActivity(getApplicationContext(), 0, intentGoToApp, PendingIntent.FLAG_CANCEL_CURRENT);

Alors, que dois-je changer ou ajouter pour obtenir le comportement? Merci d'avance...


MODIFIER: j'ai essayé d'ajouter le code suivant, mais je n'obtiens toujours pas le résultat souhaité ...

Intent intentGoToApp = new Intent(this, NowPlayingActivity.class);
intentGoToApp.putExtra(NowPlayingFragment.EXTRA_CHANNEL_ID, mUserData.getPlayingChannelId());
intentGoToApp.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
//PendingIntent piGoToApp = PendingIntent.getActivity(getApplicationContext(), 0, intentGoToApp, PendingIntent.FLAG_CANCEL_CURRENT);

Intent intentMainActivity = new Intent(this, ChannelListActivity.class);

PendingIntent piGoToApp = TaskStackBuilder.create(this)
// add all of DetailsActivity's parents to the stack,
// followed by DetailsActivity itself
    .addNextIntentWithParentStack(intentMainActivity)
    .addNextIntentWithParentStack(intentGoToApp)
    .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);*/
1
burakk 23 déc. 2015 à 16:19

3 réponses

Meilleure réponse

Il y a quelques astuces que vous pouvez faire:

  1. Commencer l'activité A dans public void onBackPressed() {} de l'activité B si l'activité B a été démarrée avec une notification (et terminer l'activité B);

    public class ActivityB extends Activity {
        static final String ACTION_NOTIFICATION = "ACTION_NOTIFICATION";
        boolean isStartedWithNotification;
    
        @Override
        protected void onNewIntent(Intent intent) {
            super.onNewIntent(intent);
            setIntent(intent);
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            ....
        }
    
        // OR onResume() if you don't use fragments
        @Override
        protected void onResumeFragments() {
            super.onResumeFragments();
            handleIntent();
        }
    
        void handleIntent() {
            Intent intent = getIntent();
            if (intent != null && ACTION_NOTIFICATION.equals(intent.getAction())) {
                // handle intent, populate UI based on it's information;
                isStartedWithNotification = true;
                setIntent(null);
            }
        }
    
        @Override
        public void onBackPressed() {
            if (isStartedWithNotification) {
                startActivity(new Intent(this, ActivityA.class)
                    .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                finish();
            } else {
                super.onBackPressed();
            }
        }   
    }
    
  2. Au lieu de démarrer l'activité B via une notification, démarrez l'activité A pour gérer l'intention et démarrer immédiatement l'activité B;

    public class ActivityA extends Activity {
        static final String ACTION_NOTIFICATION = "ACTION_NOTIFICATION";
    
        @Override
        protected void onNewIntent(Intent intent) {
            super.onNewIntent(intent);
            setIntent(intent);
        }
    
        // OR onResume() if you don't use fragments
        @Override
        protected void onResumeFragments() {
            super.onResumeFragments();
            handleIntent();
        }
    
        void handleIntent() {
            Intent intent = getIntent();
            if (intent != null && ACTION_NOTIFICATION.equals(intent.getAction())) {
                setIntent(null);
                //START ACTIVITY B
            }
        }
    }
    

La première approche est plus piratée, mais avec la première, sur les appareils bas de gamme, le vôtre pourrait voir "clignoter" le commutateur des activités. Alors je commencerais par le premier.

J'espère que ça aide

1
Konstantin Loginov 28 déc. 2015 à 09:16

Voici mon scénario: j'ai un service qui lit la musique diffusée et crée (et met à jour) une notification. Lorsqu'il appuie sur la notification, l'utilisateur est dirigé vers l'activité B.

<activity
    android:name=".ActivityB"
    android:label="Activity B"
    android:parentActivityName=".ActivityA">
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="com.yourpackage.MainActivity" />
</activity>
1
Grace Coder 23 déc. 2015 à 13:47

Vous devez ajouter l'activité A à votre backstack afin que Android connaît l'ordre dans lequel il doit quitter chaque activité.

Cette documentation officielle pourrait vous être utile.

À partir d'Android 4.1 (niveau d'API 16), vous pouvez déclarer la logique parent de chaque activité en spécifiant le android:parentActivityName attribut dans l'élément <activity>. Cela permet au système de faciliter les modèles de navigation car il peut déterminer la logique Chemin de navigation Retour ou Haut avec ces informations.

1
Mr Lister 29 déc. 2015 à 09:24