Android基础知识(定时的基础知识巩固,以便自我包装)

废话:

入坑三年,大大小小的项目接了不少,从入门>UI设计>码砖>后台>运维>跨平台开发再到多语言开发等等,甚至幻觉到自己已经没有完成不了的项目,即便有那也是公司不愿意花钱的原因。

可前段时间有个偶然机会和一个华为的大佬聊天,才发现原来自己的基础是那么的差劲,为此也让我堕落了好几天。不过现在来想这并不一定是件坏事,既然已经发现问题,那干嘛不好好的去弥补。在这里感谢这位华为的大佬,下面记录一下基础知识的恶补过程。

一、谈谈apk是如何启动的?

1、10K以上回答(并函10K以下知识):

首先,Android在系统架构分为四个层面,高到底分别是应用程序层、应用程序框架层、系统运行库层和linux核心层。另外,进程是系统的执行单位,Linux系统是核心底层。

当bootloader启动内核和init进程. init进程分裂出更多名为"daemons(守护进程)"的底层的Linux进程, 诸如android debug deamon, USB deamon等,因此我们可以把init进程当作android操作系统的第一个进程。随后,init进程会启动Zygote进程(Zygote是所有的android进程的父进程),包括SystemServer和各种应用进程都是通过Zygote进程fork出来的。

总结:init进程 –> Zygote进程 –> SystemServer进程 –>各种应用进程

2、10K以下回答:

启动流程:

①点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起startActivity请求;

②system_server进程接收到请求后,向zygote进程发送创建进程的请求;

扫描二维码关注公众号,回复: 5289545 查看本文章

③Zygote进程fork出新的子进程,即App进程;

④App进程,通过Binder IPC向sytem_server进程发起attachApplication请求;

⑤system_server进程在收到请求后,进行一系列准备工作后,再通过binder IPC向App进程发送scheduleLaunchActivity请求;

⑥App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程发送LAUNCH_ACTIVITY消息;

⑦主线程在收到Message后,通过发射机制创建目标Activity,并回调Activity.onCreate()等方法。

⑧到此,App便正式启动,开始进入Activity生命周期,执行完onCreate/onStart/onResume方法,UI渲染结束后便可以看到App的主界面。

这就是一个APP启动到主页面显示的过程,可能这些流程中的一些术语看的有些懵,什么是Launcher,什么是zygote,什么是applicationThread…..

3、我的回答:

这还不简单,从接收到system_server进程接请求后不就直接进入Application、activity来了,你是要问我activity的生命周期吗?

流程:onCreate–>onRestart–>onStart–>onResume–>onPause–>onStop–>onDestroy

嘿,真是无知者无畏啊!

更多大神解答参见:

https://blog.csdn.net/csdn_aiyang/article/details/82462399

https://www.jianshu.com/p/12de32b31836

二、说说你对android四大组件的理解,他们又是如何通信的?

android四大组件分别为activity、service、content provider、broadcast receiver,他们各执其职,通常在一个项目中根据需求配合使用,除了Content Provider本身就是一种通信机制,其余三个一般都是通过intent进行通信。

四大组件:

1、activity

(1)一个Activity通常就是一个单独的屏幕(窗口)。

(2)Activity之间通过Intent进行通信。

(3)android应用中每一个Activity都必须要在AndroidManifest.xml配置文件中声明,否则系统将不识别也不执行该Activity。

2、service

(1)service用于在后台完成用户指定的操作。service分为两种:

(a)started(启动):当应用程序组件(如activity)调用startService()方法启动服务时,服务处于started状态,其生命周期与启动它的组件无关。

(b)bound(绑定):当应用程序组件调用bindService()方法绑定到服务时,服务处于bound状态,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止。

(2)开发人员需要在应用程序配置文件中声明全部的service,使用<service></service>标签。

(3)Service通常位于后台运行,它一般不需要与用户交互,因此Service组件没有图形用户界面。Service组件需要继承Service基类。Service组件通常用于为其他组件提供后台服务或监控其他组件的运行状态。

3、broadcast receiver

(1)广播对相应的事件进行过滤,它们可以启动一个activity或serice来响应它们收到的信息,或者用NotificationManager来通知用户。通知可以用很多种方式来吸引用户的注意力,例如闪动背灯、震动、播放声音等

(2)广播接收者的注册有两种方法,分别是程序动态注册(随程序关闭而关闭)和AndroidManifest文件中进行静态注册。

(3)广播接收器也没有用户界面。

4、content provider

(1)Content Provider内容提供商或者内容提供器,可支持在多个应用中存储和读取数据。

(2)开发人员不会直接使用ContentProvider类的对象,大多数是通过ContentResolver对象实现对ContentProvider的操作。

(1)ContentProvider使用URI来唯一标识其数据集,这里的URI以content://作为前缀,表示该数据由ContentProvider来管理。

Intent通信:

Intent不仅可用于应用程序之间的交互与通讯,也可用于应用程序内部的activity, service和broadcast receiver之间的交互。Intent这个英语单词的本意是“目的、意向、意图”。

Intent类型分为显式Intent(直接类型)、隐式Intent(间接类型)。

Intent的相关属性:

  • Intent由以下各个组成部分:
  • component(组件):目的组件
  • action(动作):用来表现意图的行动
  • category(类别):用来表现动作的类别
  • data(数据):表示与动作要操纵的数据
  • type(数据类型):对于data范例的描写
  • extras(扩展信息):扩展信息
  • Flags(标志位):期望这个意图的运行模式

详情参见各位大神:

https://www.cnblogs.com/engine1984/p/4146621.html

当然需要恶补的知识还有很多,如对list&ArrayList的理解、甚至会问你对final的理解,今天就先到这里,先下班吃饭了。

猜你喜欢

转载自blog.csdn.net/qq_35350654/article/details/84662361