Android面试总结(2018-03-07)

2018-03-08  本文已影响0人  西瓜皮TWO

融360 和 FunPlus+:

  生命周期:onFinishInflate()--> onAttachToWindow()--> onMeasure()--> onLayout()--> 
onDraw()--> onWindowFocusChanged() --> onDetachFormWindow();
  1、Application的attachBaseContext()方法优先执行;
  2、ContentProvider的onCreate()方法比Application的onCreate()方法先执行;
  3、Service和Activity 的 onCreate()方法和 BroadcastReceiver的 onReceive()方法,
是在Application的onCreate()方法后执行的;
  4、调用流程:Application的attachBaseContext()--> ContentProvider的onCreate()-->
Application的onCreate()--> Service、Activity等的onCreate()(Activity和Service不分先后);

百度 (百家号)

一面

二面

用户在Launcher程序里点击应用图标时,会通知ActivityManagerService启动应用的默认Activity,
ActivityManagerService发现这个应用还未启动,则会通知Zygote进程(fork)孵化出应用进程,
然后在这个dalvik应用进程里执行ActivityThread的main方法。
应用进程接下来通知ActivityManagerService应用进程已启动,ActivityManagerService保存应用进程的一个代理对象(applicationthread),
这样ActivityManagerService可以通过这个代理对象控制应用进程,
然后ActivityManagerService通知应用进程创建入口Activity的实例,并执行它的生命周期方法.
第一种 : 使用 getviewtreeobserver().addongloballayoutlistener()来获得宽度或者高度
    private int mheaderviewheight; 
    private view mheaderview; 
      ..... 
      mheaderview.getviewtreeobserver().addongloballayoutlistener( new ongloballayoutlistener() { 
        @override
        public void ongloballayout() { 
           mheaderviewheight = mheaderview.getheight(); 
           mheaderview.getviewtreeobserver() .removeglobalonlayoutlistener(this); 
       } 
    });
    需要注意的是ongloballayoutlistener可能会被多次触发,因此在得到了高度之后,要将ongloballayoutlistener注销掉。

第二种 : view post事件中获取
    public class testheight extends activity { 
       textview tv; 
       @override
       protected void oncreate(bundle savedinstancestate) { 
          super.oncreate(savedinstancestate); 
          setcontentview(r.layout.activity_activity_b); 
          tv = (textview) findviewbyid(r.id.textview); 
          tv.post(new runnable() { 
             @override
             public void run() { 
              int height= tv.getheight(); 
             } 
          }); 
       } 
    } 

第三种 : 直接测量计算
    int intw=view.measurespec.makemeasurespec(0,view.measurespec.unspecified); 
    int inth=view.measurespec.makemeasurespec(0,view.measurespec.unspecified); 
    textview.measure(intw, inth); 
    int intwidth = textview.getmeasuredwidth(); 
    int intheight = textview.getmeasuredheight();

必要商城

1、measure的测量规则 --- view的大小试根据父view的measureMode + view的layout.parame + view的measureMode计算出来的;
2、layout的布局是通过setFrem(l,t,r,b)
3、draw的绘制流程: 绘背景drawBackground() --> 绘内容onDraw() --> 绘子view disoatchDraw() --> 
    绘装饰(侧边栏,滚动条...)onDrawForeground()
4、可以通过invalid和requestLayout方法请求重绘

火币网

人人车

    我们在原生Android中安装apk会产生apk和odex两个文件,而使用第三方的rom只有apk一个文件。
    我们知道普通的Android App编译之后会生成apk,其中的class.dex是其可执行文件。Android App运行的策略也就是解压apk后运行class.dex。
那么odex是什么?
    odex是同名apk经系统优化后的dex文件,原生ROM中apk和odex文件是配对的,对应的apk文件中没有了dex(比正常可安装的apk小)。
这样的好处:
    1.加快程序的装载与运行
    2.防止系统程序的简单复制(防盗链!),针对不同的ROM,odex文件是变化的,不可混用的,否则程序就不能政策运行。
与odex配对的apk文件又因为缺少dex无法单独安装和使用。这也是直接复制带ODEX的程序到其他固件不能运行的原因。
    3.节省data分区资源(ODEX解压出来的执行程序是在SYSTEM目录的同名ODEX,DEX版的解压是在DATA区目录,且ODEX文件比DEX文件更小)
上一篇 下一篇

猜你喜欢

热点阅读