mode de démarrage de l'activité, la pile de tâches et la propriété taskAffinity

Quelle est la pile de tâches

Une application au démarrage, d'avoir beaucoup d'activité, quand on appuie sur le bouton de retour, il se rabattra sur une activité, le système est de savoir comment gérer ces activités il? La réponse sous la forme d'une pile (tâche) et suivre les principes avancés sur, par défaut, une application de la pile est une seule tâche (tâche), le cas échéant, nous pouvons spécifier des tâches multiples (tâche). Nous pouvons conclure ce qui suit:

1. La pile de tâches est une activité de gestion de l' application de conteneurs, et suivre après le principe avancé
2. Une application par défaut une seule pile de tâche spécifiée par le système
3. app A peut avoir plusieurs tâches pile, nous devons spécifier leur propre

La tâche suivante pile toutes les tâches appelé
Alorscomment pouvons-nous donner une activité spécifique tâche spécifiée,spécifiant une tâche particulière queutilisation estil?
Vous voulez comprendre cela, nous devons comprendre l'activité du mode de démarrage. Le mode d'activité un total de quatre,savoirnorme, singleTop, singleTask, SingleInstance;

standard:
Ce mode de démarragedéfaut, chaque foisvous démarrez une activité, sera ajouté un par un à la tâche en cours d'aller. Pourquoi estil actuellement, nous savons qu'une application peut avoir plusieurs tâches, s'il y a deux tâches,savoir Taska et TaskB, TaskB il activityA, cette foisactivityA début activityB, si activityB estmode standard, puis mettre activityB en TaskBplace Taska. Prenantparolepeu alambiquée, déplacer leurs mains peindre une image devient claire. Il y a aussi un petit problème, quand on commence une activité est généralementcode comme ceci:

    Intent i = new Intent(context,ActivityB.class);
    context.startActivity(i);

En temps startActivity, si le contexte est un applicationContext, et le mode de ActivityB est standard, le système erreur:

android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

Parce que activityB pour tenter d'entrer dans la tâche en cours, je l'ai trouvé contexte (applicationContext) ne appartiennent à une tâche, ne peut pas entrer. La solution est de créer une nouvelle tâche, le message d'erreur a été très clair, le code spécifique est comme suit:

    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

singleTop:
Comme son nomindique, si l'activité a été au sommet de la tâche, puis lorsque l'activitécommencénouveau, il ne sera pas re-créé, maisappeler onNewIntent (intention i) méthode, les donnéesvous voulez transmettre, vous pouvezparamètresintention entrer, onCreate, onStart pas appelé. Si cette activité n'est pas dans la tâche de haut, l'activité des méthodes de stockage et standard, sera recréée, accumulée à la tâche.

singleTask:
le mode multiplexage pile. Siméthode il y a une activité dans la tâche, et cette activité estmode singleTask, lancerplusieurs reprises de cette activité ne sera pas re-créer l'instance, mais le onNewIntent de rappel (intention i). Plus précisément, lorsquemode activityA comme singleTask est activé, le système détecte, il n'y a pastâche correspondante, sinon, créer une tâche, puis mettre en activityA. Si la tâche correspondante existe, il vérifiera si haut activityA de la pile, si le haut de la pile, la méthode directe appelle onNewIntent, sinon, audessus de toute l'activité activityA pop, puis appelerméthode onNewIntent.

SingleInstance:
Ce mode d'activité, tâche une exclusivité, c'estàdire la tâche ne peut avoir cette seule activité. Démarrage, créé pour cette activité sera une tâche, et de pousser cette activité, si cette activité est encore dans la pile lorsque cette activitécommencénouveau, il ne remet pasméthode onCreate de cette activité, maisappels et onNewIntent procédé onStart.
Ce modèle de scénario d'utilisation est: en supposant qu'il existe un programme actif qui permetautres programmes d'appeler, si vous voulez fairece programme etautres programmes à partager des exemples de cette activité, l'utilisation de l'autre mode trois de démarrage ne fonctionne pas, car chaque application retour a sa propre pile, la pile lorsque la pile à différents retour la même activité doit être de créer une nouvelle instance. Le mode utilisation de SingleInstance peut résoudre ce problème, dans ce mode, il y aura une pile de retour séparé pour gérer cet événement, quelle que soitapplication d'accédercet événement, tous partagent la même pile de retour, mais aussi résoudre les cas d'activités partagées problème.

