gpt4 book ai didi

android - 与初始屏幕和登录状态的深度链接

转载 作者:行者123 更新时间:2023-12-03 13:26:10 25 4
gpt4 key购买 nike

我使用导航组件。
我有两个主要部分的应用程序:
nav_graph 的 1 个飞溅 Activity
2 带有底部导航的主要 Activity ,其中每个菜单项都有自己的 nav_graph。
问题是当通知弹出时我无法弄清楚如何进行导航。

所以当通知到达并且用户点击它时,我需要:
- 检查应用程序是否打开以及现在打开的屏幕
- 如果应用程序已关闭或在后台,通过深层链接,检查启动 Activity :如果用户已登录 - 移动到主要 Activity (如果不提供身份验证屏幕)保持导航到我需要的 fragment 的深层链接。

飞溅图和三个 memu 项目图之一

<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/splash_graph"
app:startDestination="@id/splashFragment">

<fragment android:id="@+id/splashFragment"
android:name="com.app.app.ui.navigation.fragment.SplashFragment"
android:label="SplashFragment">

<action android:id="@+id/action_splashFragment_to_authFragment"
app:popUpTo="@+id/authFragment"
app:popUpToInclusive="true"
app:destination="@id/authFragment"/>

<action android:id="@+id/action_splashFragment_to_mainActivity"
app:popUpTo="@+id/mainActivity"
app:popUpToInclusive="true"
app:destination="@id/mainActivity" app:launchSingleTop="true"/>
</fragment>

<fragment android:id="@+id/authFragment"
android:name="com.app.app.ui.navigation.fragment.AuthFragment"
android:label="AuthFragment">

<action android:id="@+id/action_authFragment_to_mainActivity"
app:popUpTo="@+id/mainActivity"
app:popUpToInclusive="true"
app:destination="@id/mainActivity" app:launchSingleTop="true"/>
</fragment>

<activity android:id="@+id/mainActivity"
android:name="com.app.app.ui.navigation.activity.MainActivity"
android:label="MainActivity">
<deepLink android:id="@+id/deepLinkMain" app:uri="com.app.app/"/>
</activity>


</navigation>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/nextFragment"
app:startDestination="@id/nxtFragment">

<fragment android:id="@+id/nxtFragment"
android:name="com.app.app.ui.navigation.fragment.NextFragment"
android:label="Next">
<deepLink
android:id="@+id/deepLink"
app:uri="com.app.app/nextFragment{id}"
android:autoVerify="true"/>
<argument
android:name="id"
app:argType="string"/>
</fragment>
</navigation>

最佳答案

您可以使用未决 Intent 来执行此操作,假设您获得如下数据负载:

{
"title":"Title",
"message":"message test",
"data":{
"meta":{
"notificationType":"1",
"name":"Rjz"
}
}
}

根据 通知类型 您必须打开特定屏幕,然后您可以执行以下操作:

sendNotification("msg","title",remoteMessage.data)
private fun sendNotification(messageBody: String,title: String?,data: MutableMap<String, String>) {

val intent = Intent(this, SplashActivity::class.java)
intent.putExtra("meta", data["meta"])
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
val pendingIntent = PendingIntent.getActivity(
this, 0 /* Request code */, intent,
PendingIntent.FLAG_ONE_SHOT
)

val channelId = getString(R.string.default_notification_channel_id)
val defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
val notificationBuilder = NotificationCompat.Builder(this, channelId)

notificationBuilder.setSmallIcon(R.drawable.ic_app_logo)
.setContentTitle(title)
.setContentText(messageBody)
.setAutoCancel(true)
.setStyle(NotificationCompat.BigTextStyle())
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent)

val notificationManager =
getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

// Since android Oreo notification channel is needed.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channel = NotificationChannel(
channelId,
"Channel human readable title",
NotificationManager.IMPORTANCE_DEFAULT
)
notificationManager.createNotificationChannel(channel)
}

notificationManager.notify(0 /* ID of notification */, notificationBuilder.build())
}

在初始屏幕中,您可以检查待处理的 Intent 数据,如下所示:
val metaString: String? = if (intent.hasExtra("meta")) {
intent.extras.get("meta").toString()
} else {
null
}
var gson = Gson()
var pushData = gson.fromJson(
metaString,
YourModel::class.java
)
if(pushData.notificationType==1){
NavDeepLinkBuilder(this@SplashActivity)
.setComponentName(MainActivity::class.java)
.setGraph(R.navigation.name_of_nav_graph)
.setDestination(R.id.your_dstination_fragment)
.setArguments(bundleOf(
"name" to pushData.name)
).createTaskStackBuilder().startActivities()
}

如果你想通过,你也可以通过参数。

在这种情况下,这是一种简单的方法。
让我知道你是否卡在任何地方。
请享用..!!

关于android - 与初始屏幕和登录状态的深度链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55831529/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com