如何确保Android Beam不会启动我的“singleTop” Activity的新实例?

4
首先,使用情况:两部手机在同一屏幕上打开我的应用程序。 我希望一个用户能够将屏幕内容(数据)与另一个用户共享,而无需在使用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个回答

4
您描述了应用程序已经打开并且适当的Activity在前台的情况。在这种情况下,您可以通过在Activity的onResume()中调用NfcAdapter.enableForegroundDispatch()(并在onPause()中调用disableForegroudDispatch())利用NFC意图的前台调度。这将强制所有NFC意图通过onNewIntent()传递到您的Activity。

这看起来是可行的方法,但我现在没有第二个支持 NFC 的设备来测试它。文档:http://developer.android.com/guide/topics/nfc/advanced-nfc.html#foreground-dispatch - mmathieum
3
使用带有NDEF消息的NFC标签会得到与通过Android Beam接收数据几乎相同的结果。或许你可以尝试一下。 - NFC guy

0
你应该使用:android:launchMode="singleInstance"。 这对我有用。

launchMode "singleInstance" 只适用于主屏幕替换。在我的情况下,“singleTask” 运行得非常完美。 - Androbin

0

我查看了安卓传输示例(实际上是从这里开始),发现它没有实现我想要达到的前台调度。 - mmathieum

0

我没有一个直接的答案给你。但是我有个解决方法: 让 NDEF_DISCOVERED 启动一个新的活动。将该活动设置为不可见 (Theme.NoBackground),并在 onCreate 方法中让它以 singleTop 模式启动 MyActivity 并立即关闭自己。这样,MyActivity 就会出现并执行 onNewIntent 方法。


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