- 印刷する
ディープリンクでアプリを開いた場合
- 印刷する
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を実行したり、ライブページを移動する実装
}
}
}
詳しくは Android ディープリンク作成ガイドをご覧ください。