最近在看NFC功能,重点就是我在页面上设置了一个按钮,要点击此按钮才会开启NFC读卡功能(并非跳转下个Activity),为了方便使用,为此可以专门设置一个基类Activity作为NFC功能的管理,此处我命名为TestNfcBaseActivity
public abstract class TestNfcBaseActivity extends BaseActivity {
// private NfcManager mNfc;
private boolean mIsWidthLifeCycle = true;
public static final int REQ_NFC_OPEN = 0X9000;
private boolean isOpenNfcByManual = false;
private Activity activity;
private NfcAdapter nfcAdapter;
private PendingIntent pendingIntent;
private static String[][] TECHLISTS; //设置你要处理的tag technologies到String数组中
private static IntentFilter[] TAGFILTERS;
private int status;
/** 设备不支持NFC */
public static final int NFC_NOT_SUPPORT = -1;
/** NFC已关闭 */
public static final int NFC_DISABLED = 0;
/** NFC开启了 */
public static final int NFC_ABLED = 1;
/** nfc tag */
private Tag mTag;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initDatas();
}
/**
* 是否需要开启NFC相关对象,由于nfc 圈存和ble 圈存公用一套UI,ble圈存是不需要初始化NFC,所以需要让子类决定。
* @return true 需要初始化nfc
*/
public abstract boolean isOpenNfc();
private void initDatas() {
setTECHLISTSandTAGFILTERS();
activity = getActivity();
pendingIntent = PendingIntent.getActivity(activity, 0,
new Intent(activity, activity.getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
// pendingIntent = PendingIntent.getActivity(activity, 0,
// new Intent(activity, getClass()), 0);
if(isOpenNfc()){
initNfcManagerByManual(false);
}
if(isOpenNfcByManual){
initNfcManagerByManual(true);
}
}
public BaseNfcNewActivity getActivity(){
return this;
}
public void initNfcManagerByManual(boolean isOpenNfcByManual){
this.isOpenNfcByManual = isOpenNfcByManual;
if(nfcAdapter != null){
ReaderManager.destory();
nfcAdapter = null;
}
nfcAdapter = NfcAdapter.getDefaultAdapter(activity);
status = getNfcStatus();
LogUtils.LogError("lenita","nfc status = "+status);
if(isOpenNfcByManual){
onResume(); //在生成Adapte后执行,否则无法进入
}
}
public Tag getNfcTag() {
return mTag;
}
public void setNfcTag(Tag mTag) {
this.mTag = mTag;
}
private void setTECHLISTSandTAGFILTERS(){
try {
TECHLISTS = new String[][] { { IsoDep.class.getName() } };
TAGFILTERS = new IntentFilter[] { new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED, "*/*") };
} catch (Exception e) {
}
}
public boolean updateNfcStatus() {
int sta = getNfcStatus();
if (sta != status) {
status = sta;
return tr