如何在应用程序上禁用TECH_DISCOVERED?

时间:2019-06-12 05:04:56

标签: android android-manifest deeplink

像这样从DeepLink检测到某个网址后,我使用NFC启动了我的应用程序。

        <activity
            android:name=".view.main.MainActivity"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.nfc.action.NDEF_DISCOVERED" />
                <action android:name="android.nfc.action.TECH_DISCOVERED" />
                <action android:name="android.intent.action.MAIN" />

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

                <data
                    android:host="example.com"
                    android:scheme="http" />
            </intent-filter>

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

但是,即使我已经启动了我的应用程序,它仍然可以工作。因此,重复的活动不断出现。有时,它会导致我的应用出现故障或崩溃。我只想在不使用应用程序时使用Deeplink

有什么办法可以解决这个问题?

2 个答案:

答案 0 :(得分:1)

您可以使用launchMode="singleTop"。这样,如果活动已经启动并且在堆栈的顶部,则任何新的启动都将通过该实例进行路由,您可以在onNewIntent()方法中将其作为回调。

<activity android:name=".view.main.MainActivity" 
          android:launchMode="singleTop" />

答案 1 :(得分:1)

Dinesh的解决方案似乎应该可以工作,但是,如果给您带来了问题,您可以尝试另一种方法(更复杂)。您可以使用NfcAdapter.enableForegroundDispatch()方法来控制活动内部的android.nfc.action.TECH_DISCOVERED操作,并确保它什么也不做。

您可以通过将以下两种方法添加到MainActivity中(或将代码添加到现有方法中)来实现:

@Override
protected void onResume() {
    super.onResume();

    //create a broadcast intent that doesn't trigger anything
    Intent localIntent = new Intent("fake.action");
    localIntent.setPackage(getApplicationContext().getPackageName());
    localIntent.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);

    //set the NFC adapter to trigger our broadcast intent
    NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
    nfcAdapter.enableForegroundDispatch(
            this,
            PendingIntent.getBroadcast(this, 0, localIntent, PendingIntent.FLAG_UPDATE_CURRENT),
            new IntentFilter[] {new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED)},
            new String[][] { { "android.nfc.tech.IsoDep" /* add other tag types as necessary */ } });

}

@Override
protected void onPause() {
    super.onPause();
    NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
    nfcAdapter.disableForegroundDispatch(this);
}

现在,只要您的活动可见并且检测到NFC标签,就不会触发任何操作。 (或者,更具体地说,它将触发未注册任何方法的广播。)

希望这会有所帮助。