`
Z_萧晓
  • 浏览: 10770 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

阅读更多

组件相关:

1.启动一个Activity,在应用进程至少需要两个Binder线程。

 

2.启动一个launchMode为singleTask的Activity,它并不一定会运行在新的Activity栈中。

 

3.两个不同应用的Activity,可以运行在同一个Activity栈中。

 

4.同一个应用进程中的所有Activity,共享一个WindowSession。

 

5.弹出一个AlertDialog,不一定需要Activity级别的Context,而且任何地方都有办法弹出一个AlertDialog,只要是在Application的attachBaseContext之后。

 

下面是一个简单的demo演示:

 

首先看DemoApplication,然后看Alert类:

在Application中初始化:

import android.app.Application;

public class DemoApplication extends Application {
    @Override
    public void onCreate() {
        Alert.alertAnyWhere();
        super.onCreate();
    }
}

下面这个类是对AlertDialog的封装类:

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.view.WindowManager;
import java.lang.reflect.Method;

public class Alert {

    public static void alertDialog() {
        Context mAppContext = null;
        try {
            Class<?> clazz = Class.forName("android.app.ActivityThread");
            Method method = clazz.getDeclaredMethod("currentApplication", new Class[0]);
            mAppContext = (Context) method.invoke(null, new Object[0]);
        } catch (Throwable e) {
            e.printStackTrace();
            return;
        }

        AlertDialog.Builder builder = new AlertDialog.Builder(mAppContext);
        builder.setTitle("Hi")
               .setMessage("Hello World");
               .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                })
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                    }
                });
        AlertDialog dialog = builder.create();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_TOAST);
        } else {
            dialog.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() {
                @Override
                public 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+架构视频+面试文档+源码笔记,还有高级架构技术进阶脑图、Android开发面试专题资源,高级进阶架构资料帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习

 

加我wx:X1524478394(或者qun:887084983)即可免费获取

 

专注分享大型Bat面试知识,后续会持续更新,希望通过这些高级面试题能够降低面试Android岗位的门槛,让更多的Android工程师理解Android系统,掌握Android系统。喜欢的话麻烦点击一个喜欢在关注一下~

分享到:
评论

相关推荐

    Android代码-CommonDevKnowledge

    CommonDevKnowledge 常用的Android开发的一些技能点汇集。 介绍 这个库主要是一些常用的Android开发的一些技能点汇集,有填坑总结,有面试总结,有冷门...:point_right: :six: Android中的冷门知识点汇总 :pencil: :se

    CommonDevKnowledge :: star2:史上最全的BAT大厂Android面试题汇集,以及常用的Android开发的一些技能点,冷门知识点汇总,开发中遇到的坑汇总等干货

    这个库主要是一些常用的Android开发的一些技能点汇集,有填坑总结,有面试总结,有冷门知识点总结等,总之Android开发有关的知识点都会涵盖到。 Android一些太多的东西我们开发中经常会遇到,于是我就把常用知识点...

    护肤的几点冷门小知识.doc

    护肤是每个女生都关心的主题,但是在护肤的过程中,也有一些冷门的小知识,如果你不知道这些知识,你可能就错过了一些非常重要的护肤方法。以下是六个冷门的小知识,帮助你更好地护肤。 冷知识 1:皱纹也有真假之分...

    个人对java基础的一些知识点常误区

    这里记录本人学习java时经常记不住或有误区、或易混淆的知识点记录

    冷门知识:三极管也有特殊用法

    图4中的两只三极管串联可直接代换调光台灯中的双向触发二极管;图5中的三极管可代用8V左右的稳压管。图6中的三极管可代用30V左右的稳压管。上述应用时,三极管的基极均不使用。 模拟 用三极管够成的电路还可以模拟...

    JavaScript_开发者经常忽略或误用的七个基础知识点.

    JavaScript 是Web开发中不可或缺的一部分,尤其对于前端开发者来说,深入理解和掌握JavaScript的基础知识点至关重要。然而,在实际工作中,很多开发者往往过于关注高级技术和框架,而忽视了一些基础但实用的知识点。...

    国外冷门免杀加壳程序Pepsi Packer v2

    壳(Shell)通常指的是将原始可执行代码包裹在另一段代码之中的过程,这样可以改变原程序的特征,使其更难被反编译或分析。"Pepsi Packer v2"是一款国外相对冷门的加壳工具,其特点是具有免杀能力,即能够帮助程序...

    QQ旋风如何使用离线下载下载冷门资源?.docx

    QQ旋风是一款由腾讯公司开发的下载工具,它提供了丰富的功能,其中离线下载是解决冷门资源下载问题的一个高效方案。离线下载是下载工具的一项增值服务,它允许用户将那些难以通过常规方式获取或者速度极慢的网络资源...

    关于Css的一些基础

    ### 关于Css的一些基础知识 #### 一、层叠样式表的概念(CSS) 层叠样式表(Cascading Style Sheets,简称CSS)是一种用于定义网页布局和样式的语言。它允许开发者独立地控制文档的视觉表现形式,从而实现内容与表现...

    深浅拷贝及冷门小知识.rar

    下面,我们将深入探讨赋值、深拷贝和浅拷贝的原理,以及一些关于Python内存的冷门小知识。 首先,我们来谈谈赋值操作。在Python中,当我们将一个变量赋值给另一个变量时,并不会创建新的对象,而是创建一个新的引用...

    十大高就业率专业均是冷门原因分析-分析热门专业和冷门专业的图表模板样式范文.docx

    - 冷门专业如农业机械设计制造及其自动化,尽管名称中有“农业”,但其实涵盖了机械制造和农业机械应用的综合知识,毕业生可在农业机械设计和生产领域找到工作。 4. **法学和医学的就业困境**:这两个专业由于职业...

    2010年IT的热门和冷门职业

    根据专家的预测,我们可以从中提炼出几个关键的知识点,这些对于理解当年的行业动态以及求职者的职业规划具有指导意义。 首先,"2010年IT的热门职业"可能包括了云计算、大数据分析、移动应用开发和网络安全等方向。...

    日语一级冷门语法预测

    以下是对标题和描述中提到的知识点的深入说明: ### 日语一级冷门语法预测 在日语学习的过程中,一级考试被视为掌握高级日语能力的标志。然而,考试中不仅包含日常交流中常用的语法,还涉及一些较为生僻的结构。...

    冷门AI知乎好物推荐项目玩法,附知乎全套账号运营,小白也能零投资躺赚.zip

    下面将详细解析这个项目的知识点。 首先,我们需要了解AI在商品推荐中的应用。AI通过机器学习和大数据分析,能够理解用户的购物习惯、兴趣偏好和行为模式,从而提供个性化的产品推荐。这种推荐系统通常基于协同过滤...

    冷门知识,三极管也有特殊用法

    三极管是电子技术中一个非常基础而重要的元件,它主要用于信号放大和开关控制。然而,除了这些常见的应用之外,三极管还有一些不为人知的特殊用法,这些用法可以使三极管在电路中扮演更多元的角色。在这篇文章中,...

    border虚线(带你了解冷门却实用的特性)

    在网页设计中,元素的边框是至关重要的,它可以为页面增添层次...希望这个知识点能对你的设计工作带来帮助,让你在创作中更加得心应手。如果你需要更深入的实践示例或有其他疑问,可以查阅相关的在线资源或进一步研究。

    Delphi技巧集锦

    #### 知识点一:Delphi中的TBitmap与GDILib结合使用 在Delphi编程中,`TBitmap`对象常用于处理图像数据,而GDILib则提供了更底层的图形设备接口(Graphics Device Interface)功能。将两者结合使用,可以实现更复杂...

    Java游戏源码集合(依旧是很冷门的十款源码)

    通过研究这些源码,你可以深入了解Java在游戏开发中的应用,以及如何利用Java语言构建交互式娱乐体验。 首先,Java作为一款跨平台的编程语言,因其简洁性、面向对象的特性以及丰富的类库而被广泛用于游戏开发。在...

    张锐医疗APP商业浮想:冷门领域里的规模路.docx

    【描述】:这篇文章探讨了前网易副总编辑张锐的创业经历,他离开网易后投身于医疗APP的创业,试图在冷门领域中寻找规模化发展的路径。 【部分内容】: 文章讲述了张锐在网易工作期间对移动互联网的敏锐洞察,尤其是...

    高级java笔试题-awesome-learning:Github仓库学习资源!

    史上最全的BAT大厂Android面试题汇集,以及常用的Android开发的一些技能点,冷门知识点汇总,开发中遇到的坑汇总等干货。 LeetCode 上面主要收集了各大 IT 公司的笔试面试题,该项目为 LeetCode Java 语言的题解集合 ...

Global site tag (gtag.js) - Google Analytics