NFC intent 仅当应用不在后台 运行 时才使用启动器 activity 启动应用

NFC intent launch app with launcher activity only if the app isn't running in background

我正在尝试从系统检测到 NFC 标签时出现的 NFC 应用程序选择器对话框打开我的应用程序。我的应用出现在选择器对话框中。

案例一:

当应用程序 运行 在后台时。 在 NFC 标签检测中,将背景 activity(任务中的顶部 activity)置于前景。

问题

我需要在清单文件中指定哪个 activity 处理来自系统的 nfc 意图。因此,当用户从应用程序选择器中选择我的应用程序时,系统会启动指定 activity。而不是将背景 activity 放在前面。

案例二:

当应用程序不是 运行 带有启动器的午餐应用程序时 activity。

问题

为此,我需要在清单文件中将启动器屏幕指定为 NFC 意图处理程序。通过这样做,我的应用程序将在情况 1 中失败!

AndoridManifest.xml 片段

         <activity android:name=".activityName" ...>
                <intent-filter>
                    <action android:name="android.nfc.action.TECH_DISCOVERED"/>
                    <category android:name="android.intent.category.DEFAULT" />
                </intent-filter>
                <meta-data
                    android:name="android.nfc.action.TECH_DISCOVERED"
                    android:category="android.intent.category.DEFAULT"
                    android:resource="@xml/nfc_tech_filter" />
         </activity>

满足这两种情况的解决方案是什么? 我尝试使用 ActivityManager 但没有得到解决方案。

我通过将以下代码添加到启动器 activity 的 onCreate() 中解决了我的问题。我为启动器 activity 保留了相同的意图过滤器和元数据。这里的技巧是检查应用程序任务是否已经 运行 进入系统。

if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) {
            finish();
            return;
}

以上代码将检查应用程序任务是否已经 运行。如果它 运行 则启动器 activity 将自行关闭并将最重要的 activity 任务带到最前面。

参考:

https://developer.android.com/reference/android/R.styleable.html#AndroidManifestActivity_launchMode