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

四大组件相关:

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

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

3.两个不一样应用的Activity,能够运行在同一个Activity栈中。面试

4.同一个应用进程中的全部Activity,共享一个WindowSession。segmentfault

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攻击等安全隐患。app

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开发面试专题PDF,高级进阶架构资料帮助你们学习提高进阶,也节省你们在网上搜索的时间来学习,也能够分享给身边好友一块儿学习。

相信它会给你们带来不少收获:

上述高清技术脑图以及配套的架构技术PDF能够加我wx:X1524478394 免费领取

或者扫描二维码便可:

微信二维码.png

  • 不管你如今水平怎么样必定要 持续学习 没有鸡汤,别人看起来的绝不费力,其实费了很大力,这四个字就是个人建议!!!!!!!!!
  • 我但愿每个努力生活的IT工程师,都会获得本身想要的,由于咱们很辛苦,咱们应得的。
相关文章
相关标签/搜索