Android Jetpack 구조 구성 요소 Lifecycle 상세 설명

머리말
Lifecycle 은 Jetpack 구조 구성 요소 에서 수명 주 기 를 감지 하 는 구성 요소 입 니 다.Lifecycles 를 사용 하면 수명 주기 와 관련 된 더욱 간결 하고 유지 하기 쉬 운 코드 를 쓸 수 있 습 니 다.
라 이 프 사이클
생명주기 라 는 간단 하면 서도 중요 한 지식 은 모두 가 이미 잘 알 고 있다 고 믿는다.만약 에 우리 가 지금 이런 간단 한 수요 가 있다 면:
이 수 요 는 하나의 실례 일 뿐 실제 개발 에서 당연히 이런 수요 가 있 을 수 없다.
Activity 에서 볼 수 있 을 때,우 리 는 계산 기능 을 하 러 갑 니 다.1 초 마다 계산 을 1 로 합 니 다.Activity 가 보이 지 않 을 때 계산 을 멈 추고,Activity 가 소 멸 될 때 계산 을 0 으로 합 니 다.
OK,So easy~,새 Main3Activity 작성 코드 는 다음 과 같 습 니 다:

public class Main3Activity extends AppCompatActivity {
 
 
 private static final String TAG = "Main3Activity";
 
 int count = 0;
 
 /**
  *     
  */
 private boolean whetherToCount = true;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main3);
 }
 
 
 @Override
 protected void onResume() {
  super.onResume();
  whetherToCount = true;
  new Thread(new Runnable() {
   @Override
   public void run() {
    while (whetherToCount) {
     try {
      Thread.sleep(1000);
      count++;
      Log.d(TAG, "onResume: " + count);
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
    }
   }
  }).start();
 
 }
 
 @Override
 protected void onStop() {
  super.onStop();
  Log.d(TAG, "onStop: ----");
  whetherToCount = false;
 }
 
 
 @Override
 protected void onDestroy() {
  super.onDestroy();
  whetherToCount = false;
  count = 0;
 }
}
실행 결 과 는 다음 과 같다.

우리 의 기대 에 부 합 됩 니 다.당신 은 나 를 경멸 하 며 한 번 보 았 을 것 입 니 다.이렇게 비대 하 잖 아 요.나 는 대상 을 대상 으로 하 는 사람 을 배 웠 기 때문에 당신 은 일 을 WorkUtil 이라는 유형 에 두 었 습 니 다.

public class WorkUtil {
 
 private static final String TAG = "WorkUtil";
 
 private boolean whetherToCount = true;
 
 private int count = 0;
 
 public void start() {
  new Thread(new Runnable() {
   @Override
   public void run() {
    while (whetherToCount) {
     try {
      Thread.sleep(1000);
      count++;
      Log.d(TAG, "start: " + count);
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
    }
   }
  }).start();
 }
 
 public void onStop() {
  whetherToCount = false;
 }
 
 public void onDestory() {
  count = 0;
 }
}
그리고 activity 의 라 이 프 사이클 에서 각각 대응 하 는 방법 을 실행 하 니 뿌 듯 합 니 다~
그러나 이것 도 결합 을 풀기 에는 부족 합 니 다.방법 이 너무 많 으 면 view 의 코드 를 점점 비대 하 게 만 들 수 있 습 니 다.그러면 더 좋 은 방안 이 있 습 니까?이것 이 바로 오늘 말 한 Lifecycle 이다.우 리 는 잠시 후에 고 개 를 돌려 위의 코드 를 최적화 할 것 이다.
라 이 프 사이클 로 라 이 프 사이클 관리
우 리 는 WorkUtil 류 를 바 꾸 어 Lifecycle 을 어떻게 사용 하 는 지 설명 함으로써 WorkUtil 류 가 LifecycleObserver 를 실현 하도록 합 니 다.
우 리 는 OnLifecycleEvent 주 해 를 통 해 방법 이 실행 하 는 생명 주 기 를 설명 합 니 다.다음 과 같 습 니 다.

public class WorkUtil implements LifecycleObserver {
 
 private static final String TAG = "WorkUtil";
 
 private boolean whetherToCount = true;
 
