Android 四大组件基础

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_37730482/article/details/73810685

一.本地广播,和全局广播有什么差别

 

全局广播(BroadcastReceiver):发出去的广播可以被任何应用程序接收到,也可以接受来自任何应用程序的广播。


本地广播(LocalBroadcastManager):发送的广播只会在自己App内传播,不会泄露给其他App,确保隐私数据不会泄露;其他App也无法向你的App发送该广播,不用担心其他App会来搞破坏;比系统全局广播更加高效。
 

 

 

二.是否使用过 IntentService,作用是什么, AIDL 解决了什么问题

 

Service是在主线程中而没有另开新的线程执行任务,不能处理耗时操作。


而IntentServicee是用来替代Service处理耗时操作的作用,从IntentService的源码中我们也可以看到IntentService实际也是通过Handler来进行主线程的UI更新等操作;IntentServicee有一个抽象方法onHandleIntent,在这里可以处理耗时操作。

 

AIDL:Android Interface Definition Language,即Android接口定义语言。

AIDL 可以跨进程访问其他应用程序,和其他应用程序通讯,多进程间通讯。

 

 

 

三.Activity、 Window、 View 三者的差别, fragment 的特点

 

Activity是Android应用程序的载体,允许用户在其上创建一个用户界面,并提供用户处理事件的API,如onKeyEvent, onTouchEvent等。 并维护应用程序的生命周期。 


当我们调用Acitivity的 setContentView方法的时候实际上是调用的Window对象的setContentView方法,所以我们可以看出Activity中关于界面的绘制实际上全是交给Window对象来做的。 

 

Activity—>Window—>DecorView 
Activity像一个工匠(控制单元),Window像窗户(承载模型),View像窗花(显示视图) LayoutInflater像剪刀,Xml配置像窗花图纸。

 

在Activity中调用attach,创建了一个Window。


创建的window是其子类PhoneWindow,在attach中创建PhoneWindow。


在Activity中调用setContentView(R.layout.xxx)。

 

其中实际上是调用的getWindow().setContentView()。


调用PhoneWindow中的setContentView方法。


创建ParentView:作为ViewGroup的子类,实际是创建的DecorView(作为 FramLayout的子类)。

 

将指定的R.layout.xxx进行填充通过布局填充器进行填充【其中的parent指的>* 就是DecorView】。

 

调用到ViewGroup。

 

调用ViewGroup的removeAllView(),先将所有的view移除掉。

 

添加新的view:addView() 。
 

 

fragment 特点


Fragment可以作为Activity界面的一部分组成出现;


可以在一个Activity中同时出现多个Fragment,并且一个Fragment也可以在多个Activity中使用;


在Activity运行过程中,可以添加、移除或者替换Fragment;


Fragment可以响应自己的输入事件,并且有自己的生命周期,它们的生命周期会受宿主Activity的生命周期影响。

 

 

 

 

四.Handler、 Thread 和 HandlerThread 的差别

 

 

Thread是一个线程。


我们知道Handler是用来异步更新UI的,更详细的说是用来做线程间的通信的,更新UI时是子线程与UI主线程之间的通信。那么现在我们要是想子线程与子线程之间的通信要怎么做呢?当然说到底也是用Handler+Thread来完成(不推荐,需要自己操作Looper)。


HandlerThread就是(Handler+Thread结合),HandlerThread其实还是一个线程,它跟普通线程有什么不同之处是多了一个Looper,这个是子线程独有的Looper,用来做消息的取出和处理。

 

 

 

 

五.低版本 SDK 实现高版本 api

 

在使用高于minSdkVersion API level的方法需要:


用@TargeApi($API_LEVEL) 使可以编译通过, 不建议使用@SuppressLint(“NewApi”);


运行时判断API level; 仅在足够高,有此方法的API level系统中,调用此方法;


保证功能完整性,保证低API版本通过其他方法提供功能实现。

 

 

 

六.launch mode 应用场景

 

  • standard:每次激活Activity时都会创建Activity实例,并放入任务栈中。这个是默认的;
  • singleTop:如果已经存在在栈顶在对方的任务一个同类型的活动实例,不会有任何新的activity创造,而是被发送到一个存在的activity实例通过onNewIntent() 方法的意图,即会重用该实例调用当前activity的onNewIntent() 方法。适合接收通知启动的内容显示页面。 
    例如,某个新闻客户端的新闻内容页面,如果收到10个新闻推送,每次都打开一个新闻内容页面是很烦人的。
  • singleTask:如果系统中有一个存在的活动实例,整个任务将实例将被移动到顶部,Intent将通过onnewintent()方法交付。否则,新的activity将被创建并放置在适当的任务中。适合作为程序入口点。 
    例如浏览器的主界面。不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面。
  • singleInstance适合需要与程序分离开的页面。 
    例如闹铃提醒,将闹铃提醒与闹铃设置分离。 
    singleInstance不要用于中间页面,如果用于中间页面,跳转会有问题,比如:A -> B (singleInstance) -> C,完全退出后,在此启动,首先打开的是B。

 

 

 

阅读更多
换一批

没有更多推荐了,返回首页