Environ quatre mode promoteurs, expliquer essentiellement, mais quand l'utilisation spécifique des tâches multiples cas de pile, appuyez sur le bouton arrière, facile à gâcher, nous sommes ici pour parler seul. Tout d'abord, une telle règle à suivre est: une pile de temps, laissez la pile actuelle (pile de premier plan) vide, retournez la pile vide.

Par exemple:
Rédiger des images décrites ici

Dans l'application, lancez activityA, puis activityA-> activityB-> activityC-> activityD,
si activityA, activityB et activityD sont le mode standard, activityC est le mode SingleInstance, cette fois -ci à ce moment , il y a deux tâches dans l'application (pour l'instant appelé Taska et TaskB ). Comprenant en outre une tâche sont comme suit:
Taska: activityA, activityB, activityD.
TaskB: activityC.
À ce stade de la tâche de premier plan est Taska, l'arrière - plan est TaskB.
Appuyez sur la touche arrière quatre fois, suivie par la destruction est activityD-> activityB-> activityA-> activityC.
Oui comme ça, après la pile de réception vide, retourner la pile vide.

propriété taskAffinity détaillée
pile de tâches est si simple, mais quand on veut configurer manuellement l'activité à une tâche, et comment le faire fonctionner, qui devait mentionner une propriété importante de:

android:taskAffinity

Le document officiel est expliqué ainsi :

La tâche que l'activité a une affinité pour. Activités avec la même affinité appartiennent conceptuellement à la même tâche (à la même « application » du point de vue de l'utilisateur). L'affinité d'une tâche est déterminée par l'affinité de son activité racine.
L'affinité détermine deux choses - la tâche que l'activité est re- apparenté à (voir l'attribut allowTaskReparenting) et la tâche qui abritera l'activité lorsqu'il est lancé avec le drapeau de FLAG_ACTIVITY_NEW_TASK.

Par défaut, toutes les activités d'une application ont la même affinité. Vous pouvez définir cet attribut pour les regrouper différemment, et même place des activités définies dans différentes applications au sein de la même tâche. Pour indiquer que l'activité n'a pas d'affinité pour toute tâche, réglez-le sur une chaîne vide.

Si cet attribut est pas défini, l'activité hérite de l'ensemble d'affinité pour l'application (voir l'attribut de l'élément <application> taskAffinity). Le nom de l'affinité par défaut pour une application est l'ensemble des noms de paquet par l'élément <manifeste>.

Voici ma traduction, si elles sont inappropriées, s'il vous plaît signaler:
tâches liées taskAffinity pile d'activité. Nous avons la même affinité d'activité appartiennent à la même tâche sur le concept. L' affinité d'une tâche dépend de l'activité de la racine taskaffinity dans cette tâche. propriété taskaffinity peut déterminer deux choses:
① lorsque l'activité est de nouveau parent, il serait placé dans la pile qui tâches.
② Lorsque marquer cette activité est ajoutée FLAG_ACTIVITY_NEW_TASK le début, qui sera placé dans la tâche.
Par défaut, l' activité d'application ont tous la même affinité, vous pouvez définir des valeurs différentes pour l' attribut taskaffinity leur groupe. Vous pouvez même mettre l' application multiple de l' activité dans la même tâche. Si vous voulez effacer cette activité ne fait pas partie à une tâche, cette propriété est définie à caractère nul peut être.
Si cette propriété est pas définie, la valeur de cette propriété héritera des valeurs de l' application de cette propriété (voir l'application de la propriété de taskaffinity). Le nom du package par défaut est l'application.

Après avoir lu l'interprétation officielle en haut du document, je pense que vous avez une compréhension de la propriété taskAffinity, résuma le moment il y a deux aspects: attribut 1.taskAffinity à l'activité peut être la tâche spécifiée, mais vous devez utiliser marque FLAG_ACTIVITY_NEW_TASK. 2. La valeur par défaut est taskAffinity le nom du dossier de candidature.

Ci - dessous , nous avons écrit une démo vous montrer:
C'est ce que je dois AndroidManifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="example.ylh.com" >

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" >
        <activity android:name=".MainActivity" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".activityDemo.ActivityA"></activity>

        <activity android:name=".activityDemo.ActivityB"
            android:taskAffinity="example.ylh.com_new_task01"></activity>

        <activity android:name=".activityDemo.ActivityC"
            android:taskAffinity="example.ylh.com_new_task02"
            android:launchMode="singleTask"></activity>
    </application>
</manifest>

