使用 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)
}

android doc : PendingIntent

由于该手册目前不支持韩语,我的博客可能对韩国人有所帮助。 제 블로그입니다.