Skip to content

Instantly share code, notes, and snippets.

@og721
Last active July 24, 2020 07:39
Show Gist options
  • Save og721/464dc97c0ee4877829e2988d3aa9509f to your computer and use it in GitHub Desktop.
Save og721/464dc97c0ee4877829e2988d3aa9509f to your computer and use it in GitHub Desktop.
Android Deep Link 사용
class SchemaActivity: AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
handleDeepLink()
}
private fun handleDeepLink() {
FirebaseDynamicLinks.getInstance()
.getDynamicLink(intent)
.addOnSuccessListener { pendingDynamicLinkData ->
val deepLinkIntent = pendingDynamicLinkData?.link?.let {
DeepLinkInfo.invoke(it).getIntent(this, it)
} ?: DeepLinkInfo.getMainIntent(this)
if ( isTaskRoot ) {
// Root Task 가 아닐 경우 Main Activity 를 Parent Stack 으로 추가
TaskStackBuilder.create(this).apply {
if ( needAddMainForParent(deepLinkIntent) ) {
addNextIntentWithParentStack(DeepLinkInfo.getMainIntent(this@SchemaActivity))
}
addNextIntent(deepLinkIntent)
}.startActivities()
} else {
startActivity(deepLinkIntent)
}
finish()
}
.addOnFailureListener { e ->
Dlog.e("Error :>> ${e.message}")
throw IllegalAccessError("Dynamic Link Access Error")
}
}
private fun needAddMainForParent(intent: Intent): Boolean =
when (intent.component?.className) {
MainActivity::class.java.name -> false
else -> true
}
}
<application ...>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".TestActivity"/>
<activity android:name=".SchemaActivity">
<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="@string/schema_host"
android:scheme="@string/schema" />
</intent-filter>
</activity>
</application>
enum class DeepLinkInfo(@StringRes val hostStringResId: Int) {
MAIN(R.string.schema_main) {
override fun getIntent(context: Context, deepLinkUri: Uri): Intent {
return MainActivity.getIntent(context)
}
},
TEST(R.string.schema_test) {
override fun getIntent(context: Context, deepLinkUri: Uri): Intent {
return TestActivity.getIntent(context, deepLinkUri)
}
};
private val host: String = GlobalApplication.instance.getString(hostStringResId)
abstract fun getIntent(context: Context, deepLinkUri: Uri): Intent
companion object {
fun getMainIntent(context: Context) = MainActivity.getIntent(context)
fun invoke(uri: Uri): DeepLinkInfo {
return values().find { it.host == uri.lastPathSegment } ?: run {
MAIN
}
}
}
}
class TestActivity : AppCompatActivity() {
private var id: String? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_test)
id = intent.getStringExtra(ID)
}
companion object {
fun getIntent(context: Context, deepLinkUri: Uri): Intent {
val id = deepLinkUri.getQueryParameter(ID) ?: run {
Dlog.d("ID 없음")
""
}
return getIntent(context, questionId)
}
private fun getIntent(context: Context, id: String): Intent {
return Intent(context, TestActivity::class.java).apply {
addFlags(
Intent.FLAG_ACTIVITY_CLEAR_TOP
or Intent.FLAG_ACTIVITY_NEW_TASK // To use new bundle data
)
putExtra(ID, id)
}
}
}
}
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
companion object {
fun getIntent(context: Context): Intent =
Intent(context, MainActivity::class.java).apply {
addFlags(
Intent.FLAG_ACTIVITY_CLEAR_TOP
or Intent.FLAG_ACTIVITY_SINGLE_TOP
or Intent.FLAG_ACTIVITY_CLEAR_TASK
)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment