Domanda

Ho A attività con android:launchMode="singleTop" nel manifesto.

Se vado a B Attività, C, e D ci devo scorciatoie menu per tornare alla mia attività delle applicazioni di root (A).

Il codice è simile al seguente:

Intent myIntent = new Intent(getBaseContext(), MainActivity.class);
startActivity(myIntent);

Tuttavia, invece di tornare al già esistente istanza A della mia MainActivity.class si crea una nuova istanza -> va a onCreate() invece di onNewIntent()

.

Questo non è il comportamento previsto, giusto?

È stato utile?

Soluzione

Questo dovrebbe fare il trucco.

<activity ... android:launchMode="singleTop" />

Quando si crea l'intento di avviare l'utilizzo app:

Intent intent= new Intent(context, YourActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);

Questo è che dovrebbe essere necessaria.

Altri suggerimenti

Quello che in realtà ha funzionato per me, alla fine, era questo:

Intent myIntent = new Intent(getBaseContext(), MainActivity.class);
myIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(myIntent);

documentazione :

  

I modi di "standard" "singleTop"   differiscono l'uno dall'altro in un   rispetto: Ogni volta che c'è di nuovo intento   per un'attività "standard", un nuovo   un'istanza della classe è stato creato per   rispondere a tale intento. ogni istanza   gestisce un unico intento. Analogamente, un   nuova istanza di un'attività "singleTop"   può anche essere creato per gestire un nuovo   intento. Tuttavia, se il compito di destinazione   ha già un'istanza esistente di   l'attività nella parte superiore della sua   pila , tale istanza riceverà   il nuovo intento (in onNewIntent ()   chiamata); una nuova istanza non viene creata.

Io non sono sicuro al 100% che cosa "ha già un'istanza esistente di attività in cima alla sua pila" si intende, ma forse la vostra attività non soddisfa questa condizione.

Sarebbe singleTask o di lavoro singleInstance per voi? O forse si potrebbe provare a impostare FLAG_ACTIVITY_SINGLE_TOP sull'intento che si sta creando per vedere se questo fa la differenza, anche se non credo che lo farà.

È possibile tornare alla stessa istanza esistente di attività con android:launchMode="singleInstance"

nel manifesto. Quando ritorni A da B, può essere necessaria per distruggere finish() B.

In primo luogo, struttura stratificata può essere esaminato. Per la modalità di lancio: singleTop
Se un'istanza della stessa attività è già in cima alla pila compito, allora questo caso sarà riutilizzato per rispondere all'intento.

Tutte le attività sono in possesso della pila ( "first in last out"), quindi se la vostra attività in corso è in cima alla pila e se si definisce nel manifest.file come singleTop

android:name=".ActivityA"
android:launchMode="singleTop"

se siete nel ActivityA ricreare l'attività non entrerà onCreate riprenderà onNewIntent () e si può vedere con la creazione di una notifica Non:. Se non implementare onNewIntent (Intent) non sarà possibile ottenere nuovi intenti

Intent activityMain = new Intent(ActivityA.this,
                        ActivityA.class);

                activityMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                        | Intent.FLAG_ACTIVITY_SINGLE_TOP);
                startActivity(activityMain);




    @Override
        protected void onNewIntent(Intent intent) {

            super.onNewIntent(intent);

            notify("onNewIntent");
        }

        private void notify(String methodName) {

            String name = this.getClass().getName();
            String[] strings = name.split("\\.");

            Notification noti = new Notification.Builder(this)
                    .setContentTitle(methodName + "" + strings[strings.length - 1])
                    .setAutoCancel(true).setSmallIcon(R.drawable.ic_launcher)
                    .setContentText(name).build();
            NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            notificationManager.notify((int) System.currentTimeMillis(), noti);

        }

Questo è perché l'originale Un attività è già stata distrutta da tempo viene avviato da B, C o D. Pertanto, onCreate sarà chiamato al posto di onNewIntent (). Un modo per risolvere questo è quello di distruggere sempre l'esistente A (usando FLAG_ACTIVITY_CLEAR_TASK | FLAG_ACTIVITY_NEW_TASK congiunzione quando startActivity) prima di iniziare un nuovo A, in modo da onCreate sarà sempre chiamato, e si mette il codice di onNewIntent () in onCreate verificando se getIntent ( ) è l'intento di partenza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top