从NFC启动的活动/应用程序从未出现在最近使用的应用列表中

4

我正在开发一款针对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>

出于一些我无法理解的原因,任何时候启动包含上述意图过滤器的活动时,当用户按下“主屏幕”按钮时,该活动不会出现在“最近使用的应用程序”列表中。通过调试器,我已经验证它没有被销毁,只是停止了。如果闪屏在ThingActivity之前打开,即使在按下主屏幕按钮时它不是顶部活动,闪屏也将显示在“最近使用的应用程序”列表中。单击“最近使用的应用程序”列表中的Splash将显示Splash,而不是先前位于顶部的活动。似乎在闪屏屏幕上方的任何活动都会“丢失”,尽管仍在后台运行线程和接收器。更奇怪的行为是,这种行为也适用于从包含NFC意图过滤器的活动启动的任何活动,或从那些活动启动的任何活动等。如果我删除意图过滤器,则此行为消失,并且始终显示顶部的任何活动,但会变得不稳定,因为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()方法吗? - twaddington
不,除非用户明确地点击按钮,否则它还没有完成。我已经调试过了,onDestroy 没有被触发。 - user1120134
你测试的设备上,你是否偶然启用了开发者选项中的“不保留活动”? - David Wasser
关于按下HOME键后返回应用程序时返回到启动屏幕而不是堆栈顶部的活动,这可能是令人讨厌的Android启动器错误。请确保您首次从可用应用程序列表中启动应用程序,而不是从安装程序或像Eclipse或IntelliJ这样的IDE中启动,参见http://code.google.com/p/android/issues/detail?id=2373和http://code.google.com/p/android/issues/detail?id=26658。 - David Wasser
@DavidWasser 我没有启用“不保留活动”选项。 - user1120134
@DavidWasser 我不是从Eclipse启动,我是从程序列表启动的。无论我是从Eclipse还是直接从APK安装并从程序列表启动,它的行为都是相同的。每当ThingActivity通过NFC启动时,在点击“home”后它就不会显示在应用程序列表中。如果它是通过Splash activity编程方式启动,则在点击“home”后会出现在最近使用的应用程序列表中。 - user1120134
1个回答

2
我必须承认,我并不完全理解所描述的行为。Android如何处理活动和任务可能会非常棘手。也许关键的一点是,当您的Activity通过NFC意图启动时,它将作为一个单独的任务启动。我怀疑这与您观察到的行为有关。

这确实与此有关。如果我使用 launchMode singleTask 来创建我的活动,则事情会变得更好,该活动将出现在最近的应用程序列表中。 - user1120134

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接