 private int count = 0;
 
 @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
 public void start() {
  new Thread(new Runnable() {
   @Override
   public void run() {
    while (whetherToCount) {
     try {
      Thread.sleep(1000);
      count++;
      Log.d(TAG, "start: " + count);
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
    }
   }
  }).start();
 }
 
 @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
 public void onStop() {
  whetherToCount = false;
 }
 
 @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
 public void onDestory() {
  count = 0;
 }
}
Activity 에 등록 하면 됩 니 다:
getLifecycle().addObserver(new WorkUtil());
이렇게 하면 훨씬 간결 하지 않 습 니까?그러면 우 리 는 왜 Activity 에서 getLifecycle().addObserver(new WorkUtil()를 직접 사용 할 수 있 습 니까?네,사실 LifecycleOwner.getLifecycle 을 사 용 했 습 니 다. LifecycleOwner 는 단일 방법 인터페이스 로 클래스 가 있 음 을 나타 낸다. Lifecycle,activity 가 Appcompat Activity 나 Fragment 에서 androidx.fragment.app.Fragment 를 계승 하면 그들 자체 가 LifecycleOwner 의 인 스 턴 스 입 니 다.이것 은 AndroidX 라 이브 러 리 가 자동 으로 완성 합 니 다.
사용자 정의 LifecycleOwner
저희 액 티 비 티 가 여러 가지 이유 로 Appcompat 액 티 비 티 가 아니 라 액 티 비 티 를 물 려 받 았 다 면 요.

이 럴 때 getLifecycle 을 직접 사용 할 수 없고 Lifecycle Owner 를 사용자 정의 해 야 합 니 다.Activity 를 Lifecycle Owner 에 계승 하도록 합 니 다.
LifecycleRegistry 를 사용 하여 다음 과 같이 정의 합 니 다.

@Override
protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main3);
 
 lifecycleRegistry = new LifecycleRegistry(this);
 getLifecycle().addObserver(new WorkUtil());
 
}

@NonNull
@Override
public Lifecycle getLifecycle() {
 return lifecycleRegistry;
}
이렇게 해서 우 리 는 사용자 정의 LifecycleOwner 를 실 현 했 지만 대부분 사용자 정의 가 필요 하지 않 습 니 다.
우아 한 검색 응용 프로그램 앞 배경 상태
많은 업무 에서 우 리 는 응용 전 백 스테이지 의 상 태 를 감청 해 야 한다.예 를 들 어 프런트 에서 캐 시 작업 을 시작 하고 백 스테이지 에서 캐 시 작업 을 중지 해 야 한다.사실은 방법 이 매우 많다.예 를 들 어
위 에서 말 한 방법 을 사용 하여 BaseActivity 를 감청 하지만 우아 하지 않 습 니 다.모든 Activty 의 생명 주 기 를 감청 하려 면 Activity LifecycleCallbacks 를 사용 해 야 합 니 다.저 희 는 ForegroundCallbacks 류 를 새로 만들어 Activity LifecycleCallbacks 를 실현 합 니 다.

public class ForegroundCallbacks implements Application.ActivityLifecycleCallbacks {
 
 
 private static final String TAG = "ForegroundCallbacks";
 
 @Override
 public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {
  Log.d(TAG, "onActivityCreated: " + activity.getComponentName());
 }
 
 @Override
 public void onActivityStarted(@NonNull Activity activity) {
  Log.d(TAG, "onActivityStarted: "+ activity.getComponentName());
 }
 
 @Override
 public void onActivityResumed(@NonNull Activity activity) {
  Log.d(TAG, "onActivityResumed: "+ activity.getComponentName());
 }
 
 @Override
 public void onActivityPaused(@NonNull Activity activity) {
  Log.d(TAG, "onActivityPaused: "+ activity.getComponentName());
 }
 
 @Override
 public void onActivityStopped(@NonNull Activity activity) {
  Log.d(TAG, "onActivityStopped: "+ activity.getComponentName());
 }
 
 @Override
 public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {
  Log.d(TAG, "onActivitySaveInstanceState: "+ activity.getComponentName());
 }
 
