Recommandé (gratuit) : Tutoriel de développement de mini-programmes
Avant-propos
Habituellement, lorsque nous démarrons une activité, nous démarrons simplement l'activité directement. Peut-être que nous ne prêtons pas attention à l'activité. mode de démarrage de l'activité. Par défaut, les éléments suivants sont tous démarrés dans le mode de démarrage par défaut. Mais le mode démarrage est parfois plus important. Par exemple, si vous souhaitez qu'une activité ne soit démarrée qu'une seule fois et ne comporte pas plusieurs instances, vous devrez peut-être la définir en mode singleTask. Il est donc nécessaire de comprendre ces modes de démarrage. Dans le même temps, veuillez noter que le mode de démarrage ≠ le mode de démarrage fait référence au démarrage par affichage et au démarrage implicite. J'aurai un article dédié pour expliquer le démarrage par affichage et le démarrage implicite plus tard.
Introduction à la pile de tâches
Pour comprendre le mode de démarrage, vous devez d'abord comprendre le concept de pile de tâches. Je n'entrerai pas ici dans les détails du principe de mise en œuvre de la pile de tâches. Je présenterai ici brièvement ce qu'est une pile de tâches. Les instances d'activité que nous démarrons seront placées dans ce qu'on appelle une pile de tâches. Nous savons tous que la pile a les caractéristiques du « dernier entré, premier sorti ». Par exemple, la pile de tâches est un tube de badminton et les instances d'activité sont des badmintons une par une. Celles qui sont placées en dernier ne peuvent être supprimées qu'en premier. Ainsi, lorsque nous démarrons une application, une pile de tâches est automatiquement créée, puis nous y ajoutons des instances d'activité. Lorsque nous appuyons sur Entrée pour détruire les activités, ces activités sortiront à leur tour de la pile de tâches. Bien entendu, une application peut avoir plusieurs piles de tâches. Par exemple, une activité démarrée à l’aide de singleInstence se trouve dans une pile de tâches indépendante. Après avoir compris le concept de pile de tâches, nous pouvons jeter un œil aux quatre modes d'activités de démarrage.
Analyse des quatre modes de démarrage de l'Activité
standard
C'est le mode de démarrage standard, et c'est ce mode de démarrage par défaut. Chaque fois qu'une activité dans ce mode de démarrage est démarrée, une nouvelle instance est créée et placée sur la pile, que la même instance existe déjà sur la pile ou non. C’est aussi le plus simple à comprendre.
singleTop
Comme son nom l'indique, le haut de la pile est une instance unique. Qu'est-ce que ça veut dire? Supposons que vous démarriez une ActivityA maintenant, mais qu'il existe déjà une instance ActivityA en haut de la pile à ce moment-là, donc à ce stade, aucune nouvelle instance ne sera créée. Mais si la même instance existe en haut de la pile, une nouvelle instance sera quand même créée. Par exemple, l’activité actuelle dans la pile est ABC, avec A en haut de la pile. Ensuite, lorsque A est démarré à ce moment, une autre activité A ne sera pas créée, mais la méthode onNewIntent de A sera exécutée mais si l'activité C est démarrée à ce moment, puisque A n'est pas C en haut de la pile, un nouveau C ; l'instance sera toujours créée, la situation de la pile à ce moment est CABC.
singleTask
Mode tâche unique. Ce mode signifie qu'une seule instance peut exister dans la pile de démarrage de l'activité, qu'elle soit en haut de la pile ou non. Différent des autres modes de démarrage, ce mode de démarrage peut spécifier la pile à démarrer. Par exemple, il existe une pile Main, mais vous pouvez spécifier un nom de pile dev pour l'activité A. Ensuite, lorsque A sera démarré, une pile appelée dev sera créée. Donc, ce que singleTask signifie, c'est que lorsque vous démarrez une activité avec le mode de démarrage de singleTask, s'il n'y a pas d'instance identique dans la pile, une nouvelle instance sera créée et mise dans la pile si la même instance existe dans la pile spécifiée ; par exemple, il y a ABC dans la pile, puis vous démarrez B, vous ne créerez pas de nouvelle instance B pour le moment, mais placez B en haut de la pile, poussez A vers l'extérieur, puis exécutez la méthode onNewIntent de B. cette fois, la situation de pile est BC.
Les lecteurs attentifs remarqueront « pousser ». Oui, nous savons tous que la pile est le dernier entré, premier sorti. Par exemple, si vous mettez 3 badmintons dans le tube, si vous voulez obtenir le badminton du milieu, vous ne pouvez retirer que celui du haut en premier. raison, si vous souhaitez soulever B vers le haut de la pile, vous devez alors pousser A vers l'extérieur. De nombreux lecteurs peuvent penser à tort qu'il s'agit de BAC après le démarrage, mais il s'agit en réalité de BC, car A doit d'abord sortir de la pile avant que B puisse sortir. De la même manière, s'il y a ADFBC dans la pile, ce démarrage B est également BC, et tout ce qui précède est retiré de la pile.
singleInstance
Mode instance unique. Il s'agit d'une version améliorée de singleTask. Il créera lui-même une nouvelle pile et y placera cette nouvelle instance, et cette pile ne pourra contenir que cette instance active. Ainsi, lorsque cette activité est démarrée à plusieurs reprises, tant qu'elle existe, la méthode onNewIntent de cette activité sera appelée et basculée vers cette pile, et aucune nouvelle instance ne sera créée.
Deux façons de définir le mode de démarrage
Après avoir compris les quatre modes de démarrage des activités, voyons comment spécifier le mode de démarrage pour celles-ci.
Paramètre statique
Le paramètre statique permet de définir le mode de démarrage pour des activités spécifiques dans AndroidManifest. Définissez le mode de lancement en spécifiant le paramètre launchMode pour l'activité. Par exemple :
<activity android:name=".MainActivity"
android:launchMode="singleInstance"/>
Copier après la connexion
Paramètre dynamique
Le paramètre dynamique consiste à spécifier le mode de démarrage lors du démarrage de l'activité, par exemple :
Intent intent = new Intent();
intent.setClass(this,SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
Copier après la connexion
可以看到我们通过intent.addFlags这个方法来指定启动模式,这个方法传入一个参数来指定启动模式,其他的参数有:
- FLAG_ACTIVITY_NEW_TASK:singleTask模式
- FLAG_ACTIVITY_SINGLE_TOP:singleTop模式
- FLAG_ACTIVITY_CLEAR_TOP:清除该活动上方的所有活动。一般和singleTask一起使用。但是如果你的启动模式是standard,那么这个活动连他之上的所有活动都会被出栈再创建一个新的实例放进去。例如现在栈中是ABCD,以FLAG_ACTIVITY_CLEAR_TOP+standard模式启动C的时候,首先清理掉ABC,是的,C也会被清理,然后再创建一个新的C放进去,执行之后就是CD。
特别注意的坑
singleInstance返回任务栈
现在模拟一个场景:现在有三个活动 A,B,C。A和C的启动模式都是standard,B的启动模式是singleInstance。先启动A,再启动B,然后再启动C。这个时候问题来了,如果我这个时候按下返回键,是回到B吗?答案是回到A。再按一下呢,返回桌面吗?答案是回到B,再按一下再回到桌面。其实不难理解。我们都知道singleInstance会创建一个独立的栈,当我们启动A的时候,A位于栈First中,启动B的时候,就会创建一个栈Second并把B实例放进去。这个时候再启动C,就会切换到栈FIrst,因为singleInstance创建的栈只能放一个,所以C会放到栈First中,当按下返回的时候,栈First中的活动就会依次出栈,直到全部出完,才会切换到栈Second中。所以要注意这个点。
singleTask多任务栈启动问题
这个问题和上面singleTop的本质是一样的。模拟一个场景:现在有两个栈:First:ABC;Second:QWE。栈First位于前台,栈Second位于后台。A位于栈顶。这个时候以singleTask的模式启动W,会发生什么样的情况呢?首先会切换到栈Second,再把Q出栈,W提到栈顶,并执行W的onNewIntent方法。这个时候按返回键就会把Second栈中的活动依次出栈,全部出完后才会切换到栈First。
singleTask的TaskAffinity与allowTaskReparenting参数
前面我们讲到给singleTask模式指定要启动的任务栈的名字,怎么指定呢?可以在AndroidManifest中指定相关的属性,如下:
<activity android:name=".Main2Activity"
android:launchMode="singleTask"
android:taskAffinity="com.huan"
android:allowTaskReparenting="true"/>
Copier après la connexion
这里解释一下这两个参数
- taskAffinity:指定任务栈的名字。默认的任务栈是包名,所以不能以包名来命名。
- allowTaskReparenting:这个参数表示可不可以切换到新的任务栈,通常设置为true并和上面的参数一起使用。
我前面讲到可以给singleTask的活动指定一个栈名,然后启动的时候,就会切换到那个栈,并把新的活动放进去。但是如果设置allowTaskReparenting参数为false的话是不会切换到新的栈的。这个参数的意思是可不可以把新的活动转移到新的任务栈。简单点来说:当我们启动一个singleTask活动的时候,这个活动还是留在启动他的活动的栈中的。但是我们指定了taskAffinity这个参数,或者启动的活动是别的应用中的活动,那么就会创建一个新的任务栈。如果allowTaskReparenting这个参数是true的话,那么这个活动就会放到那个新的任务栈中。这样应该就可以明白了。所以这两个经常是配套一起使用的。
总结
活动的启动模式有四种,每种的功能都不一样,可以结合具体需要去使用,但是最重点还是要了解他的实现原理,栈中是怎么变化的,这个是比较重要的。了解这个之后那些特殊情况也就很容易理解了。
上面我讲的只是简单的使用,关于活动启动模式还有很多要了解。后续可能会解析一下,读者也可以自行去深度了解。
相关免费推荐:编程视频课程
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!