ディープリンクでアプリを開いた場合

    ディープリンクでアプリを開いた場合


    記事の要約

    Android Shoplive Player SDKは商品クリック、お知らせクリックなどの様々なイベントを通じてShoplive PlayerがPIPに切り替わる時、 ActivityManager の getAppTasks() を使って顧客のアプリのTaskを探し、moveToFront() 関数を使って顧客のアプリをフォアグラウンドに引き上げます。

    • アプリアイコンをタップしてアプリを開き、Shoplive Playerを起動すると、PIPに降りた時点でランチャータスクが見つかり、顧客のアプリをフォアグラウンドにアップロードして切り替えます。

    • ただし、ディープリンクでアプリを開いたとき、PIPに移動すると、顧客のアプリのタスクを見つけてフォアグラウンドにアップロードできない場合があります。 これは、ディープリンクを実行しているプリンシパルがIntent.FLAG_ACTIVITY_NEW_TASK フラグを使用して呼び出しを行ったかどうかによって異なります。


    Androidのディープリンクのドキュメントでは、次のように説明されています。暗黙的なディープリンクをトリガーする場合、バックスタックの状態は、暗黙的なインテントがIntent.FLAG_ACTIVITY_NEW_TASK フラグで実行されたかどうかによって異なります。

    • フラグが設定されると、作業バックスタックが削除され、ディープリンクターゲットに置き換えられます。明示的なディープリンクと同様に、グラフをネストすると、各ネストレベルの開始ターゲット、つまり階層内の各 要素の開始ターゲットもスタックに追加されます。つまり、ユーザーがディープリンクターゲットの戻るボタンを押すと、エントリポイントからアプリに入ったかのように、ナビゲーションスタックを上に移動します。

    • フラグが設定されていない場合、暗黙的なディープリンクは、トリガーされた前のアプリのアクションスタックに残ります。この場合、戻るボタンを押すと前のアプリに戻り、上ボタンを押すとナビゲーション グラフ内の階層の上位のターゲットでアプリのアクションが開始されます。


    そのため、ディープリンクを実行する人がIntent.FLAG_ACTIVITY_NEW_TASK フラグを適用したかどうかに関係なく、Shoplive Playerを同じように動作させたい場合は、ディープリンクを担当するSchemeActivityを別途実装し、次のActivityを呼び出す Intent.FLAG_ACTIVITY_NEW_TASK フラグを使用する必要があります。


    サンプルコード

    shoplive://live?ak={accessKey}&ck={campaignKey}

    AndroidManifest.xml

    <activity
    	android:name=".SchemeActivity"
    	android:exported="true"
    	android:noHistory="true"
    	android:screenOrientation="portrait">
      <intent-filter>
        <action android:name="android.intent.action.VIEW" />
    
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
    
        <data
          android:host="live"
          android:scheme="shoplive" />
      </intent-filter>
    </activity>

    SchemeActivity

    class SchemeActivity : AppCompatActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
    
            execute(intent)
        }
    
        override fun onNewIntent(intent: Intent?) {
            super.onNewIntent(intent)
    
            execute(intent)
        }
    
        private fun execute(intent: Intent?) {
            intent ?: return
    
            val data = intent.data
            val accessKey = data?.getQueryParameter("ak") ?: return
            val campaignKey = data.getQueryParameter("ck")
    
            if (accessKey.isNotEmpty() && !campaignKey.isNullOrEmpty()) {
                // Intent.FLAG_ACTIVITY_NEW_TASKを適用してMainActivityを呼び出します。
                val intent = Intent(this, MainActivity::class.java)
                intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
                intent.putExtra("accessKey", accessKey)
                intent.putExtra("campaignKey", campaignKey)
                startActivity(intent)
            }
        }
    }

    MainActivity

    class MainActivity : AppCompatActivity() {
    
        companion object {
            private const val ACCESS_KEY = "accessKey"
            private const val CAMPAIGN_KEY = "campaignKey"
        }
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            val accessKey = intent.getStringExtra(ACCESS_KEY)
            val campaignKey = intent.getStringExtra(CAMPAIGN_KEY)
            if (accessKey?.isNotEmpty() == true && campaignKey?.isNotEmpty() == true) {
                // Shoplive Playerを実行したり、ライブページを移動する実装
            }
        }
    }