package com.example.unimpdemo;
import android.app.PendingIntent;
import android.content.Intent;
import android.nfc.NfcAdapter;
import android.net.Uri;
import android.nfc.NfcAdapter;
import android.os.Parcelable;
import android.util.Log;
import android.nfc.Tag;
import androidx.appcompat.app.AppCompatActivity;
/**
- 1.子类需要在onCreate方法中做Activity初始化。
- 2.子类需要在onNewIntent方法中进行NFC标签相关操作。
- 当launchMode设置为singleTop时,第一次运行调用onCreate方法,
- 第二次运行将不会创建新的Activity实例,将调用onNewIntent方法
- 所以我们获取intent传递过来的Tag数据操作放在onNewIntent方法中执行
- 如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())
- 只要NFC标签靠近就执行
-
Created by gc on 2016/12/8.
*/
public class BaseActivity extends AppCompatActivity {private static final String TAG = "BaseActivity";
private NfcAdapter mNfcAdapter;
private PendingIntent mPendingIntent;@Override
public void onNewIntent(Intent intent) {
//1.获取Tag对象
super.onNewIntent(intent);
Uri data = intent.getData();
// 读取NDEF数据
Parcelable[] rawMessages = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
Log.d(TAG, "onNewIntent data=1=" + data);}
/**
- 启动Activity,界面可见时
*/
@Override
protected void onStart() {
super.onStart();
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
//一旦截获NFC消息,就会通过PendingIntent调用窗口
// mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()), PendingIntent.FLAG_IMMUTABLE);
// FLAG_UPDATE_CURRENT:如果存在匹配的 PendingIntent,更新其内部 Intent 的 Extra 数据(最常用)。
// FLAG_MUTABLE:允许修改 PendingIntent 内部的 Intent 数据(仅特殊场景使用)。
mPendingIntent = PendingIntent.getActivity(this, 0,
new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
}
/**
- 获得焦点,按钮可以点击
*/
@Override
public void onResume() {
super.onResume();
//设置处理优于所有其他NFC的处理
if (mNfcAdapter != null)
mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, null, null);
}
/**
- 暂停Activity,界面获取焦点,按钮可以点击
*/
@Override
public void onPause() {
super.onPause();
//恢复默认状态
if (mNfcAdapter != null)
mNfcAdapter.disableForegroundDispatch(this);
}
}
- 启动Activity,界面可见时