【问题标题】:Activity/Application Launched From NFC Never Appears in Recent Apps List从 NFC 启动的活动/应用程序永远不会出现在最近的应用程序列表中
【发布时间】:2013-03-03 09:21:00
【问题描述】:

我正在开发一个针对 ICS+ 手机的应用程序。

在应用程序中,我有一个启动画面,以及可以从启动画面或通过 NFC 触摸启动的其他几个屏幕。我的一项活动包含以下意图过滤器:

        <intent-filter>
            <action android:name="android.nfc.action.NDEF_DISCOVERED" />

            <category android:name="android.intent.category.DEFAULT" />

            <data android:mimeType="application/com.myapp.thing.android.beam.ip" />
        </intent-filter>

由于某种原因,我无法弄清楚,每当启动包含上述意图过滤器的 Activity 时,当用户按下“主页”按钮时,该 Activity 都不会出现在“最近的应用程序”列表中。通过调试器,我已经验证它没有被破坏,只是停止了。

如果 Splash 屏幕在 ThingActivity 之前打开,Splash 将显示在“最近的应用程序”列表中,即使按下 Home 按钮时它不是最重要的 Activity。单击最近应用列表中的 Splash 将显示 Splash,而不是之前位于顶部的活动。尽管仍在 bg 中运行线程和接收器,但启动屏幕顶部的任何活动似乎都“丢失”了。

更奇怪的行为是,这种行为也适用于从包含 NFC 意图过滤器的 Activity 启动的任何 Activity,或者从这些 Activity 启动的任何 Activity 等。

如果我删除意图过滤器,此行为就会消失,并且任何位于顶部的活动都将始终显示在“最近的应用程序”列表中,但会损坏,因为 NFC 是一项核心功能。

我的完整清单如下:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.myapp.thing"
    android:versionCode="1"
    android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="14"
    android:targetSdkVersion="16" />
<!-- Permission required to use the TCP transport -->
<uses-permission android:name="android.permission.INTERNET" >
</uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >
</uses-permission>
<!-- Permission required to use the Bluetooth transport -->
<uses-permission android:name="android.permission.BLUETOOTH" >
</uses-permission>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" >
</uses-permission>
<uses-permission android:name="android.permission.BROADCAST_STICKY" >
</uses-permission>
<uses-permission android:name="android.permission.NFC" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
</uses-permission>
<uses-permission android:name="android.permission.WAKE_LOCK" />

<!-- RECORD_AUDIO is needed to create an audio recorder -->
<uses-permission android:name="android.permission.RECORD_AUDIO" >
</uses-permission>

<!-- MODIFY_AUDIO_SETTINGS is needed to use audio effects such as environmental reverb -->
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" >
</uses-permission>

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".ui.SplashActivity"
        android:configChanges="keyboardHidden|orientation"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name="com.myapp.thing.ui.ReceiverActivity"
        android:configChanges="keyboardHidden|orientation"
        android:label="@string/app_name"
        android:screenOrientation="portrait" >
    </activity>
    <activity
        android:name="com.myapp.thing.ui.BaseActivity"
        android:configChanges="keyboardHidden|orientation"
        android:label="@string/app_name"
        android:screenOrientation="portrait" >
    </activity>
    <activity
        android:name="com.myapp.thing.ui.BroadcasterActivity"
        android:configChanges="keyboardHidden|orientation"
        android:label="@string/app_name"
        android:screenOrientation="portrait" >
    </activity>
    <activity
        android:name="com.myapp.thing.ui.ChooseFileActivity"
        android:configChanges="keyboardHidden|orientation"
        android:label="@string/app_name"
        android:screenOrientation="portrait" >
    </activity>
    <activity
        android:name="com.myapp.thing.ui.ThingActivity"
        android:configChanges="keyboardHidden|orientation"
        android:label="@string/app_name"
        android:screenOrientation="portrait" >
        <intent-filter>
            <action android:name="android.nfc.action.NDEF_DISCOVERED" />

            <category android:name="android.intent.category.DEFAULT" />

            <data android:mimeType="application/com.myapp.thing.android.beam.ip" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.SEND_MULTIPLE" />
            <action android:name="android.intent.action.SEND" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="audio/*" />
        </intent-filter>
    </activity>

    <service
        android:name="com.myapp.thing.service.ThingService"
        android:label="ThingService" >
    </service>
</application>

为什么包含此意图过滤器会阻止我的应用程序出现在最近的应用程序列表中?

【问题讨论】:

  • 你是从那个 Activity 呼叫 finish() 吗?
  • 不,除非用户明确点击按钮,否则它不会完成。我已经调试过了,onDestroy没有命中。
  • 在您正在测试的设备上,您是否偶然启用了开发者选项“不保留活动”?
  • 关于按HOME后返回应用程序并返回启动屏幕而不是堆栈顶部的活动,这可能是令人讨厌的Android启动器错误。确保首次从可用应用程序列表中启动应用程序,不是从安装程序或 Eclipse 或 IntelliJ 等 IDE 中,请参阅 code.google.com/p/android/issues/detail?id=2373code.google.com/p/android/issues/detail?id=26658
  • @DavidWasser 我没有启用“不保留活动”选项。

标签: android android-activity nfc intentfilter android-recents


【解决方案1】:

我不能理解所有描述的行为,我必须承认。 Android 如何处理活动和任务可能非常棘手。一条可能至关重要的信息是,当您的 Activity 通过 NFC Intent 启动时,它将作为单独的任务启动。我怀疑这与您观察到的行为有关。

【讨论】:

  • 确实和这个有关。如果我使用 launchMode singleTask 进行活动,事情会更好一些,并且活动在最近的应用程序列表中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
相关资源
最近更新 更多