我正在尝试实现类似于 Google Keep 共享行为的功能。当从其他应用共享内容(如文本)并从共享菜单中选择 Google Keep 时,该应用不会打开其 MainActivity 或完整的应用 UI。相反,它显示一个简单的覆盖层(活动)来处理共享内容,同时绕过完整的应用程序启动。
在我的应用程序中,我想实现相同的行为:
当用户从共享菜单中选择我的应用程序时,只会出现一个覆盖 Activity。 从其他应用程序共享内容时,根本不应启动 MainActivity(正常打开应用程序时的默认入口点)。 此覆盖层应仅处理共享 Intent 并显示在当前应用程序的顶部,而无需完全启动我的应用程序的 UI。 我尝试过使用意图过滤器和启动模式,但 MainActivity 仍然会在覆盖 Activity 出现之前启动,或者应用程序会出现意外行为。
有人可以指导我如何正确实施吗?如何防止 MainActivity 在处理共享意图时完全被触发?
谢谢!
Keeps 应用程序正在由于意图操作而启动活动。这是一种透明的活动,没有状态或历史。该活动在 Android 清单中注册为
mimeType
- 您可以选择您感兴趣的 MIME 类型,并在解析数据后执行一些工作。
以下是实现类似效果的方法:
首先,声明一个可以在您的
AndroidManifest
中接收合适意图的活动:
<activity
android:name=".ShareActivity"
android:exported="true"
android:launchMode="singleInstance"
android:noHistory="true"
android:stateNotNeeded="true"
android:theme="@style/Theme.ShareTest.Transparent">
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
</activity>
我设置了一些属性来影响系统如何处理最近屏幕上的活动 - 根据需要进行修改。
请注意,我的主题在
themes.xml
中设置为透明:
<style name="Theme.ShareTest.Transparent" parent="Theme.Material3.DayNight.NoActionBar">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsFloating">true</item>
<item name="android:backgroundDimEnabled">false</item>
</style>
这是我设置的
ShareActivity
:
class ShareActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val intent = this.intent
when {
intent?.action == Intent.ACTION_SEND -> {
if ("text/plain" == intent.type) {
// pull out the text from the intent
val text: String? = intent.getStringExtra(Intent.EXTRA_TEXT)
// do something useful with the result
MaterialAlertDialogBuilder(this).apply {
setMessage("Received some text: $text")
setPositiveButton("Okay") { dialog, _ -> dialog.dismiss() }
}.show()
}
}
else -> {
// handle other intent actions...
}
}
}
}
您可以执行您需要的任何工作,还可以提供您想要的任何 UI。我使用上面的
MaterialAlertDialogBuilder
来显示一个简单的警报对话框,其中包含消息中传入的意向操作字符串额外内容。