Android 개발 중 Activity 의 네 가지 launchMode 에 대해 자세히 알 아 보기

12705 단어 Activity
Activity 스 택 은 주로 Activity 전환 을 관리 하 는 데 사 용 됩 니 다.Intent 를 사용 하여 특정한 목표 Activity 로 이동 하려 면 목표 Activity 의 로드 모드 에 따라 로드 해 야 합 니 다.
Activity 는 모두 다음 과 같은 네 가지 launchMode 가 있 습 니 다.
1.standard:기본적으로 Intent 를 사용 하여 대상 Activity 로 이동 할 때마다 새로운 인 스 턴 스 를 만 듭 니 다.나 쁜 점 은 들 어 갈 때마다 새로운 인 스 턴 스 를 만 들 고 OnCreate 방법 을 실행 하 는 것 이다.
201638150942001.jpg (1240×930)
2.singleTop:뛰 려 는 대상 Activity 가 task 의 맨 위 에 있 습 니 다.(예 를 들 어 제 가 위 챗 홈 페이지 에 있 는 것 을 설명 합 니 다.그리고 Intent 를 사용 하여 InnoXYZ 응용 프로그램의 첫 페이지 로 뛰 어 넘 으 려 면 InnoXYZ 홈 페이지 가 InnoXYZ 의 task 맨 위 에 있 으 면 인 스 턴 스 를 만 들 지 않 고 바로 뛰 어 넘 습 니 다).그러면 새 것 을 만 들 지 않 고 바로 뛰 어 넘 습 니 다.(예 를 들 어 현재 Home Screen 에서 위 챗 홈 페이지 의 푸 시 를 받 았 습 니 다.이때 task 스 택 에 있 는 위 챗 task 의 Activity 스 택 의 맨 위 는 바로 위 챗 홈 페이지 입 니 다.푸 시 를 누 르 면 이 인 스 턴 스 에 바로 들 어가 서 새로운 인 스 턴 스 를 만 들 지 않 습 니 다)
201638151101876.jpg (1240×930)
3.single Task:새로운 task 에서 이 인 스 턴 스 를 생 성 합 니 다.앞으로 호출 할 때마다 이 인 스 턴 스 를 사용 합 니 다.새로운 인 스 턴 스 를 만 들 지 않 습 니 다.
4.single Instance:스 택 에 있 는 유일한 activity 입 니 다.매번 재 활용 됩 니 다.
launchMode 는 여러 개의 Activity 가 도약 하 는 과정 에서 중요 한 역할 을 합 니 다.새로운 Activity 인 스 턴 스 를 생 성 할 지,이미 존재 하 는 Activity 인 스 턴 스 를 다시 사용 할 지,다른 Activity 인 스 턴 스 와 하나의 task 를 공용 할 지 여 부 를 결정 할 수 있 습 니 다.여기 서 task 의 개념 을 간단하게 소개 합 니 다.task 는 스 택 구 조 를 가 진 대상 입 니 다.하나의 task 는 여러 개의 Activity 를 관리 하고 하나의 응용 을 시작 하면 이에 대응 하 는 task 를 만 들 수 있 습 니 다.
우 리 는 AndroidManifest.xml 에서의 android:launchMode 속성 을 상기 네 가지 중 하나 로 설정 하면 됩 니 다.
다음은 실례 를 결합 하여 이 네 가지 lanchMode 를 소개 합 니 다.
1.standard
standard 모드 는 기본 시작 모드 입 니 다.에 android:launchMode 속성 을 설정 하지 않 아 도 됩 니 다.물론 standard 로 값 을 지정 할 수도 있 습 니 다.
표준 시작 모드 를 보 여 주 는 Activity 라 는 이름 의 Activity 를 보 여 드 리 겠 습 니 다.First Activity 코드 는 다음 과 같 습 니 다.
standard 모드 는 기본 시작 모드 입 니 다.에 android:launchMode 속성 을 설정 하지 않 아 도 됩 니 다.물론 standard 로 값 을 지정 할 수도 있 습 니 다.
표준 시작 모드 를 보 여 주 는 Activity 라 는 이름 의 Activity 를 보 여 드 리 겠 습 니 다.First Activity 코드 는 다음 과 같 습 니 다.

package com.scott.launchmode; 
 
import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 
 
