권장(무료): 미니 프로그램 개발 튜토리얼
보통 활동을 시작하면 직접 시작 startActivity는 활동의 시작 모드에 주의를 기울이지 않을 수 있으며 기본적으로 기본 시작 모드에서 시작됩니다. 그러나 시작 모드가 때로는 더 중요합니다. 예를 들어, 활동이 한 번만 시작되고 여러 인스턴스가 없도록 하려면 해당 활동을 SingleTask 모드로 설정해야 할 수 있습니다. 따라서 이러한 시작 모드를 이해하는 것이 필요합니다. 동시에 시작 모드 ≠ 시작 모드는 디스플레이 시작과 암시적 시작을 의미합니다. 나중에 디스플레이 시작과 암시적 시작을 설명하는 전용 기사를 준비하겠습니다.
시작 모드를 이해하려면 먼저 작업 스택의 개념을 이해해야 합니다. 여기서는 태스크 스택의 구현 원리에 대해 자세히 설명하지 않겠습니다. 여기서는 태스크 스택이 무엇인지 간략하게 소개하겠습니다. 우리가 시작하는 활동 인스턴스는 작업 스택이라는 곳에 배치됩니다. 우리 모두는 스택이 "후입선출"의 특성을 가지고 있다는 것을 알고 있습니다. 예를 들어 작업 스택은 배드민턴 튜브이고 활동 인스턴스는 하나씩 배드민턴입니다. 따라서 앱을 시작하면 작업 스택이 자동으로 생성된 다음 여기에 활동 인스턴스가 생성됩니다. 활동을 파괴하기 위해 Return 키를 누르면 이러한 활동이 차례로 작업 스택에서 나옵니다. 물론 앱에는 여러 작업 스택이 있을 수 있습니다. 예를 들어 SingleInstence를 사용하여 시작된 활동은 독립적인 작업 스택에 있습니다. 작업 스택의 개념을 이해한 후에는 활동의 네 가지 시작 모드를 살펴볼 수 있습니다.
표준 시작 모드이며 기본적으로 이 시작 모드입니다. 이 시작 모드의 활동이 시작될 때마다 동일한 인스턴스가 스택에 이미 존재하는지 여부에 관계없이 새 인스턴스가 생성되어 스택에 배치됩니다. 이것은 또한 이해하기 가장 쉽습니다.
이름에서 알 수 있듯이 스택의 맨 위는 단일 인스턴스입니다. 그것은 무엇을 의미합니까? 지금 ActivityA를 시작했지만 현재 스택 상단에 ActivityA 인스턴스가 이미 있으므로 이번에는 새 인스턴스가 생성되지 않는다고 가정합니다. 그러나 동일한 인스턴스가 스택 상단에 존재하는 경우 새 인스턴스가 계속 생성됩니다. 예를 들어, 스택의 현재 활동은 ABC이고 스택 맨 위에는 A가 있습니다. 그러면 이때 A가 시작되면 다른 A 액티비티가 생성되지 않고 A의 onNewIntent 메서드가 실행되지만 이때 C 액티비티가 시작되면 A는 스택 맨 위에 있는 C가 아니기 때문에 새로운 C가 생성됩니다. 인스턴스가 계속 생성되지만 현재 스택 상황은 CABC입니다.
단일 작업 모드. 이 모드는 스택 상단에 있든 없든 활동의 시작 스택에 단일 인스턴스만 존재할 수 있음을 의미합니다. 다른 시작 모드와 달리 이 시작 모드에서는 시작할 스택을 지정할 수 있습니다. 예를 들어 스택 Main이 있지만 활동 A에 대해 스택 이름 dev를 지정할 수 있습니다. 그런 다음 A가 시작되면 dev라는 스택이 생성됩니다. 따라서 SingleTask의 의미는 SingleTask의 시작 모드로 활동을 시작할 때 스택에 동일한 인스턴스가 없으면 지정된 스택에 동일한 인스턴스가 있으면 새 인스턴스가 생성되어 스택에 저장된다는 것입니다. 예를 들어 스택에 ABC가 있고 B를 시작하면 이번에는 새 B 인스턴스를 생성하지 않고 B를 스택 맨 위에 놓고 A를 밀어낸 다음 B의 onNewIntent 메서드를 실행합니다. 이번에는 스택 상황이 BC입니다.
주의 깊은 독자라면 "밀어내기"를 발견할 것입니다. 예, 우리 모두는 스택이 후입선출 방식이라는 것을 알고 있습니다. 예를 들어, 배드민턴 3개를 튜브에 넣었다면 중간 배드민턴을 꺼내려면 위쪽 것만 먼저 꺼낼 수 있습니다. 이유는 B를 스택 맨 위로 올리려면 A를 밀어야 하기 때문입니다. 많은 독자들이 시작 후 BAC라고 잘못 생각할 수도 있지만 실제로는 BC입니다. B가 나오기 전에 A가 먼저 스택에서 튀어나와야 하기 때문입니다. 같은 방식으로 스택에 ADFBC가 있으면 이 스타트업 B도 BC이고 위의 모든 항목이 스택에서 팝됩니다.
단일 케이스 모드. 이것은 SingleTask의 향상된 버전입니다. 그는 스스로 새 스택을 생성하고 이 새 인스턴스를 그 안에 넣을 것이며, 이 스택은 이 활성 인스턴스만 보유할 수 있습니다. 따라서 이 활동이 반복적으로 시작되면 이 활동의 onNewIntent 메서드가 호출되어 이 스택으로 전환되며 새 인스턴스가 생성되지 않습니다.
이제 활동의 네 가지 시작 모드를 이해했으므로 시작 모드를 지정하는 방법을 살펴보겠습니다.
정적 설정은 AndroidManifest에서 특정 활동에 대한 시작 모드를 설정하는 것입니다. 활동에 대한 launchMode 매개변수를 지정하여 시작 모드를 설정합니다. 예:
<activity android:name=".MainActivity" android:launchMode="singleInstance"/>
동적 설정은 활동을 시작할 때 시작 모드를 지정하는 것입니다. 예:
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的话,那么这个活动就会放到那个新的任务栈中。这样应该就可以明白了。所以这两个经常是配套一起使用的。
活动的启动模式有四种,每种的功能都不一样,可以结合具体需要去使用,但是最重点还是要了解他的实现原理,栈中是怎么变化的,这个是比较重要的。了解这个之后那些特殊情况也就很容易理解了。
上面我讲的只是简单的使用,关于活动启动模式还有很多要了解。后续可能会解析一下,读者也可以自行去深度了解。
相关免费推荐:编程视频课程
위 내용은 Activity 시작 모드를 살펴보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!