如何确保Android Beam无法启动我的'singleTop'活动的新实例?

时间:2012-02-19 16:17:05

标签: android android-intent android-activity nfc android-beam

首先,用例:2部​​手机在同一个屏幕上打开了我的应用程序。我希望一个用户能够与另一个用户共享屏幕内容(数据),而无需在使用NFC进行发送时打开活动的新实例。 (两款Android设备都运行Ice Cream Sandwich)

所以我在清单中声明了这样的 singleTop 活动。

<activity android:name=".activity.MyActivity" android:configChanges="orientation|keyboardHidden" android:launchMode="singleTop">
  <intent-filter android:label="@string/activityLabel">
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:mimeType="a.b.c/x.y.z" />
  </intent-filter>
  <intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
    <category android:name="android.intent.category.DEFAULT"/>
    <data android:mimeType="application/x.y.z"/>
  </intent-filter>
</activity>

当触发VIEW操作并且活动已经在最前面时,如果活动,则在相同实例中调用onNewIntent()方法。

当触发NDEF_DISCOVERED操作并且活动已经在最前面时,会在活动的实例中调用onCreate()方法。

4 个答案:

答案 0 :(得分:4)

您描述了应用程序已打开且正确的Activity位于前台的情况。在这种情况下,您可以通过调用活动onResume()(和onPause()中的NfcAdapter.enableForegroundDispatch())中的disableForegroudDispatch()来使用NFC意图的前台调度。这将强制所有NFC意图传递到您的活动(通过onNewIntent())。

答案 1 :(得分:0)

我没有给你答案。但我有一个解决方法:让NDEF_DISCOVERED启动一个新的活动。使该活动不可见(Theme.NoBackground)并在onCreate中,使其使用singleTop启动MyActivity并立即完成。 MyActivity现在应显示为onNewIntent

答案 2 :(得分:0)

您是否看过Android Beam示例:

http://developer.android.com/resources/samples/AndroidBeamDemo/index.html

它实现了您想要的这种行为(减去VIEW意图过滤)。我不确定该意图是否会影响NDEF_DISCOVERED,但是修改Android Beam示例以查看是否可以导致与您的应用相同的行为会很有趣。

答案 3 :(得分:0)

你应该使用:android:launchMode =“singleInstance” 适合我。