public class FirstActivity extends Activity { 
  @Override 
  public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.first); 
    TextView textView = (TextView) findViewById(R.id.textView); 
    textView.setText(this.toString()); 
    Button button = (Button) findViewById(R.id.button); 
    button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
        Intent intent = new Intent(FirstActivity.this, FirstActivity.class); 
        startActivity(intent); 
      } 
    }); 
  } 
} 
우리 First Activity 인터페이스의 TextView 는 현재 Activity 인 스 턴 스 의 시리 얼 번 호 를 표시 하 는 데 사 용 됩 니 다.Button 은 다음 First Activity 인터페이스 로 이동 하 는 데 사 용 됩 니 다.
그리고 우 리 는 몇 번 의 버튼 을 계속 누 르 면 다음 과 같은 현상 이 나타 날 것 이다.
201638151308968.gif (320×120) 201638151209028.gif (320×121) 201638151327302.gif (319×127)
우 리 는 모두 First Activity 의 인 스 턴 스 임 을 알 게 되 었 으 나,일련 번호 가 다 르 고,우 리 는 연속 으로 후퇴 키 를 두 번 눌 러 야 첫 번 째 Frist Activity 로 돌아 갈 수 있다.standard 모드 의 원 리 는 다음 그림 과 같다.
201638151352070.gif (440×212)
그림 에서 보 듯 이 매번 점프 시스템 은 task 에서 새로운 First Activity 인 스 턴 스 를 생 성하 고 스 택 구조의 상단 에 놓 습 니 다.우리 가 후퇴 키 를 눌 렀 을 때 원래 의 First Activity 인 스 턴 스 를 볼 수 있 습 니 다.
이것 이 바로 standard 시작 모드 입 니 다.존재 하 는 인 스 턴 스 가 있 든 없 든 새로운 인 스 턴 스 를 생 성 합 니 다.
2.singleTop
우 리 는 위 에서속성 안 드 로 이 드:launchMode="singleTop"을 지정 하면 시스템 은 singleTop 시작 모드 에 따라 점프 행 위 를 처리 합 니 다.우 리 는 위의 몇 가지 동작 을 반복 하면 아래 의 현상 이 나타 날 것 이다.
201638151417517.gif (320×124) 201638151838515.gif (320×124) 201638151858469.gif (320×124)
우 리 는 이 결과 가 standard 와 다 르 고 세 개의 시리 얼 번호 가 같다 는 것 을 보 았 다.즉,같은 First Activity 인 스 턴 스 를 사용 한 것 이다.후퇴 키 를 누 르 면 프로그램 이 즉시 종료 합 니 다.현재 스 택 구조 에 Activity 인 스 턴 스 가 하나 밖 에 없다 는 것 을 설명 합 니 다.singleTop 모드 의 원 리 는 다음 그림 과 같다.
201638151434213.gif (522×176)
위의 그림 에서 보 듯 이 점프 할 때 시스템 은 먼저 스 택 구조 에서 First Activity 인 스 턴 스 가 스 택 꼭대기 에 있 는 지 찾 습 니 다.있 으 면 새로운 것 을 만 들 지 않 고 직접 사용 합 니 다.여러분 들 이 궁금 해 하 실 수도 있 습 니 다.저 는 스 택 에 하나의 Activity 만 보 았 습 니 다.여러 개의 Activity 라면 어 떡 합 니까?스 택 꼭대기 에 있 지 않 았 다 면 어 땠 을 까요?우 리 는 이어서 다시 하나의 예 시 를 통 해 모두의 의문 을 실증 할 것 이다.
SecondActivity 라 는 Activity 를 새로 만 듭 니 다.다음 과 같 습 니 다.

package com.scott.launchmode; 
 
import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 
 
public class SecondActivity extends Activity { 
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.second); 
    TextView textView = (TextView) findViewById(R.id.textView); 
    textView.setText(this.toString()); 
    Button button = (Button) findViewById(R.id.button); 
    button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
        Intent intent = new Intent(SecondActivity.this, FirstActivity.class); 
        startActivity(intent);        
      } 
    }); 
  } 
} 
그리고 이전의 First Activity 점프 코드 를 다음 으로 변경 합 니 다.

Intent intent = new Intent(FirstActivity.this, SecondActivity.class); 
startActivity(intent); 
 
