1、NotificationManager notifyAsUser
……
service.enqueueNotificationWithTag(pkg, mContext.getOpPackageName(), tag, id,
copy, idOut, user.getIdentifier());
……
我们在这需要跟踪下service:
INotificationManager service = getService();
……
/** @hide */
static public INotificationManager getService()
{
if (sService != null) {
return sService;
}
IBinder b = ServiceManager.getService("notification");
sService = INotificationManager.Stub.asInterface(b);//这里很明显是通过aidl进行交互的,我们去看看谁继承了INotificationManager.Stub?
return sService;
}
……
2、我们发现在NotificationManagerService onStart中:
publishBinderService(Context.NOTIFICATION_SERVICE, mService);//注意 public static final String NOTIFICATION_SERVICE = "notification";
protected final void publishBinderService(String name, IBinder service) {
publishBinderService(name, service, false);
}
protected final void publishBinderService(String name, IBinder service,
boolean allowIsolated) {
ServiceManager.addService(name, service, allowIsolated);//将Service添加到了ServiceManager中
}
到这里大家应该明白了吧?
我们只需要去跟踪看下mService就OK了
private final IBinder mService = new INotificationManager.Stub() {
……
@Override
public void enqueueNotificationWithTag(String pkg, String opPkg, String tag, int id,
Notification notification, int[] idOut, int userId) throws RemoteException {
enqueueNotificationInternal(pkg, opPkg, Binder.getCallingUid(),
Binder.getCallingPid(), tag, id, notification, idOut, userId);
}
……
@Override
public void registerListener(final INotificationListener listener,
final ComponentName component, final int userid) {
enforceSystemOrSystemUI("INotificationManager.registerListener");
mListeners.registerService(listener, component, userid);
} //111
……
}
——》enqueueNotificationInternal
void enqueueNotificationInternal(final String pkg, final String opPkg, final int callingUid,
final int