如何在共享时仅打开覆盖 Activity,绕过 MainActivity,如 Google Keep?

问题描述 投票:0回答:1

我正在尝试实现类似于 Google Keep 共享行为的功能。当从其他应用共享内容(如文本)并从共享菜单中选择 Google Keep 时,该应用不会打开其 MainActivity 或完整的应用 UI。相反,它显示一个简单的覆盖层(活动)来处理共享内容,同时绕过完整的应用程序启动。

在我的应用程序中,我想实现相同的行为:

当用户从共享菜单中选择我的应用程序时,只会出现一个覆盖 Activity。 从其他应用程序共享内容时,根本不应启动 MainActivity(正常打开应用程序时的默认入口点)。 此覆盖层应仅处理共享 Intent 并显示在当前应用程序的顶部,而无需完全启动我的应用程序的 UI。 我尝试过使用意图过滤器和启动模式,但 MainActivity 仍然会在覆盖 Activity 出现之前启动,或者应用程序会出现意外行为。

有人可以指导我如何正确实施吗?如何防止 MainActivity 在处理共享意图时完全被触发?

谢谢!

android android-intent android-activity share share-intent
1个回答
0
投票

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
来显示一个简单的警报对话框,其中包含消息中传入的意向操作字符串额外内容。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.