네,First Activity 는 SecondActivity 로,SecondActivity 는 First Activity 로 넘 어 갑 니 다.데모 결 과 는 다음 과 같 습 니 다.
201638151515857.gif (319×123) 201638151530469.gif (320×118) 201638151550299.gif (320×116)
우 리 는 두 개의 First Activity 의 시리 얼 번호 가 다른 것 을 보 았 는데,SecondActivity 에서 First Activity 로 넘 어 갈 때 새로운 First Activity 인 스 턴 스 가 생 성 되 었 음 을 증명 했다.원리 도 는 다음 과 같다.
201638151628506.gif (320×119) 201638151647962.gif (320×120) 201638151701357.gif (320×119) 201638151723858.gif (320×120)
우 리 는 SecondActivity 에서 First Activity 로 넘 어 갈 때 시스템 에서 First Activity 인 스 턴 스 가 존재 하지만 스 택 꼭대기 에 있 는 것 이 아니 라 인 스 턴 스 를 다시 만 드 는 것 을 보 았 다.
이것 이 바로 single Top 시작 모드 입 니 다.해당 하 는 Activity 인 스 턴 스 가 스 택 꼭대기 에 있 는 것 을 발견 하면 반복 적 으로 이용 하여 새로운 인 스 턴 스 를 만 들 지 않 습 니 다.
3.singleTask
위 를 바탕 으로 FirstActivity 의 속성 안 드 로 이 드:launchMode="single Task"를 수정 합 니 다.프레젠테이션 의 결 과 는 다음 과 같다.
우 리 는 위의 과정 에서 First Activity 의 일련 번 호 는 변 하지 않 고 SecondActivity 의 일련 번 호 는 유일한 것 이 아니 라 SecondActivity 에서 First Activity 로 넘 어 갈 때 새로운 인 스 턴 스 가 생 성 되 지 않 았 음 을 알 게 되 었 다.그러나 First Activity 에서 SecondActivity 로 넘 어 갈 때 새로운 인 스 턴 스 가 생 성 되 었 다.singleTask 모드 의 원리 도 는 다음 그림 과 같다.
201638151803687.gif (440×400)
그림 의 아래 부분 은 SecondActivity 가 First Activity 로 넘 어간 후의 스 택 구조 변화 결과 입 니 다.우 리 는 SecondActivity 가 사 라 졌 다 는 것 을 알 게 되 었 습 니 다.맞습니다.이 스 택 전환 과정 에서 시스템 에 존재 하 는 First Activity 인 스 턴 스 가 발견 되 었 기 때문에 새로운 인 스 턴 스 를 생 성하 지 않 고 First Activity 위의 Activity 인 스 턴 스 를 모두 스 택 에서 나 와 First Activity 를 스 택 꼭대기 대상 으로 바 꾸 었 습 니 다.막 앞 에 보이다.SecondActivity 도 single Task 모드 로 설정 하면 SecondActivity 인 스 턴 스 가 유일 하지 않 을 까 하 는 의문 이 있 을 수 있 습 니 다.이 예제 에 서 는 불가능 합 니 다.SecondActivity 에서 First Activity 로 넘 어 갈 때마다 SecondActivity 인 스 턴 스 가 스 택 에서 나 와 야 하기 때 문 입 니 다.다음 에 First Activity 가 SecondActivity 로 넘 어 갈 때 존재 하 는 SecondActivity 인 스 턴 스 를 찾 을 수 없 기 때문에 새로운 인 스 턴 스 를 만들어 야 합 니 다.하지만 우리 가 Third Activity 가 있어 서 SecondActivity 와 Third Activity 가 서로 뛰 게 한다 면 SecondActivity 인 스 턴 스 는 유일 하 게 보장 할 수 있다.
이것 이 바로 single Task 모드 입 니 다.해당 하 는 Activity 인 스 턴 스 가 발견 되면 이 Activity 인 스 턴 스 위의 다른 Activity 인 스 턴 스 를 모두 스 택 에서 꺼 내 이 Activity 인 스 턴 스 를 스 택 꼭대기 대상 으로 하여 막 앞 에 표시 합 니 다.
4.singleInstance
이 시작 모드 는 새로운 스 택 구 조 를 사용 하기 때문에 Acitvity 를 이 새로운 스 택 구조 에 배치 하고 다른 Activity 인 스 턴 스 가 들 어 오지 않도록 합 니 다.
저 희 는 First Activity 의 launchMode="standard",SecondActivity 의 launchMode="single Instance"를 수정 합 니 다.여러 스 택 구조 와 관련 되 기 때문에 저 희 는 모든 Activity 에 현재 스 택 구조의 id 를 표시 해 야 합 니 다.그래서 저 희 는 모든 Activity 에 다음 과 같은 코드 를 추가 합 니 다.

