Activity 시작 모드를 살펴보겠습니다.

coldplay.xixi
풀어 주다: 2020-12-10 17:10:45
앞으로
3002명이 탐색했습니다.

미니 프로그램 개발 튜토리얼활동 시작 모드 관련 정보를 주로 소개합니다

Activity 시작 모드를 살펴보겠습니다.

권장(무료): 미니 프로그램 개발 튜토리얼

머리말

보통 활동을 시작하면 직접 시작 startActivity는 활동의 시작 모드에 주의를 기울이지 않을 수 있으며 기본적으로 기본 시작 모드에서 시작됩니다. 그러나 시작 모드가 때로는 더 중요합니다. 예를 들어, 활동이 한 번만 시작되고 여러 인스턴스가 없도록 하려면 해당 활동을 SingleTask 모드로 설정해야 할 수 있습니다. 따라서 이러한 시작 모드를 이해하는 것이 필요합니다. 동시에 시작 모드 ≠ 시작 모드는 디스플레이 시작과 암시적 시작을 의미합니다. 나중에 디스플레이 시작과 암시적 시작을 설명하는 전용 기사를 준비하겠습니다.

작업 스택 소개

시작 모드를 이해하려면 먼저 작업 스택의 개념을 이해해야 합니다. 여기서는 태스크 스택의 구현 원리에 대해 자세히 설명하지 않겠습니다. 여기서는 태스크 스택이 무엇인지 간략하게 소개하겠습니다. 우리가 시작하는 활동 인스턴스는 작업 스택이라는 곳에 배치됩니다. 우리 모두는 스택이 "후입선출"의 특성을 가지고 있다는 것을 알고 있습니다. 예를 들어 작업 스택은 배드민턴 튜브이고 활동 인스턴스는 하나씩 배드민턴입니다. 따라서 앱을 시작하면 작업 스택이 자동으로 생성된 다음 여기에 활동 인스턴스가 생성됩니다. 활동을 파괴하기 위해 Return 키를 누르면 이러한 활동이 차례로 작업 스택에서 나옵니다. 물론 앱에는 여러 작업 스택이 있을 수 있습니다. 예를 들어 SingleInstence를 사용하여 시작된 활동은 독립적인 작업 스택에 있습니다. 작업 스택의 개념을 이해한 후에는 활동의 네 가지 시작 모드를 살펴볼 수 있습니다.

Activity의 4가지 시작 모드 분석

standard

표준 시작 모드이며 기본적으로 이 시작 모드입니다. 이 시작 모드의 활동이 시작될 때마다 동일한 인스턴스가 스택에 이미 존재하는지 여부에 관계없이 새 인스턴스가 생성되어 스택에 배치됩니다. 이것은 또한 이해하기 가장 쉽습니다.

singleTop

이름에서 알 수 있듯이 스택의 맨 위는 단일 인스턴스입니다. 그것은 무엇을 의미합니까? 지금 ActivityA를 시작했지만 현재 스택 상단에 ActivityA 인스턴스가 이미 있으므로 이번에는 새 인스턴스가 생성되지 않는다고 가정합니다. 그러나 동일한 인스턴스가 스택 상단에 존재하는 경우 새 인스턴스가 계속 생성됩니다. 예를 들어, 스택의 현재 활동은 ABC이고 스택 맨 위에는 A가 있습니다. 그러면 이때 A가 시작되면 다른 A 액티비티가 생성되지 않고 A의 onNewIntent 메서드가 실행되지만 이때 C 액티비티가 시작되면 A는 스택 맨 위에 있는 C가 아니기 때문에 새로운 C가 생성됩니다. 인스턴스가 계속 생성되지만 현재 스택 상황은 CABC입니다.

singleTask

단일 작업 모드. 이 모드는 스택 상단에 있든 없든 활동의 시작 스택에 단일 인스턴스만 존재할 수 있음을 의미합니다. 다른 시작 모드와 달리 이 시작 모드에서는 시작할 스택을 지정할 수 있습니다. 예를 들어 스택 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이고 위의 모든 항목이 스택에서 팝됩니다.

singleInstance

단일 케이스 모드. 이것은 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这个方法来指定启动模式,这个方法传入一个参数来指定启动模式,其他的参数有:

  • 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"/>
로그인 후 복사

这里解释一下这两个参数

  • taskAffinity:指定任务栈的名字。默认的任务栈是包名,所以不能以包名来命名。
  • allowTaskReparenting:这个参数表示可不可以切换到新的任务栈,通常设置为true并和上面的参数一起使用。

我前面讲到可以给singleTask的活动指定一个栈名,然后启动的时候,就会切换到那个栈,并把新的活动放进去。但是如果设置allowTaskReparenting参数为false的话是不会切换到新的栈的。这个参数的意思是可不可以把新的活动转移到新的任务栈。简单点来说:当我们启动一个singleTask活动的时候,这个活动还是留在启动他的活动的栈中的。但是我们指定了taskAffinity这个参数,或者启动的活动是别的应用中的活动,那么就会创建一个新的任务栈。如果allowTaskReparenting这个参数是true的话,那么这个活动就会放到那个新的任务栈中。这样应该就可以明白了。所以这两个经常是配套一起使用的。

总结

活动的启动模式有四种,每种的功能都不一样,可以结合具体需要去使用,但是最重点还是要了解他的实现原理,栈中是怎么变化的,这个是比较重要的。了解这个之后那些特殊情况也就很容易理解了。
上面我讲的只是简单的使用,关于活动启动模式还有很多要了解。后续可能会解析一下,读者也可以自行去深度了解。

相关免费推荐:编程视频课程

위 내용은 Activity 시작 모드를 살펴보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:jb51.net
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!