春天前销销售 - 保存一切。所有视频。所有书籍。 现在50%的折扣。

建立您的移动发展技能并保存!通过终极书籍和视频订阅,继续前进。作为春季前销销售的一部分,仅为149美元/年。

首页 安卓& Kotlin Tutorials

泡沫&在Android 11中的对话11:入门

了解如何在Android中使用泡沫来添加开奖结果3d并创建直接共享的会话快捷方式。

5/5 3个评分

版本

  • Kotlin 1.3,Android 10.0,Android Studio 3.5
更新注释:Jenn Bailey更新了Android 11的本教程。她还写了原来。

Android手机的最重要的事情是连接人们。如果你觉得自己想和你说话的人在一起,那不是很好吗?

安卓11具有壮观的新功能,帮助开发人员和用户做到这一点。这些功能允许快速访问对话 谈话快捷方式 并增加一个新的 谈话 开奖结果3d阴影的部分。 泡沫 还为您提供了复杂的共享和排名功能,以及改进的多任务处理。

这些变化反映了该平台的目标:它将继续发展以专注于人们和对话作为多年来的Android倡议的一部分。

表达与心脏的愉快的android喜悦。

在本教程中,您将了解如何将这些功能添加到调用的应用程序中 泡沫肯定,它模拟了与鼓舞人心的角色的聊天,他们在指尖的宣传方面提供了快速修复的持续鼓励。

在此过程中,您将学习如何:

  • 在对话部分中显示开奖结果3d
  • 创建对话快捷方式
  • 允许直接分享快捷方式
  • 将元数据添加到泡沫
  • 检测泡沫的用户许可
笔记:本教程假设您有Kotlin和Android的基本知识。如果您是Android的新手,请查看我们的 安卓tutorials.

也许你知道Android,但不熟悉Kotlin。如果是这种情况,请看看 Kotlin for Android:介绍.

如果您想要一个开奖结果3d的快速入门,请偷看 Android开奖结果3d教程:入门.

现在,是时候潜入!

入门

使用使用的项目材料 下载材料 本教程顶部或底部的按钮。打开 起动机 项目在Android Studio。项目完成加载,构建和运行后。

显示肯定报价类别列表的入门应用程序

选择一类肯定,以查看来自该类别的随机报价:
示例报价

点击右上角的铃声图标,您所选的报价将显示为开奖结果3d:
显示报价的简单开奖结果3d。

这个开奖结果3d可能更有启发性。在下一步中,您将宣传到抽屉的对话部分。

显示对话中的开奖结果3d部分

许多手机在开奖结果3d阴影顶部有一个保留部分,用于实时对话。在本节中出现的开奖结果3d具有更强大的视觉强调化身,突出显示对话是谁。在此区域中的长按开奖结果3d显示您可以采取的对话特定操作。

To appear in this section, the notification must use MessagingStyle and associate the message with a 。你会看到接下来如何做到这一点。

将一个人添加到谈话中

打开 notificationhelper.kt. and add the method below inside NotificationHelper:

private fun createPerson(icon: Icon, category: Category): Person {
  return Person.Builder()
    .setName(category.name)
    .setIcon(icon)
    .build()
}

此代码生成一个人与开奖结果3d关联,使其成为一个 人士开奖结果3d.

Now, in showNotification, add the following above the line of code that creates the notification:

val person = createPerson(icon, quoteAndCategory.category)

The code above creates the person. Now, update the line of code that creates the notification to:

val notification = createNotification(quoteAndCategory, icon, person)

This passes the person to createNotification.

Then, replace createNotification with:

private fun createNotification(
  quoteAndCategory: QuoteAndCategory,
  icon: Icon,
  person: Person
): Notification.Builder {
  return Notification.Builder(context, CHANNEL_QUOTES)
    // 1
    .setContentTitle(quoteAndCategory.category.name)
    .setSmallIcon(icon)
    // 2
    .setShortcutId(quoteAndCategory.category.shortcutId)
    .setLocusId(LocusId(quoteAndCategory.category.shortcutId))
    .setCategory(Notification.CATEGORY_MESSAGE)
    // 3
    .setStyle(Notification.MessagingStyle(person)
      .setGroupConversation(false)
      .addMessage(quoteAndCategory.quote.quoteText,
                  currentTimeMillis(), person)
    )
    // 4
    .setShowWhen(true)
    .setContentIntent(createPendingMainIntent(
      REQUEST_CONTENT,
      quoteAndCategory.category)
    )
}

