写点什么

Android- 冷门知识点汇总:你知道哪些 Android 中的冷门知识?

用户头像
Android架构
关注
发布于: 2 小时前

});AlertDialog dialog = builder.create();if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_TOAST);} else {dialo


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


g.getWindow().setType(WindowManager.LayoutParams.TYPE_PHONE);}dialog.show();}


private static Handler handler;


public static void alertAnyWhere() {if (Looper.myLooper() == Looper.getMainLooper()) {alertDialog();} else {if (handler == null) {handler = new Handler(Looper.getMainLooper());}handler.post(new Runnable() {@Overridepublic void run() {alertDialog();}});}}


}


6.可以通过设置 Activity 主题 android.R.style.Theme_NoDisplay,来启动一个不显示的 Activity,在某些需要过渡的地方很实用。


7.Activity、Service、Receiver 在没有配置 intent-filter 的 action 属性时,exported 默认为 false,配置了 intent-filter 的 action 属性时,exported 默认为 true。稍有不慎,很可能埋下越权、Intent 攻击等安全隐患。


8.当从最近使用应用列表中移除某个 App 时,四大组件只有 Service 拥有神奇的 onTaskRemoved 回调,但是并不一定回调,还与 stopWithTask 属性等有关。


9.四大组件都运行在主线程,是因为它们在 ActityThread 中(或 Instrumentation)实例化;它们的生命周期也运行在主线程,是因为通过 ActivityThread.H 将消息从 Binder 线程发送到主线程,然后执行回调。


10.TaskStackBuilder 的出现基本上解决了所有构造 Activity 回退栈的问题。


11.ContentProvider 的 onCreate()方法先于 Application 的 onCreate()方法执行,晚于 Application 的 attachBaseContext()方法,所以在 ContentProvider 的 onCreate()时候也是有办法弹出一个 AlertDialog 的(参考 5)。


12.BroadCastReceiver 回调 onReceive(Context context,Intent intent)中的 context 类型各种场景相差很大,静态注册的 receiver 回调的 Context 都是 ReceiverRestrictedContext,动态注册的 receiver 有可能是 Activity 或 Application。


13.ServiceRecord 和 BroadcastRecord 自身就是 Binder。


14.同一个 provider 组件名,可能对应多个 provider。

Handler、Message 相关:

1.MessageQueue.addIdleHandler 可以用来在线程空闲的时候,完成某些操作,比较适合那种需要在将来执行操作,却又不知道需要指定多少延迟时间的操作。


2.Message.what 尽量不要设置成 0,因为 postRunnable 的方式会生成 Message.what 为 0 的消息,如果删除了 what 为 0 的 Message,也会将 runnable 方式创建的 Message 删掉。


3.Handler 可以设置同步异步(默认是同步的),他们的区别在于异步不会被 Barrier 阻塞,而同步会被阻塞。


4.Handler 的消息分发流程是如果 Message 的 callback 不为空,通过 callback 处理,如果 Handler 的 mCallback 不为空,通过 mCallback 来处理,如果前两个都为空,才调用 handleMessage 来处理。在 DroidPlugin 中,便是利用 ActivityThread.H 的这一特性,拦截了部分消息,实现 Activity 的插件化。


5.Java 层和 Native 层 Looper、MessageQueue 的创建时序,Java 层 Looper—>Java 层 MessageQueue—>Native 层 NativeMessageQueue—>Native 层 Looper。


6.Java 层通过 Handler 去发送消息,而 Native 层是通过 Looper 发消息。

Window、View 相关:

1.硬件加速在 Window 级只能开不能关,View 级只能关不能开。


2.自 android2.3 删除 MidWindow 后,PhoneWindow 成了 Window 的唯一实现类。


3.WMS 管理 Window 的过程中涉及 4 个 Binder,应用进程只有 ViewRootImpl.W 一个 Binder 服务端。


4.MotionEvent、KeyEvent、DragEvent 等具有相似的链式缓存,类似 Message。


5.在 View 的状态保存、恢复过程中,ActionBar 中所有 View 共享一个 SparseArray 容器,ContentView 中所有 View 共享一个 SparseArray 容器。当前获取焦点的 View 会额外存储。


6.设置 ViewTreeObserver 的系列监听方法需要确保 View 在 attachToWindow 之后,否则可能因为 add 监听和 remove 监听不是作用于同一个对象而引起内存泄漏等。

Binder、IPC、进程等相关

1.可以通过文件锁来实现进程间互斥(参考:RePlugin),在处理某些只需要单进程执行的任务时很实用。


2.Binder 设计架构中,只有 Binder 主线程是由本进程主动创建,Binder 普通线程都是由 Binder 驱动根据 IPC 通信需求被动创建。


3.oneway 与非 oneway,都需要等待 Binder Driver 的回应消息(BR_TRANSACTION_COMPLETE),区别在于 oneway 不用等待 BR_REPLY 消息。


4.mediaserver 和 servicemanager 的主线程都是 binder 线程,但 system_server 的主线程不是 Binder 线程,system_server 主线程的玩法跟应用进程一样。


5.同一个 BpBinder 可以注册多个死亡回调,但 Kernel 只允许注册一次死亡通知。


6.应用进程由 Zygote 进程孵化而来,在它真正成为应用进程之前,系统通过抛异常的方式来清理栈帧,并反射调用 ActivityThread 的 main 方法。


7.在 Binder 通信的过程中,数据是从发起通信进程的用户空间直接写到目标进程内核空间,内核空间的数据释放是由用户空间控制的。


好了,文章到这里就结束了,如果你觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢~


最后,一点题外话:


最近面试被怼了?缺面试题刷提升自己吗?


点击:


Android学习PDF+架构视频+面试文档+源码笔记


来获取学习资料提升自己去挑战一下 BAT 面试难关吧

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
Android-冷门知识点汇总:你知道哪些Android中的冷门知识?