上次我们讲到了NfcActivityManager对象,其实还有重要的一点没有说,就是NfcActivityManager其实继承了INdefPushCallback.Stub,也就是说对于NfcService来说,它是一个Stub,它们之间可以通过进程间通信。这里有个细节,虽然说与NFC P2P推送相关的有两个回调接口:NfcAdapter.CreateNdefMessageCallback和NfcAdapter.OnNdefPushCompleteCallback,但是回顾上节,和NfcService通信时,并不是将这两个回调接口传递过去(它们也不是Stub),而是将NfcActivityManager自己传递给NfcService,见代码:
/**
* Register NfcActivityState with the NFC service.
*/
synchronized void updateNfcService(NfcActivityState state) {
boolean serviceCallbackNeeded = state.ndefMessageCallback != null ||
state.onNdefPushCompleteCallback != null;
try {
NfcAdapter.sService.setForegroundNdefPush(state.resumed ? state.ndefMessage : null,
state.resumed && serviceCallbackNeeded ? this : null);
} catch (RemoteException e) {
mAdapter.attemptDeadServiceRecovery(e);
}
}
好了,进入Nfc服务层,我们来看一下P2pLinkManager这个类。
1、该类是NfcService类的成员变量,在NfcService.onCreate()时,被创建。
@Override
public void onCreate() {
super.onCreate();
mNfcTagService = new TagService();
mNfcAdapter = new NfcAdapterService();
mExtrasService = new NfcAdapterExtrasService();
Log.i(TAG, "Starting NFC service");
sService = this;
mContext = this;
mDeviceHost = new NativeNfcManager(this, this);
mP2pLinkManager = new P2pLinkManager(mContext);
2、P2pLinkManager提供打开NFC P2P数据推送及接收的方法,第一个参数是是否数据推送,第二个参数是是否接受数据。
mP2pLinkManager.enableDisable(true, true);
3、P2pLinkManager提供了推送Ndef消息的接口,我们跟随上节的流程,从这个入口切入进行学习:
/**
* Set NDEF message or callback for sending.
* May be called from any thread.
* NDEF messages or callbacks may be set at any time (even if NFC is
* currently off or P2P send is currently off). They will become
* active as soon as P2P send is enabled.
*/
public void setNdefToSend(NdefMessage staticNdef, INdefPushCallback callbackNdef) {
synchronized (this) {
mStaticNdef = staticNdef;
mCallbackNdef = callbackNdef;
}
}
上述函数非常简单,将要推送的NdefMessage以及回调的接口保存到P2pLinkManager的成员变量中。
接下去的流程是这样的,
如果设置中打开了NFC P2P,那么底层PN544芯片将对P2P设备进场进行查询。当一个P2P设备发现另一个P2P设备进场(进入NFC感应区域中)时,由底层通知NativeNfcManager,“侦测到P2P设备”这个消息:
/**
* Notifies P2P Device detected, to activate LLCP link
*/
private void notif