createNotification 配置和返回 notification.Builder. 发送开奖结果3d。这是里面发生的事情:

  1. 首先,您将标题和图标设置为开奖结果3d。
  2. Then you use setShortcutId or setShortcutInfo to associate the notification with a long-lived dynamic or cached sharing shortcut when targeting Android 11. You also set the LocusId to improve ranking accuracy.
  3. 在 Android 11, a conversation notification must use MessagingStyle.
  4. 最后,您包括开奖结果3d的时间,并在用户点击开奖结果3d时设置打开的意图。
笔记: Using LocusId helps the on-device intelligence figure out which conversations interest the user most. Ranking is based on how recent and how frequent the conversations are.

为了更好地排名,消息传递应用程序可以包括一个 Uri. to a contact.

了解回力行为

If you want a conversation to appear in the Conversations section in Android 11, you must associate it with a valid, long-lived, dynamic or cached sharing shortcut and use MessagingStyle. The user can demote the conversation by altering the notification channel settings.

Apps that target Android 10 can make messages appear in the notification space, but the requirements are different. If the app uses MessagingStyle, it isn’t necessary to provide a shortcut in Android 10. However, if you don’t provide a shortcut, users won’t be able to see conversation-specific functions inline by long-pressing the notification.

If you set the category to CATEGORY_MESSAGE and the platform recognizes the app as a messaging app, it will still show in the Conversations section, but it will be in the pre-Android 11 style with no conversation-specific functions.

Now that you’ve associated the notification with a person, build and run:

人体风格的开奖结果3d,但不是对话部分。

该开奖结果3d现在看起来更好,发件人的化身更明显。但是,对于在会话区域中出现的开奖结果3d,您必须将其与有效的快捷方式相关联。您将创建下一个快捷方式。

创建对话快捷方式

When targeting Android 11 or higher, you have to give a shortcut to any notification you want to show in the conversation space. Shortcuts are a handy way for a user to jump right into a conversation. Be sure to use AdaptiveIconDrawable for your shortcut icons. Otherwise, the avatar might not look as intended.

笔记:要了解更多,请按照此操作 捷径图像 guide.

在内部添加以下功能 notificationhelper.kt.:

private fun createShortcutIcon(category: Category): Icon {
  return Icon.createWithAdaptiveBitmap(
    context.resources.assets.open(
      "${category.name.toLowerCase(Locale.ROOT)}.png").use {
        input ->
          BitmapFactory.decodeStream(input)
       })
}

此代码提供了一个自适应位图,以便您可以添加快捷方式。要执行此操作,请首先添加新的Android资源文件 res.快捷方式.xml.。类型 快捷方式 作为根元素并选择 XML. 作为资源类型和 XML. 作为目录名称。

使用XML添加快捷方式.xml文件

快捷方式.xml., inside the shortcut tag, add the following code:

<share-target android:targetClass=
  "com.raywenderlich.android.bubblesaffirmations.ui.main.MainActivity">
  <data android:mimeType="text/plain" />
  <category android:name=
    "com.example.android.bubbles.category.TEXT_SHARE_TARGET" />
</share-target>

The share-target element holds information about which class will handle the intent, the type of data it can accept from sharing and the category that the direct share target uses.

接下来,开放 androidmanifest.xml.xml. and add the following code above the closing activity tag for MainActivity:

<meta-data
  android:name="android.app.shortcuts"
  android:resource="@xml/shortcuts" />

The code above associates MainActivity with the dynamic shortcut’s share-target in 快捷方式.xml..

接下来,开放 notificationhelper.kt. and add the following inside NotificationHelper:

private fun createDynamicShortcutIntent(category: Category): Intent =
  Intent(context, MainActivity::class.java)
    .setAction(Intent.ACTION_VIEW)
    .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
    .setData(
      Uri.parse(
        "//raywenderlich.android.bubblesaffirmations.com"
        + "/quote/${category.categoryId}"
      )
    )

createDynamicShortcutIntent creates the intent to launch from this shortcut. It uses a URI that passes categoryId to link directly to a specific conversation in the app via the shortcut.

还在 notificationhelper.kt., 添加:

private fun createShortcuts() = categories.map { category ->
  ShortcutInfo.Builder(context, category.shortcutId)
    // 1
    .setLocusId(LocusId(category.shortcutId))
    .setActivity(ComponentName(context, MainActivity::class.java))
    .setShortLabel(category.name)
    .setIcon(createShortcutIcon(category))
    // 2
    .setLongLived(true)
    // 3
    .setCategories(
      setOf("com.example.android.bubbles.category.TEXT_SHARE_TARGET")
    )
    .setIntent(createDynamicShortcutIntent(category))
    // 4
    .setPerson(createPerson(createIcon(category), category)
  ).build()
}