À partir du code ci - dessus, un total de quatre activités, la séquence d' amorçage
MainAcitivity-> ActivityA-> ActivityB-> ActivityC
dans laquelle ActivityC ajouté mode de démarrage singleTask, puisque l'intention sera le mode ajouter est activé lorsque singleTask
drapeau FLAG_ACTIVITY_NEW_TASK.

Code ActivityA:

package example.ylh.com.activityDemo;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import example.ylh.com.R;

/**
 * Created by Administrator on 2017/8/4.
 */

public class ActivityA extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_test);

        TextView tv = (TextView) findViewById(R.id.textview);
        tv.setText("A");
        tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(ActivityA.this,ActivityB.class);
                i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(i);
            }
        });
    }
}

Code de ActivieyB:

package example.ylh.com.activityDemo;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import example.ylh.com.R;

/**
 * Created by Administrator on 2017/8/4.
 */

public class ActivityB extends Activity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_test);

        TextView tv = (TextView) findViewById(R.id.textview);
        tv.setText("B");
        tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(ActivityB.this,ActivityC.class);
                startActivity(i);
            }
        });
    }

}

Après le début de son tour, de la BAsD pour voir leurs détails sont les suivants:
Rédiger des images décrites ici

On peut voir clairement, qui contient une pile de trois tâches:
premier: Nom Stack: example.ylh.com, id pile: 8904, et contient MainActivity ActivityA.
Deuxième: Nom de la pile: example.ylh.com_task01, id pile: 8905, inclus ActivityB.
Troisième: Nom de la pile: example.ylh.com_task02, id pile: 8906, inclus ActivityC.
Des résultats conformes à nos attentes. Ceci, nous pouvons conclure que l'utilisation de taskAffinity et FLAG_ACTIVITY_NEW_TASK (ou singleTask), notre activité peut être fait pour spécifier la pile de tâches.

attribut allowTaskReparenting
cette propriété pour expliquer les taches problèmes, mais très intéressant.
officiel Api a expliqué:

Que ce soit l'activité ou ne peut pas passer de la tâche qui a commencé à la tâche, il a une affinité lorsque cette tâche est ensuite amené à l'avant - « true » si elle peut se déplacer, et « false » si elle doit rester à la tâche où il a commencé.

Probablement cela signifie que, si « true », l'activité peut démarrer à partir de la tâche de passer à cette activité et la tâche associée. Je suis à l' écoute de cette explication, vous ne comprenez pas encore estimation,
vous donner un exemple: Il y a deux applications A et B, l' application B a une activityC et activityC de la propriété allowTaskReparenting est vrai. Maintenant , il y a une telle scène, lancé activityC B de A, puis cliquez sur le bouton d'accueil pour revenir au bureau, démarrez l'application B, ce n'est pas le moment de commencer l' application MainActivity B, mais encore une fois montre activityC, activityC Un transfert de la pile à la tâche la pile de la tâche B (car activityC et la tâche associée est AppB la tâche, de sorte que le activityC ajouté au sommet de la pile).
Ci - dessous un code spécifique:

Une application de activityA:

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import example.ylh.com.R;

/**
 * Created by Administrator on 2017/8/4.
 */

public class ActivityA extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_test);

        TextView tv = (TextView) findViewById(R.id.textview);
        tv.setText("A");
        tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent();
                i.setClassName("ylh.bsdf.com","ylh.bsdf.com.ActivityC");
                startActivity(i);
            }
        });
    }
}

Application de activityC B:

package ylh.bsdf.com;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

/**
 * Created by Administrator on 2017/8/12.
 */

public class ActivityC extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView tv = (TextView) findViewById(R.id.tv);
        tv.setText("app B activityC");
    }
}

B AndoridManifest fichier application:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="ylh.bsdf.com">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".ActivityC"
            android:allowTaskReparenting="true">
        </activity>
    </application>

</manifest>

Selon le haut du début logique (activityA (APPA) -> activityC (AppB) -> Maison-> AppB), la pile de situation adb d'impression comme suit:
Rédiger des images décrites ici
exactement conforme à nos attentes.
Benpian ici à la fin, de début à la fin si vous devez comprendre très complet, et où comprennent pas les mots pour écrire un petit test de démonstration (ce qui est important).
Référence:
« les développeurs Android pour explorer l'art du »
document officiel Android
http://blog.csdn.net/zhangjg_blog/article/details/10923643

Publié 17 articles originaux · éloge de won 12 · vues 10000 +

Je suppose que tu aimes

Origine blog.csdn.net/qq_24295537/article/details/76559851
conseillé
Classement