Navigation의 DeepLink 라이프 사이클 조사

주의


이것은 나비게이션의 프리뷰 버전 때의 이야기다.발행판의 행동이 다를 수 있으니 믿지 마세요.

개시하다


GoogleIO 2018에 발표된 4Navigation
FragmentTransaction과 같은 번거로운 처리를 없애고 GUI로 화면 이동을 직관적으로 실현한다.(Android Architecture Components)의 새 부품입니다.
화면 이동은커녕 보텀네이비게이션과 네이비게이션뷰 등도 간략하게 지원하는 훌륭한 것들입니다.
이번엔 그중에서 딥링크의 행태가 신경쓰여서 살짝 조사해봤어요.

DeepLink의 라이프 사이클


딥링크를 설치할 때 착지 화면에서 백키를 눌렀을 때의 행동을 자주 고려하고 싶었다.
자세한 화면에 도착하면 백키를 눌러서 프로그램의 메인 화면으로 돌아가야 합니다. 바로 그것입니다.
이를 위해 특별히 홈페이지 화면에서 scheme를 받아들여 URL 모드에 따라 상세 화면으로 옮길 필요가 있다.×이번에는 N 개의 Fragment 같은 것을 고려할 필요가 없다. 매우 번거롭다.
이런 번거로움을 없애는 도구는 이번 Navigation에서 직접 전환하고 싶은 Fragment(Activity)에서 대상의 URL에 로그인하기만 하면 당연히 그 화면으로 옮기는 것은 말할 것도 없고, 그 전의 백그라운드 스택도 모두 쌓인 상태에서 전환된다.
화면 스택을 직접 설치할 필요가 없어 편리하다.
그런데 거기서 느낄 수 있는 것은'표시할 수 없는 스태킹 화면, 라이프 사이클은 어떻게 될까?'
실제 활용 장면 중에는 각 화면의 온리썸에서 가의 스크린트랙을 진행하는 사람이 많다고 생각한다.
만약 모든 쌓인 화면의 생명주기가 호출된다고 가정한다면 상세한 화면으로만 옮길 것이다. 왜 가정 화면의 스크린 수도 측정될까?이런 일이 일어날 수 있다.
이번에는 그런 사고가 발생하지 않도록 실제 다음과 같은 샘플을 제작해 검증했다.

확인


먼저 견본을 만들다.Navigation의 이해는 비교적 간단합니다. 자세한 내용을 알고 싶은 분은 먼저 알아보세요.추천해드려요.
이번에 만든 샘플의 나비게이션은 이런 느낌이에요.
main_navigation.xml
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    app:startDestination="@id/fragment_main">

    <fragment
        android:id="@+id/fragment_main"
        android:name="com.pag.n_satou.navigationsample.MainFragment"
        tools:layout="@layout/fragment_main"
        android:label="MainFragment" >
        <action
            android:id="@+id/action_fragment_main_to_secondFragment"
            app:destination="@id/secondFragment" />
    </fragment>
    <fragment
        android:id="@+id/secondFragment"
        android:name="com.pag.n_satou.navigationsample.SecondFragment"
        android:label="SecondFragment"
        tools:layout="@layout/fragment_second">
    </fragment>
</navigation>
AAC
또한fragmentnavigation을 설정하여main 단추를 누르면secondFragment로 이동합니다.
MainFragment.kt
view.findViewById<Button>(R.id.button).setOnClickListener {
    findNavController(it).navigate(R.id.action_fragment_main_to_secondFragment)
}
이로써 Second Fragment는 Main Fragment를 창고에 있는 Navigation으로 가져가는 것이 되었다.
또한 Deeplink를 열기 위해 SecondFragment에 deeplink를 추가합니다
main_navigation.xml
<fragment
    android:id="@+id/secondFragment"
    android:name="com.pag.n_satou.navigationsample.SecondFragment"
    android:label="SecondFragment"
    tools:layout="@layout/fragment_second">
    <deepLink app:uri="www.navigationsample.com/foo"/>    // ココ
</fragment>
Android Manifest도 편집합니다.
AndroidManifest.xml
<activity android:name=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    <nav-graph android:value="@navigation/main_navigation"/>    // ココ
</activity>
이것이 바로 Second Fragment로 deeplink를 직접 이전하는navigation의 완성이다.

라이프 사이클 보기


우선 시작→버튼 뽑기→화면 이동 순서로 생명주기 확인
정상시
// アプリ起動
D/com.pag.n_satou.navigationsample.MainActivity   #onCreate
D/com.pag.n_satou.navigationsample.MainFragment   #onCreateView
D/com.pag.n_satou.navigationsample.MainFragment   #onViewCreated
D/com.pag.n_satou.navigationsample.MainFragment   #onStart
D/com.pag.n_satou.navigationsample.MainActivity   #onResume
D/com.pag.n_satou.navigationsample.MainFragment   #onResume

// ボタンタップ→画面遷移
D/com.pag.n_satou.navigationsample.SecondFragment #onCreateView
D/com.pag.n_satou.navigationsample.SecondFragment #onViewCreated
D/com.pag.n_satou.navigationsample.SecondFragment #onStart
D/com.pag.n_satou.navigationsample.SecondFragment #onResume
여느 때와 마찬가지로 생명주기다.그럼 deeplink의 생명주기를 보여 주세요.
DeepLink 시
// DeepLinkで起動
D/com.pag.n_satou.navigationsample.MainActivity   #onCreate
D/com.pag.n_satou.navigationsample.MainActivity   #onCreate
D/com.pag.n_satou.navigationsample.SecondFragment #onCreateView
D/com.pag.n_satou.navigationsample.SecondFragment #onViewCreated
D/com.pag.n_satou.navigationsample.SecondFragment #onStart
D/com.pag.n_satou.navigationsample.MainActivity   #onResume
D/com.pag.n_satou.navigationsample.SecondFragment #onResume

// バックキーでMainFragmentへもどる
D/com.pag.n_satou.navigationsample.MainFragment   #onCreateView
D/com.pag.n_satou.navigationsample.MainFragment   #onViewCreated
D/com.pag.n_satou.navigationsample.MainFragment   #onStart
D/com.pag.n_satou.navigationsample.MainFragment   #onResume
부모의 Activity/개체의 Fragment만 초기화되고, 스택된 화면으로 처음 이동했을 때 화면이 초기화된 것 같습니다.재단기.

총결산


라이프 사이클과 초기화는 객체 화면에 도달할 때만 수행됩니다.
아직 정식 버전이 아니기 때문에 릴리스의 행보가 바뀔 수 있지만, 안드로이드 개발에서 생명주기와 심장차가 별로 중요하지 않다고 판단해 앞으로도 주의해야 한다.

좋은 웹페이지 즐겨찾기