3

私の Android アプリには 2 つのアクティビティがあります。主なものは情報用で、もう 1 つは NFC を受信するためのものです。

初めてアプリを起動すると、NFC タグを複数回読み取ることができます。そのたびに、新しいアクティビティが表示され、情報が表示されます。

アプリを閉じても電話が NFC タグに接続されている場合、最初は nfc タグのアクティビティが表示されますが、他のタグには二度と応答しません。

私は何を間違っていますか?!

2 番目のアクティビティのマニフェスト パーツとコード:

<uses-sdk android:minSdkVersion="10" />
<uses-permission android:name="android.permission.NFC" />
<uses-feature android:name="android.hardware.nfc" android:required="true" />

<application
android:icon="@drawable/aaa"
android:label="@string/app_name" 
    android:theme="@android:style/Theme.NoTitleBar">

<activity
    android:label="@string/app_name"
    android:name=".MainActivity">
    <intent-filter >
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<activity 
    android:name=".TagDiscoveredActivity"
    android:screenOrientation="portrait">
    <intent-filter >
        <action android:name="android.nfc.action.TECH_DISCOVERED" />
        <action android:name="android.nfc.action.TAG_DISCOVERED" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
    <meta-data
        android:name="android.nfc.action.TECH_DISCOVERED"
        android:resource="@xml/filter_nfc" />
</activity>
</application>

</manifest>    

コード

public class TagDiscoveredActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.info);
        etc
    }

@Override
public void onNewIntent(Intent intent) {
    setIntent(intent);
    resolveIntent(intent);
}

private void resolveIntent(Intent intent) {
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            //| Intent.FLAG_ACTIVITY_SINGLE_TOP);        

    boolean handled = false;

    // Parse the intent
    final String action = intent.getAction();
    if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action) ||
                NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)) {

        // When a tag is discovered we send it to the service to be save. We
        // include a PendingIntent for the service to call back onto. This
        // will cause this activity to be restarted with onNewIntent(). At
        // that time we read it from the database and view it.
        Parcelable nfctag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        if (nfctag != null) {
                        //read tag and display here
                    }
                }
            }

    if (!handled) {
        Log.e(logTag, "Unknown intent " + intent);
        finish();
        return;
    }
}

それを実行して 2 番目のシナリオ (アプリを実行せずに NFC から直接起動) をログに記録すると、最初は機能していることを示すログが表示されますが、2 回目は、どの機能も何もログに記録していません。

役立つ提案をありがとうございます。

4

2 に答える 2

10

すべてを試した後、最終的に答えを見つけました。

答えは、アクティビティを android:launchmode="singleTask" に設定し、onNewIntent のコードに次の行を追加することです。

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
于 2012-05-28T11:48:54.420 に答える
1

おそらく探しているのは、この例のようなフォアグラウンド ディスパッチです。私は Androidボイラープレート(恥知らずなプラグ) も書いています。

于 2012-05-22T10:22:56.460 に答える