TextView taskIdView = (TextView) findViewById(R.id.taskIdView); 
taskIdView.setText("current task id: " + this.getTaskId()); 
그리고 이 절 차 를 다시 보 여 드 리 겠 습 니 다.
201638151951749.gif (320×142) 201638152011045.gif (319×139)
우 리 는 이 두 개의 Activity 인 스 턴 스 가 각각 다른 스 택 구조 에 놓 여 있 는 것 을 발견 했다.single Instance 에 관 한 원리 도 는 다음 과 같다.
201638152030493.gif (692×373)
FirstActivity 에서 SecondActivity 로 전환 하 는 것 을 보 았 을 때 새로운 스 택 구 조 를 다시 사용 하여 SecondActivity 인 스 턴 스 를 설치 한 다음 후퇴 키 를 누 르 고 다시 원본 스 택 구조 로 돌아 갑 니 다.그림 의 하단 부분 에 표 시 된 SecondActivity 에서 FirstActivity 로 다시 이동 합 니 다.이 때 시스템 은 원본 스 택 구조 에서 FirstActivity 인 스 턴 스 를 생 성 한 다음 에 두 번 뒤로 물 러 납 니 다.주의 하 세 요.종료 하지 않 고 SecondActivity 로 돌 아 왔 습 니 다.왜 일 까요?SecondActivity 에서 First Activity 로 넘 어 갈 때 우리 의 출발점 은 SecondActivity 인 스 턴 스 가 있 는 스 택 구조 로 바 뀌 었 기 때 문 입 니 다.그러면 우 리 는 이 스 택 구조 로'회귀'해 야 합 니 다.
FirstActivity 의 launchMode 값 을 singleTop,singleTask,singleInstance 의 임의의 값 으로 수정 하면 절 차 는 그림 과 같 습 니 다.
201638152048827.gif (636×174)
single Instance 시작 모드 는 가장 복잡 한 모드 일 수 있 습 니 다.여러분 의 이 해 를 돕 기 위해 저 는 예 를 들 겠 습 니 다.만약 에 저희 가 share 응용 프로그램 이 있다 면 그 중의 Share Activity 는 입구 Activity 이자 다른 응용 프로그램 에서 호출 할 수 있 는 Activity 입 니 다.저 희 는 이 Activity 의 시작 모드 를 single Instance 로 설정 한 다음 에 다른 응용 프로그램 에서 호출 합 니 다.ShareActivity 설정 편집:

<activity android:name=".ShareActivity" android:launchMode="singleInstance"> 
  <intent-filter> 
    <action android:name="android.intent.action.MAIN" /> 
    <category android:name="android.intent.category.LAUNCHER" /> 
  </intent-filter> 
  <intent-filter> 
    <action android:name="android.intent.action.SINGLE_INSTANCE_SHARE" /> 
    <category android:name="android.intent.category.DEFAULT" /> 
  </intent-filter> 
</activity> 
 
그리고 우 리 는 다른 응용 프로그램 에서 이 Activity 를 이렇게 시작 합 니 다.

Intent intent = new Intent("android.intent.action.SINGLE_INSTANCE_SHARE"); 
startActivity(intent); 
우리 가 ShareActivity 를 열 고 후퇴 키 를 눌 러 원래 화면 으로 돌아 갈 때 ShareActivity 는 독립 된 개체 로 존재 합 니 다.이때 우리 가 share 응용 프로그램 을 열 면 새로운 ShareActivity 인 스 턴 스 를 만 들 지 않 아 도 결 과 를 볼 수 있 습 니 다.시스템 이 자동 으로 찾 고 존재 하면 직접 이용 할 수 있 기 때 문 입 니 다.Share Activity 에서 taskId 를 인쇄 해서 효 과 를 볼 수 있 습 니 다.이 과정 에 대하 여 원리 도 는 다음 과 같다.
201638152118151.gif (576×155)

좋은 웹페이지 즐겨찾기