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 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 지원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.