Empfohlen (kostenlos): Mini-Tutorial zur Programmentwicklung
Wenn wir eine Aktivität starten, tun wir normalerweise einfach Starten Sie es direkt startActivity achtet möglicherweise nicht auf den Startmodus der Aktivität. Standardmäßig wird sie im Standardstartmodus gestartet. Aber manchmal ist der Startmodus wichtiger. Wenn Sie beispielsweise möchten, dass eine Aktivität nur einmal gestartet wird und nicht über mehrere Instanzen verfügt, müssen Sie sie möglicherweise auf den SingleTask-Modus festlegen. Daher ist es notwendig, diese Startmodi zu verstehen. Bitte beachten Sie, dass sich der Startmodus auf den Startmodus und den impliziten Start bezieht. Ich werde sie später in einem speziellen Artikel erklären.
Um den Startmodus zu verstehen, müssen Sie zunächst das Konzept des Aufgabenstapels verstehen. Ich werde hier nicht näher auf das Implementierungsprinzip des Task-Stacks eingehen. Hier werde ich kurz vorstellen, was ein Task-Stack ist. Die von uns gestarteten Aktivitätsinstanzen werden in einem sogenannten Aufgabenstapel abgelegt. Wir alle wissen, dass der Stapel die Eigenschaft „Last In, First Out“ hat. Der Aufgabenstapel ist beispielsweise eine Badmintonröhre und die Aktivitätsinstanzen sind einzeln Badminton. Die zuletzt eingelegten können nur zuerst herausgenommen werden. Wenn wir also eine App starten, wird automatisch ein Aufgabenstapel erstellt, in den wir dann Aktivitätsinstanzen werfen. Wenn wir die Eingabetaste drücken, um die Aktivitäten zu zerstören, werden diese Aktivitäten der Reihe nach aus dem Aufgabenstapel entfernt. Natürlich kann eine App mehrere Aufgabenstapel haben. Beispielsweise befindet sich eine mit singleInstence gestartete Aktivität in einem unabhängigen Aufgabenstapel. Nachdem wir das Konzept des Aufgabenstapels verstanden haben, können wir einen Blick auf die vier Startaktivitätsmodi werfen.
Dies ist der Standard-Startmodus und standardmäßig dieser Startmodus. Jedes Mal, wenn eine Aktivität in diesem Startmodus gestartet wird, wird eine neue Instanz erstellt und auf dem Stapel platziert, unabhängig davon, ob dieselbe Instanz bereits im Stapel vorhanden ist. Dies ist auch am einfachsten zu verstehen.
Wie der Name schon sagt, ist die Spitze des Stapels eine einzelne Instanz. Was bedeutet es? Angenommen, Sie starten jetzt eine ActivityA, aber zu diesem Zeitpunkt befindet sich bereits eine ActivityA-Instanz oben auf dem Stapel, sodass zu diesem Zeitpunkt keine neue Instanz erstellt wird. Wenn jedoch dieselbe Instanz oben im Stapel vorhanden ist, wird trotzdem eine neue Instanz erstellt. Die aktuelle Aktivität im Stapel ist beispielsweise ABC, wobei A oben im Stapel steht. Wenn A zu diesem Zeitpunkt gestartet wird, wird keine weitere A-Aktivität erstellt, aber die onNewIntent-Methode von A wird ausgeführt. Wenn jedoch zu diesem Zeitpunkt die C-Aktivität gestartet wird, wird ein neues C erstellt, da A nicht C oben auf dem Stapel ist Die Instanz wird weiterhin erstellt, die Stapelsituation ist zu diesem Zeitpunkt CABC.
Einzelaufgabenmodus. Dieser Modus bedeutet, dass im Startstapel der Aktivität nur eine einzige Instanz vorhanden sein kann, unabhängig davon, ob sie sich oben im Stapel befindet oder nicht. Im Gegensatz zu anderen Startmodi kann dieser Startmodus den zu startenden Stapel angeben. Beispielsweise gibt es einen Stack Main, aber Sie können für Aktivität A einen Stacknamen dev angeben. Wenn A dann gestartet wird, wird ein Stack namens dev erstellt. SingleTask bedeutet also, dass beim Starten einer Aktivität im Startmodus „singleTask“ eine neue Instanz erstellt und in den Stapel eingefügt wird, wenn dieselbe Instanz im angegebenen Stapel vorhanden ist. Zum Beispiel befindet sich ABC im Stapel, und dann starten Sie B. Zu diesem Zeitpunkt erstellen Sie keine neue B-Instanz, sondern legen B oben auf den Stapel, schieben A heraus und führen dann die onNewIntent-Methode von B aus Diesmal ist die Stapelsituation BC.
Aufmerksame Leser werden „Push Out“ finden. Ja, wir alle wissen, dass beim Stapeln der letzte Spieler zuerst herauskommt. Wenn Sie beispielsweise drei Badmintonspieler in die Röhre legen, können Sie nur den obersten zuerst herausziehen Grund: Wenn Sie B an die Spitze des Stapels heben möchten, müssen Sie A herausschieben. Viele Leser denken möglicherweise fälschlicherweise, dass es sich nach dem Start um BAC handelt, in Wirklichkeit handelt es sich jedoch um BC, da A zuerst aus dem Stapel herausspringen muss, bevor B herauskommen kann. Wenn sich ADFBC im Stapel befindet, ist dieses Startup B ebenfalls BC, und alles darüber wird vom Stapel entfernt.
Einzelfallmodus. Dies ist eine erweiterte Version von singleTask. Er erstellt selbst einen neuen Stapel und legt diese neue Instanz darin ab. Dieser Stapel kann nur diese aktive Instanz enthalten. Wenn diese Aktivität also wiederholt gestartet wird, wird die onNewIntent-Methode dieser Aktivität aufgerufen und auf diesen Stapel umgeschaltet, solange sie existiert, und es wird keine neue Instanz erstellt.
Nachdem wir nun die vier Startmodi für Aktivitäten verstanden haben, sehen wir uns an, wie der Startmodus dafür festgelegt wird.
Statische Einstellung dient dazu, den Startmodus für bestimmte Aktivitäten in AndroidManifest festzulegen. Legen Sie den Startmodus fest, indem Sie den Parameter launchMode für die Aktivität angeben. Zum Beispiel:
<activity android:name=".MainActivity" android:launchMode="singleInstance"/>
Dynamische Einstellung dient dazu, den Startmodus beim Starten der Aktivität anzugeben, zum Beispiel:
Intent intent = new Intent(); intent.setClass(this,SecondActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);
可以看到我们通过intent.addFlags这个方法来指定启动模式,这个方法传入一个参数来指定启动模式,其他的参数有:
现在模拟一个场景:现在有三个活动 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中。所以要注意这个点。
这个问题和上面singleTop的本质是一样的。模拟一个场景:现在有两个栈:First:ABC;Second:QWE。栈First位于前台,栈Second位于后台。A位于栈顶。这个时候以singleTask的模式启动W,会发生什么样的情况呢?首先会切换到栈Second,再把Q出栈,W提到栈顶,并执行W的onNewIntent方法。这个时候按返回键就会把Second栈中的活动依次出栈,全部出完后才会切换到栈First。
前面我们讲到给singleTask模式指定要启动的任务栈的名字,怎么指定呢?可以在AndroidManifest中指定相关的属性,如下:
<activity android:name=".Main2Activity" android:launchMode="singleTask" android:taskAffinity="com.huan" android:allowTaskReparenting="true"/>
这里解释一下这两个参数
我前面讲到可以给singleTask的活动指定一个栈名,然后启动的时候,就会切换到那个栈,并把新的活动放进去。但是如果设置allowTaskReparenting参数为false的话是不会切换到新的栈的。这个参数的意思是可不可以把新的活动转移到新的任务栈。简单点来说:当我们启动一个singleTask活动的时候,这个活动还是留在启动他的活动的栈中的。但是我们指定了taskAffinity这个参数,或者启动的活动是别的应用中的活动,那么就会创建一个新的任务栈。如果allowTaskReparenting这个参数是true的话,那么这个活动就会放到那个新的任务栈中。这样应该就可以明白了。所以这两个经常是配套一起使用的。
活动的启动模式有四种,每种的功能都不一样,可以结合具体需要去使用,但是最重点还是要了解他的实现原理,栈中是怎么变化的,这个是比较重要的。了解这个之后那些特殊情况也就很容易理解了。
上面我讲的只是简单的使用,关于活动启动模式还有很多要了解。后续可能会解析一下,读者也可以自行去深度了解。
相关免费推荐:编程视频课程
Das obige ist der detaillierte Inhalt vonWerfen wir einen Blick auf den Aktivitätsstartmodus. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!