使用 intent 在 FCM 通知点击上加载片段
Load Fragment on FCM notification click using intent
我正在使用 fcm 数据消息。当点击 fcm 通知时,我制作了一些 Flow 将用户发送到目标片段
这是我的流程
首先)当收到 fcm 消息时,我将保存有关目标片段信息的 pendingIntent 添加到通知构建器
second) 当点击通知时,它会发送用户登录activity以检查用户是否处于登录状态
第三)如果用户处于登录状态,我将用户发送到目标片段,其中包含从通知 pendingIntent(MainActivity -> 片段)收到的信息
它在第一次拍摄时有效,但后来即使目标已更改,它也只会将用户发送到第一个目标片段。
我的日志说登录 activity 只收到第一个目的地信息
但为什么?请帮助我
// this is onMessageReceived, adding pendingIntent
private fun addPendingIntent(
builder: NotificationCompat.Builder, pushIdx: Int, data: Map<String, String>) {
val loginIntent = Intent({“LoginActivitys intent filter name”}).apply {
flags = Intent.FLAG_ACTIVITY_CLEAR_TASK
putExtra("pushType", data["pushType"])
// the pushType indicate destination fragment
// in this log pushType is change as push is change
Log.e("pushType", "${data["pushType"]}")
…
}
val pendingIntent = PendingIntent.getActivity(
applicationContext,
pushIdx,
loginIntent,
PendingIntent.FLAG_MUTABLE
)
builder.setContentIntent(pendingIntent)
}
// this is login activity
if(isLogin) {
val intent = Intent(applicationContext, MainActivity::class.java)
retrieveAndSetExtras(intent)
startActivity(intent)
viewModel.resetLoginState()
this.finish()
}
private fun retrieveAndSetExtras(sendingIntent: Intent) {
// this log always print first pushType
Log.e("LOGIN", "retrieveAndSetExtras(${this.intent.getStringExtra("pushType")})")
this.intent.getStringExtra("pushType")?.let { pushType ->
sendingIntent.putExtra("pushType", pushType)
this.intent.removeExtra("pushType")
…
}
}
这是因为我没有覆盖 onNewIntent 回调
LoginActivity 应该看起来像...
class LoginActivity: AppCompatActivity() {
...
private var newIntentFlag = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// init viewBinding, viewModel...
setContentView(binding.root)
subscribeLiveData()
if (!newIntentFlag) {
viewModel.checkLoginState()
}
}
override fun onNewIntent(newIntent: Intent?) {
super.onNewIntent(newIntent)
this.intent = newIntent
newIntentFlag = true
}
override fun onResume() {
super.onResume()
if (newIntentFlag) {
viewModel.checkLoginState()
newIntentFlag = false
}
}
private fun subscribeLiveData() {
// here when login state is OK -> handle intentExtras
...
}
}
我在 onResume 回调中创建 newIntentFlag 分支的原因是因为 domain-specific 特性。所以,这不是一般的例子
仔细阅读手册后,我找到了正确答案。这是由于Pendinig Intente的特点。
我只更改了 Intent extra 并希望系统将其识别为另一个 PendingIntent 。但它不是那样工作的,所以我可以通过添加 PendingIntent.FLAG_UPDATE_CURRENT 标志来修复它。
// this is onMessageReceived, adding pendingIntent
private fun addPendingIntent(
builder: NotificationCompat.Builder, pushIdx: Int, data: Map<String, String>) {
val loginIntent = Intent({“LoginActivitys intent filter name”}).apply {
flags = Intent.FLAG_ACTIVITY_CLEAR_TASK
putExtra("pushType", data["pushType"])
// the pushType indicate destination fragment
// in this log pushType is change as push is change
Log.e("pushType", "${data["pushType"]}")
…
}
val pendingIntent = PendingIntent.getActivity(
applicationContext,
pushIdx,
loginIntent,
PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
)
builder.setContentIntent(pendingIntent)
}
由于该手册目前不支持韩语,我的博客可能对韩国人有所帮助。
제 블로그입니다.
我正在使用 fcm 数据消息。当点击 fcm 通知时,我制作了一些 Flow 将用户发送到目标片段
这是我的流程
首先)当收到 fcm 消息时,我将保存有关目标片段信息的 pendingIntent 添加到通知构建器
second) 当点击通知时,它会发送用户登录activity以检查用户是否处于登录状态
第三)如果用户处于登录状态,我将用户发送到目标片段,其中包含从通知 pendingIntent(MainActivity -> 片段)收到的信息
它在第一次拍摄时有效,但后来即使目标已更改,它也只会将用户发送到第一个目标片段。
我的日志说登录 activity 只收到第一个目的地信息 但为什么?请帮助我
// this is onMessageReceived, adding pendingIntent
private fun addPendingIntent(
builder: NotificationCompat.Builder, pushIdx: Int, data: Map<String, String>) {
val loginIntent = Intent({“LoginActivitys intent filter name”}).apply {
flags = Intent.FLAG_ACTIVITY_CLEAR_TASK
putExtra("pushType", data["pushType"])
// the pushType indicate destination fragment
// in this log pushType is change as push is change
Log.e("pushType", "${data["pushType"]}")
…
}
val pendingIntent = PendingIntent.getActivity(
applicationContext,
pushIdx,
loginIntent,
PendingIntent.FLAG_MUTABLE
)
builder.setContentIntent(pendingIntent)
}
// this is login activity
if(isLogin) {
val intent = Intent(applicationContext, MainActivity::class.java)
retrieveAndSetExtras(intent)
startActivity(intent)
viewModel.resetLoginState()
this.finish()
}
private fun retrieveAndSetExtras(sendingIntent: Intent) {
// this log always print first pushType
Log.e("LOGIN", "retrieveAndSetExtras(${this.intent.getStringExtra("pushType")})")
this.intent.getStringExtra("pushType")?.let { pushType ->
sendingIntent.putExtra("pushType", pushType)
this.intent.removeExtra("pushType")
…
}
}
这是因为我没有覆盖 onNewIntent 回调
LoginActivity 应该看起来像...
class LoginActivity: AppCompatActivity() {
...
private var newIntentFlag = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// init viewBinding, viewModel...
setContentView(binding.root)
subscribeLiveData()
if (!newIntentFlag) {
viewModel.checkLoginState()
}
}
override fun onNewIntent(newIntent: Intent?) {
super.onNewIntent(newIntent)
this.intent = newIntent
newIntentFlag = true
}
override fun onResume() {
super.onResume()
if (newIntentFlag) {
viewModel.checkLoginState()
newIntentFlag = false
}
}
private fun subscribeLiveData() {
// here when login state is OK -> handle intentExtras
...
}
}
我在 onResume 回调中创建 newIntentFlag 分支的原因是因为 domain-specific 特性。所以,这不是一般的例子
仔细阅读手册后,我找到了正确答案。这是由于Pendinig Intente的特点。
我只更改了 Intent extra 并希望系统将其识别为另一个 PendingIntent 。但它不是那样工作的,所以我可以通过添加 PendingIntent.FLAG_UPDATE_CURRENT 标志来修复它。
// this is onMessageReceived, adding pendingIntent
private fun addPendingIntent(
builder: NotificationCompat.Builder, pushIdx: Int, data: Map<String, String>) {
val loginIntent = Intent({“LoginActivitys intent filter name”}).apply {
flags = Intent.FLAG_ACTIVITY_CLEAR_TASK
putExtra("pushType", data["pushType"])
// the pushType indicate destination fragment
// in this log pushType is change as push is change
Log.e("pushType", "${data["pushType"]}")
…
}
val pendingIntent = PendingIntent.getActivity(
applicationContext,
pushIdx,
loginIntent,
PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
)
builder.setContentIntent(pendingIntent)
}
由于该手册目前不支持韩语,我的博客可能对韩国人有所帮助。 제 블로그입니다.