0

私の問題は戻るボタンとバックスタックに関連しています。nfc タグを読み取るためのアプリを入手したので、アクティビティ A を起動してから、マニフェストで SingleTop と宣言されているアクティビティ B に進みます。電話をタグに近づけると、タグが読み取られます。現時点ではすべて正常に機能しています。

戻るボタンを押すと、アクティビティ A ではなくアクティビティ B に戻り、もう一度戻るボタンを押すとアクティビティ A に戻ります。

このような:

A->B->タグを読む->B->戻るボタンを押す->B->戻るボタンを押す->A->戻るボタンを押す->アプリを閉じる。

そして私はこのようにしたい:

A->B->タグを読む->B->戻るボタンを押す->A->戻るボタンを押す->アプリを閉じる。

B のインスタンスが 1 つだけ必要です。 single task を試しましたが、アプリ アイコンをクリックすると問題が発生し、アクティビティ b が起動されますが、タグの読み取りの意図は保持されます。

public class B extends Activity {
private static final String KINVEY_KEY = YOUR_APP_KEY;
private static final String KINVEY_SECRET_KEY = 'YOUR_APP_SECRET_KEY';

private KCSClient kinveyClient;
private NfcAdapter mNfcAdapter;

private Button mEnableWriteButton;
private EditText mTextField;
private ProgressBar mProgressBar;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_tags);

    mTextField = (EditText) findViewById(R.id.text_field);

    mProgressBar = (ProgressBar) findViewById(R.id.progress_bar);
    mProgressBar.setVisibility(View.GONE);

    mEnableWriteButton = (Button) findViewById(R.id.enable_write_button);
    mEnableWriteButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            setTagWriteReady(!isWriteReady);
            mProgressBar.setVisibility(isWriteReady ? View.VISIBLE : View.GONE);
        }
    });

    mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
    if (mNfcAdapter == null) {
        Toast.makeText(this, 'Sorry, NFC is not available on this device', Toast.LENGTH_SHORT).show();
        finish();
    }

    // Initialize Kinvey
    KinveySettings settings = new KinveySettings(KINVEY_KEY, KINVEY_SECRET_KEY);
    kinveyClient = KCSClient.getInstance(this.getApplicationContext(), settings);
}

private boolean isWriteReady = false;

public void setTagWriteReady(boolean isWriteReady) {
    this.isWriteReady = isWriteReady;
    if (isWriteReady) {
        IntentFilter[] writeTagFilters = new IntentFilter[] { new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED) };
        mNfcAdapter.enableForegroundDispatch(TagsActivity.this, NfcUtils.getPendingIntent(TagsActivity.this),
                writeTagFilters, null);
    } else {
        // Disable dispatch if not writing tags
        mNfcAdapter.disableForegroundDispatch(TagsActivity.this);
    }
    mProgressBar.setVisibility(isWriteReady ? View.VISIBLE : View.GONE);
}

@Override
public void onNewIntent(Intent intent) {
    // onResume gets called after this to handle the intent
    setIntent(intent);
}

@Override
public void onResume() {
    super.onResume();
    if (isWriteReady && NfcAdapter.ACTION_TAG_DISCOVERED.equals(getIntent().getAction())) {
        processWriteIntent(getIntent());
    } else if (!isWriteReady
            && (NfcAdapter.ACTION_TAG_DISCOVERED.equals(getIntent().getAction()) || NfcAdapter.ACTION_NDEF_DISCOVERED
                    .equals(getIntent().getAction()))) {
        processReadIntent(getIntent());
    }
}

private static final String MIME_TYPE = 'application/com.tapped.nfc.tag';


public void processWriteIntent(Intent intent) {
    if (isWriteReady && NfcAdapter.ACTION_TAG_DISCOVERED.equals(getIntent().getAction())) {

        Tag detectedTag = getIntent().getParcelableExtra(NfcAdapter.EXTRA_TAG);

        String tagWriteMessage = mTextField.getText().toString();
        byte[] payload = new String(tagWriteMessage).getBytes();

        if (detectedTag != null && NfcUtils.writeTag(
                NfcUtils.createMessage(MIME_TYPE, payload), detectedTag)) {

            Toast.makeText(this, "Wrote '" + tagWriteMessage + "' to a tag!", 
                    Toast.LENGTH_LONG).show();
            setTagWriteReady(false);
        } else {
            Toast.makeText(this, "Write failed. Please try again.", Toast.LENGTH_LONG).show();
        }
    }
}

public void processReadIntent(Intent intent) {
    List<NdefMessage> intentMessages = NfcUtils.getMessagesFromIntent(intent);
    List<String> payloadStrings = new ArrayList<String>(intentMessages.size());

    for (NdefMessage message : intentMessages) {
        for (NdefRecord record : message.getRecords()) {
            byte[] payload = record.getPayload();
            String payloadString = new String(payload);

            if (!TextUtils.isEmpty(payloadString))
                payloadStrings.add(payloadString);
        }
    }

    if (!payloadStrings.isEmpty()) {
        String content =  TextUtils.join(",", payloadStrings);
        Toast.makeText(TagsActivity.this, "Read from tag: " + content,
                Toast.LENGTH_LONG).show();
        saveTag(content);
    }
}

private void saveTag(String tagMessage){
    TagReadEntity tag = new TagReadEntity(UUID.randomUUID().toString(), 
            tagMessage, System.currentTimeMillis());

    kinveyClient.mappeddata("tags").save(tag, new ScalarCallback<TagReadEntity>() {

        @Override
        public void onSuccess(TagReadEntity tag) {
            Log.i("NFC Demo", "Saved tag!");
        }

        @Override
        public void onFailure(Throwable e) {
            Log.e("NFC Demo", "Error saving tag", e);
        }
    });
}
}

そしてマニフェスト:

<activity
        android:name=".TagsActivity"
        android:label="@string/title_activity_tags"
        android:launchMode="singleTop"
        android:screenOrientation="portrait" >
        <intent-filter>
            <action android:name="android.nfc.action.NDEF_DISCOVERED" />

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

            <data android:mimeType="application/com.tapped.nfc.tag" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.nfc.action.TAG_DISCOVERED" />

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

            <data android:mimeType="application/com.tapped.nfc.tag" />
        </intent-filter>
    </activity>  
4

1 に答える 1

0

iveはタスクをシングルタスクとして宣言しましたが、現在は機能しているようです。

android:launchMode="singleTask"

iveは標準を試しましたが、iveがnfcタグを読み取るたびに、新しいアクティビティが作成されました。10個のタグを読み取る場合は、戻るボタンを9回押す必要があります。iveがsingleTopを試した後、AからBに移動しましたが、タグを何度読んだとしても、Bのインスタンスは2つしかなかったので、アクティビティBに移動するには、もう一度押す必要があります。アプリを閉じます。

于 2013-01-22T02:04:32.600 に答える