如何在同一个类上组合GetIntent.GetAction()和enableForegroundDispatch?

时间:2014-05-18 10:42:15

标签: android tags nfc

在我的Android应用程序中,一旦android清单检测到nfc标记,它就会打开loginactivity类。

loginactivity使用(NfcAdapter.ACTION_TECH_DISCOVERED.equals(getIntent().getAction())) {}在代码上运行各种功能。

我还想使用intentfilterenableForegroundDispatch

在页面上实现nfc标记检测

如何在同一类中结合两种类型的nfc检测?

我认为可行的方法:

  if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(getIntent().getAction())) {
    onNewIntent(GetIntent());   
     }
else{
    pendingIntent = PendingIntent.getActivity(this,0,new Intent(this,getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),0);
    IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED);
    intentFiltersArray= new IntentFilter[] {ndef, };
    techListsArray = new String[][] {new String[] {IsoDep.class.getName()}};

}

当然onPause和onResume已启用前台dispacth。

这是正确的方法吗?谢谢!

1 个答案:

答案 0 :(得分:0)

您可以轻松组合这两种方法(在应用程序清单中使用NFC发现意图,在检测到NFC标签时启动您的活动,并使用前台调度接收事件,同时您的活动在前台可见)。

对于清单部分,你会做这样的事情(或适应你想要触发的任何事件):

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

您的nfc_tech_filter.xml可能看起来像这样(或适用于您要触发的任何标记技术):

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <tech-list>
        <tech>android.nfc.tech.IsoDep</tech>
    </tech-list>
</resources>

然后,在您的活动的onCreate()onStart()onResume()方法中,您将获取意图并将其提供给您的意图处理方法。这可能看起来像这样:

handleIntent(getIntent());

为了使用前台调度,您可以在活动的onResume()方法中注册前台调度系统(不要忘记在onPause()取消注册!) :

PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
nfcAdapter.enableForegroundDispatch(this, pendingIntent, null, null);

或者你也可以只使用IsoDep技术注册TECH_DISCOVERED意图(就像在清单中一样):

nfcAdapter.enableForegroundDispatch(this, pendingIntent,
    new IntentFilter[] { new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED) },
    new String[][] { new String[] { IsoDep.class.getName() } }
);

然后,您将在活动的onNewIntent()方法中收到NFC意图。因此,您将指示您的意图处理程序也处理这些意图:

public void onNewIntent(Intent intent) {
    handleIntent(intent);
}

最后,您可以使用这样的意图处理程序来处理意图:

private void handleIntent(Intent intent) {
    String action = intent.getAction();
    if ((intent.getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0) {
        if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action) ||
            NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)) {

            // do something ...

        }
    }
}