最近在做项目时,遇到一个问题,有部手机就是Toast弹不出来。仔细想想可能权限的问题。后面网上搜索给出如下答案:
跟踪Toast的源代码,make
方法省略,做了一些初始化的工作,
show
方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public void show() { if (mNextView == null) { throw new RuntimeException("setView must have been called"); } INotificationManager service = getService(); String pkg = mContext.getPackageName(); TN tn = mTN; tn.mNextView = mNextView; try { service.enqueueToast(pkg, tn, mDuration); } catch (RemoteException e) { // Empty } } static private INotificationManager getService() { if (sService != null) { return sService; } sService = INotificationManager.Stub.asInterface(ServiceManager.getService("notification")); return sService; } |
熟悉binder
通讯的同学应该都知道,其实调用了NotificationManagerService.service.enqueueToast
方法进入toast队列,进行相应的逻辑处理后回调给Toast中的TN
,TN
其实就是一个aidl
的stub
实现,相当于Client
端,用来接收Service
端发来的消息。看下TN
中的show方法
1 2 3 4 5 6 7 8 9 |
public |