 @Override
 public void onActivityDestroyed(@NonNull Activity activity) {
  Log.d(TAG, "onActivityDestroyed: "+ activity.getComponentName());
 }
}
초기 화 방법 추가:

/**
 *    foregroundCallbacks
 *
 * @param appApplication application
 */
public static ForegroundCallbacks init(AppApplication appApplication) {
 
 instance = new ForegroundCallbacks();
 appApplication.registerActivityLifecycleCallbacks(instance);
 return instance;
}
애플 리 케 이 션 에 등록:
ForegroundCallbacks.init(this);
실행 항목 로 그 는 다음 과 같 습 니 다: 
지금 우 리 는 반드시 onActivity Resumed 와 onActivity Paused 두 가지 방법 에서 판단 해 야 한 다 는 것 을 알 고 있 습 니 다.그러나 resumed 에 들 어가 면 프론트 에 있 는 것 이 아니 라 paused 에 들 어가 면 백 스테이지 입 니 다.왜냐하면 우리 의 응용 프로그램 은 여러 개의 activity 가 있 기 때문에 첫 번 째 activity 가 프론트 에 있 을 때 만 우 리 는 프론트 에 있 음 을 알려 줍 니 다.모든 activity 가 보이 지 않 을 때 만 배경 에 알림 을 줍 니 다.이러한 생각 에 따라 저 희 는 대응 하 는 처 리 를 작성 합 니 다.
우선 인터페이스 에서 프론트 나 백 스테이지 로 되 돌 리 는 방법 을 정의 합 니 다.

public interface Listener {
 /**
  *    
  */
 public void onBecameForeground();
 
 /**
  *    
  */
 public void onBecameBackground();
}
정의 태그 비트

private Runnable runnable;
 
/**
 *      onResumed
 */
private boolean onResumed = false;
 
/**
 *      onPaused
 */
private boolean onPaused = true;

@Override
public void onActivityResumed(@NonNull Activity activity) {
 Log.d(TAG, "onActivityResumed: " + activity.getComponentName());
 onPaused = false;
 if (runnable != null){
  handler.removeCallbacks(runnable);
 }
 handler.postDelayed(runnable = new Runnable() {
  @Override
  public void run() {
   if (!onResumed) {
    listener.onBecameForeground();
    onResumed = true;
   }
  }
 },600);
 
}
 
@Override
public void onActivityPaused(@NonNull Activity activity) {
 Log.d(TAG, "onActivityPaused: " + activity.getComponentName());
 
 onPaused = true;
 if (runnable != null){
  handler.removeCallbacks(runnable);
 }
 
 handler.postDelayed(runnable = new Runnable() {
  @Override
  public void run() {
   if (onResumed && onPaused) {
    onResumed = false;
    listener.onBecameBackground();
   }
  }
 }, 600);
 
 
}
여기 서 우리 가 0.6s 를 지연 시 키 는 이 유 는 새로운 activity 를 시작 하 는 오래된 activity 페이지 가 보이 지 않 을 때 배경 으로 착각 하지 않도록 하기 위해 서 입 니 다.그러나 실제 업무 장면 에서 디 테 일 에 따라 최적화 시 켜 야 합 니 다.application 에 이벤트 리 셋 을 추가 해 야 합 니 다.

ForegroundCallbacks.init(this).addListener(new ForegroundCallbacks.Listener() {
 @Override
 public void onBecameForeground() {
  Log.d(TAG, "onBecameForeground:    ");
 }
 
 @Override
 public void onBecameBackground() {
  Log.d(TAG, "onBecameBackground:    ");
 }
});
실행 프로그램 을 배경 으로 전환 하고 다시 전환 한 결 과 는 다음 과 같 습 니 다. 
이렇게 하면 우 리 는 우아 한 감청 애플 리 케 이 션 앞 배경 을 바 꿀 수 있다.
라 이 프 사이클 의 강 함 을 느 꼈 나 요?
안 드 로 이 드 Jetpack 구조 구성 요소 Lifecycle 에 대한 자세 한 설명 은 여기까지 입 니 다.더 많은 안 드 로 이 드 Jetpack 구조 구성 요소 Lifecycle 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 지원 바 랍 니 다!

좋은 웹페이지 즐겨찾기