以下是上面的代码所做的:

  1. LocusId 帮助系统基于App Usage准确对话进行对话。
  2. Conversation shortcuts must be long-lived. If the conversation no longer exists, the app can delete the shortcut with removeLongLivedShortcuts. Don’t remove shortcuts unless absolutely necessary — for example, when the user blocks a contact.
  3. Sets the category to the share-target defined in 快捷方式.xml.。类别描述了用户可以共享到快捷方式的数据类型。
  4. 用头像创建一个人,并将人员与快捷方式联系起来。会话快捷方式总是有一个关联的人物对象。

动态更新快捷方式

Now that the code to create the shortcuts is in place, it’s time to add the ability to update them dynamically. Add the code below to UpdateShortCuts.:

var shortcuts = createShortcuts()
// 1
if (importantCategory != null) {
  shortcuts = shortcuts.sortedByDescending { it.id == importantCategory.shortcutId }
}
// 2
val maxCount = shortcutManager.maxShortcutCountPerActivity
if (shortcuts.size > maxCount) {
  shortcuts = shortcuts.take(maxCount)
}
// 3
shortcutManager.addDynamicShortcuts(shortcuts)

UpdateShortCuts. 动态排列快捷方式,确保数字不超过允许的最大值。以下是代码中发生的内容:

  1. 如果有一个重要的类别,请将其移动到快捷方式列表的顶部,以便轻松访问。
  2. 该平台限制了可以在列表中显示的快捷方式的数量,因此如果类别不完全适合,则需要截断列表。
  3. Use a call to addDynamicShortcuts to add the shortcuts.

应用程序启动并设置开奖结果3d通道时,它使用 UpdateShortCuts. 创建快捷方式。每次应用程序显示开奖结果3d时,它会更新快捷方式以保留快捷方式列表顶部的最常用的对话。

测试快捷方式

构建和运行,然后按 首页 按钮并找到应用程序图标。长按应用程序图标以查看快捷方式:

短圈出现快捷方式

选择快捷方式以在应用程序中打开该类别并启动开奖结果3d,然后拉下阴影以查看它:

出现开奖结果3d

“开奖结果3d”现在在对话部分中显示。长按开奖结果3d:

将开奖结果3d设置为优先级。

设置对话以优先权。第一次执行此操作,系统确认对话现在是优先级。将对话设置为优先级具有以下效果:

  • 它在化身周围添加了橙色圆圈。
  • 对话现在出现在对话部分的顶部。
  • 化身显示在锁屏上。
  • 用户可以设置他们的请勿打扰设置以通过。

现在,您将添加一个组件,允许快捷方式出现在 直接分享.

允许通过快捷方式直接分享

会话快捷方式使其容易分享对话 直接分享。在Android 11中,您可以将最多四个应用程序输入默认共享菜单。否则,应用程序和对话会出现在菜单中,组织上下文。

将快捷方式添加到直接分享,打开 androidmanifest.xml.xml. and add the following code inside the activity tag for MainActivity:

<intent-filter>
  <action android:name="android.intent.action.SEND" />
  <category android:name="android.intent.category.DEFAULT" />
    <data android:mimeType="text/plain" />
  </intent-filter>

建立和运行。现在,您可以关闭应用程序,或在您打开最喜欢的Web浏览器并搜索引用时将其打开。突出显示报价并点击 分享:

突出报价分享

您将看到带有应用程序和对话快捷方式的直接共享菜单:

直接共享表格与对话快捷方式和应用图标

笔记:较高的对话可能会使这个应用程序的对话掩盖直接分享。

您可以选择任何对话快捷方式,以在应用程序中保存此类别下的报价。或者,您还可以选择应用程序本身,然后选择一个类别:

在应用中选择的一致性类别

用户现在可以通过直接共享的对话快捷方式直接分享到应用程序。做得好!

开奖结果3d泡沫

使用泡沫时,用户可以选择禁止某些应用程序或对话,因此为泡沫提供足够的信息来始终是一个好主意。因为您在此应用程序中完成了,现在您可以添加额外的信息 bubmereetadata..

添加bubmaltadata.

NotificationHelper, 添加:

private fun createPendingQuoteBubbleIntent(category: Category):
  PendingIntent {
    val contentUri = (
      "//raywenderlich.android.bubblesaffirmations.com/" +
      "quote/${category.categoryId}")
      .toUri()
    return PendingIntent.getActivity(
      context,
      REQUEST_BUBBLE,
      Intent(context, QuoteBubbleActivity::class.java)
            .setAction(Intent.ACTION_VIEW)
            .setData(contentUri),
        PendingIntent.FLAG_UPDATE_CURRENT
    )
  }

This generates PendingIntent, which bubmereetadata. uses to open the category indicated by the ID in contentUri.

Now, still in NotificationHelper, 添加:

private fun createBubbleMetadata(
  icon: Icon,
  fromUser: Boolean,
  category: Category
): Notification.BubbleMetadata {
  return Notification.BubbleMetadata.Builder(
    // 1
    createPendingQuoteBubbleIntent(category),
    icon
  )
  // 2
  .setDesiredHeightResId(R.dimen.bubble_height)
  .apply {
    // 3
    if (fromUser) {
      setAutoExpandBubble(true)
      setSuppressNotification(true)
    }
  }
  .build()
 }

The code above generates bubmereetadata.. Here’s what it does:

  1. The bubble uses PendingIntent, which contains the activity for the expanded bubble.
  2. 扩张的气泡将存在于所需的高度。
  3. 如果用户明确要求气泡,它会自动以扩展形式显示,因此没有理由与泡沫显示开奖结果3d。

Now, locate showNotification and add the following, right before the call to notify on NotificationManager:

val bubbleMetaData = createBubbleMetadata(
  icon,
  fromUser,
  quoteAndCategory.category
)
notification.setBubbleMetadata(bubbleMetaData)

The code above creates bubmereetadata. and associates it with the notification. This gives the notification the information it needs to be a bubble.

让你的活动泡泡

对于出现在泡沫中的活动,您需要进行一些更改 androidmanifest.xml.xml.. Start by adding the following attributes in the activity tag for QuoteBubbleActivity:

android:allowEmbedded="true"
android:documentLaunchMode="always"
android:resizeableActivity="true"

这些属性允许活动在泡沫内显示。就是这样:

  • allowEmbedded="true" 让您在系统UI中嵌入泡沫的活动。
  • res.izeableActivity="true" 让系统UI调整扩展泡沫的大小。
  • documentLaunchMode="always" 声明系统UI需要此属性,因此它可以创建此活动的多个实例。

构建和运行,选择一个类别并启动开奖结果3d:

与泡沫图标开奖结果3d

现在,开奖结果3d在左下角有一个正方形图标。点击此图标启动泡沫中的开奖结果3d:

开奖结果3d在泡沫中显示

您现在可以通过点击并将泡沫图标拖动到底部的关闭图标:

关闭泡泡

检测泡沫用户权限

因为用户可以为特定应用程序或对话中的泡沫开奖结果3d选择,所以可以方便地知道何时允许冒泡。在 notificationhelper.kt., replace the body of canBubble with:

val channel = notificationManager.getNotificationChannel(
  CHANNEL_QUOTES,
  category.shortcutId
)
return notificationManager.areBubblesAllowed()
  || channel?.canBubble() == true

Because the user can turn off bubbles at multiple levels, you query notificationManager and channel to see if bubbles are allowed.

使用此代码到位,构建和运行并选择之前选择的相同类别,并允许泡沫:

图标指示是否允许类别泡沫

右上角的图标从开奖结果3d贝尔更改为更冒泡的象牙,表明来自此类别的引号可以泡沫。看看其他类别,你会看到他们仍然有铃铛图标。这是因为,默认情况下,该应用程序有权对泡沫进行所选对话。用户可以在应用程序的开奖结果3d设置下选择性地更改这些设置:

改变泡沫的开奖结果3d设置

背景泡沫

但是如果该应用程序在后台发射泡沫时何时何地呢?

应用程序即使在前景中也可以启动泡沫。但是,泡沫不会在所有设备上扩展。在行动中看到这一点,开放 quoteviewmodel.kt.. Find showAsBubble and replace the body with:

val scope = CoroutineScope(Dispatchers.Main)
scope.launch {
  delay(5000)
  quoteData.value?.let { quote ->
    category.value?.let { category ->
      QuoteAndCategory(quote, category)
    }
  }?.let { repository.showAsBubble(it) }
}

上面的代码将在推出开奖结果3d泡沫之前等待五秒钟。构建并运行并选择您以前允许泡沫的类别。按图标泡沫对话,然后在后台快速放置应用程序:

应用程序在背景中冒出谈话

很快,你会看到泡沫出现,即使该应用程序不在前景中。根据您的设备,可能会或可能不会扩展。

然后去哪儿?

点击下载已完成的项目文件 下载材料 按钮在教程的顶部或底部。

在本教程中,您了解了如何通过共享和快捷方式将正常开奖结果3d转换为泡沫并链接到您的应用程序。

如果您想了解更多关于泡沫的信息,请访问 官方Android文件.

要了解有关开奖结果3d的更多信息,请从中查看此课程 Android背景处理 video course.

对于关于快捷方式和气泡的Codelab,请退房 人:谈话和泡沫.

要了解有关直接分享和快捷方式的更多信息,请参阅 这款Codelab..

我希望你喜欢这个教程!如果您有任何疑问或评论“泡沫”,请加入下面的论坛讨论。

平均评级

5/5

为此内容添加评级

3 ratings

更像这样的

贡献者

注释