2019-08-22 刷题知识点

本文深入讲解Android开发中的关键概念,包括Activity的启动模式、动画类型、生命周期管理、服务启动方式、线程间通信机制、资源及状态保存的最佳实践、AIDL使用技巧、广播Intent与Receiver的交互原理、布局管理器特性、Hook框架应用、Activity间跳转机制、进程间通信方式、排序算法分析、数据结构详解、静态变量存储区域解析等。
摘要由CSDN通过智能技术生成

1.Activity有多种启动方式,属于Activity的启动方式:standard、singleTop、singleTask和singleInstance。

2.Android的补间动画包括AlphaAnimation、ScaleAnimation、RotateAnimation。
AlphaAnimation:透明度渐变效果,创建时许指定开始以及结束透明度,还有动画的持续 时间,透明度的变化范围(0,1),0是完全透明,1是完全不透明;对应<alpha/>标签。
ScaleAnimation:缩放渐变效果,创建时需指定开始以及结束的缩放比,以及缩放参考点, 还有动画的持续时间;对应<scale/>标签。
TranslateAnimation:位移渐变效果,创建时指定起始以及结束位置,并指定动画的持续 时间即可;对应<translate/>标签。
RotateAnimation:旋转渐变效果,创建时指定动画起始以及结束的旋转角度,以及动画 持续时间和旋转的轴心;对应<rotate/>标签。
AnimationSet:组合渐变,就是前面多种渐变的组合,对应<set/>标签。

3.如果在Activity中对一些资源以及状态进行保存操作,最好是在生命周期的哪个函数中进行呢?(onPause())
因为当Activity失去焦点时,或者说不在是前台进程时,他都有可能被销毁。而onpause()是其必然执行的一个生命周期回调函数,但是也要注意所执行的操作不能太耗时,否则会影响新Activity的显示。

4.通过startService()和bindService(),以下说法正确的是
通过startService()启动服务:会调用如下生命周期方法: onCreate()---->onStart()---->onDestory()。
当采用startService()方法启动服务,访问者与服务之间是没有绑定在一起的,访问者退出,服务还在运行。
如果是调用bindService()启动服务:会调用如下生命周期方法: onCreate()---->onBind()---->onUnBind() -->onDestory()。
采用bindService()方法启动服务时,访问者与服务是绑定在一起的,即访问者退出,服务也就终止,解除绑定。

5.为满足线程间通信,android提供了Handler和 Looper。
andriod提供了 Handler 和 Looper 来满足线程间的通信。 Handler 先进先出原则。 Looper 类用来管理特定线程内对象之间的消息交换 (MessageExchange) 。
1)Looper: 一个线程可以产生一个 Looper 对象,由它来管理此线程里的 MessageQueue( 消息队列 ) 。
2)Handler: 你可以构造 Handler 对象来与 Looper 沟通,以便 push 新消息到 MessageQueue 里 ; 或者接收 Looper 从 Message Queue 取出 ) 所送来的消息。
3)Message Queue( 消息队列 ): 用来存放线程放入的消息。
4)线程: UIthread 通常就是 main thread ,而 Android 启动程序时会替它建立一个 MessageQueue 。

10186693-b5c2cfc78b85ea3e.png
image.png

6.下列说法正确的是(在清单文件中声明最低API级别)。

7.关于Android中定义style和theme的描述:
都可以减少重复属性设置。
style可以作用在Activity上。
Theme被final修饰,是不可以被继承的。
一个TextView的style中定义了textColor属性,TextView本身也设置textColor属性,那么TextView本身定义的优先级较高。

8.关于LayoutInflater的说法:
LayoutInflater的from方法是static(静态)的。
LayoutInflater的inflate方法可以有三个参数。
LayoutInflater的具有一个参数Context对象的构造方法。

9.使用AIDL完成远程service方法调用下列说法正确的是:
aidl对应的接口名称与aidl文件名相同。
aidl的文件的内容类似java代码。
创建一个Service(服务),在服务的onBind(Intent intent)方法中返回实现了aidl接口的对象。
编写Aidl文件时,需要注意下面几点:
a.接口名和aidl文件名相同。
b.接口和方法前不用加访问权限修饰符public,private,protected等,也不能用final,static。
c.Aidl默认支持的类型包话java基本类型(int、long、boolean等)和(String、List、Map、 CharSequence),使用这些类型时不需要import声明。对于List和Map中的元素类型必须是Aidl支持的类型。如果使用自定义类型作 为参数或返回值,自定义类型必须实现Parcelable接口。
d.自定义类型和AIDL生成的其它接口类型在aidl描述文件中,应该显式import,即便在该类和定义的包在同一个包中。
e.在aidl文件中所有非Java基本类型参数必须加上in、out、inout标记,以指明参数是输入参数、输出参数还是输入输出参数。
f.Java原始类型默认的标记为in,不能为其它标记。

10.android中Activity在什么时候会调用方法setResult(在finish()之前)。

11.有关Broadcas Intent和Broadcast Receiver说法:
程序广播Intent对象时,需要先建立Intent对象,并指定待广播消息。

12.在哪种模式下,同一个Activity可以被多次实例化?
standard、singleTop。
standard标准模式:每次启动一个Activity就会创建一个新的实例
singleTop栈顶复用模式:如果新Activity已经位于任务栈的栈顶,就不会重新创建,并回调 onNewIntent(intent) 方法
singleTask栈内复用模式:只要该Activity在一个任务栈中存在,都不会重新创建,并回调 onNewIntent(intent) 方法。如果不存在,系统会先寻找是否存在需要的栈,如果不存在该栈,就创建一个任务栈,并把该Activity放进去;如果存在,就会创建到已经存在的栈中
singleInstance单实例模式:具有此模式的Activity只能单独位于一个任务栈中,且此任务栈中只有唯一一个实例。

13.下列对android NDK的理解正确的是:
NDK是一系列工具的集合。
NDK 提供了一份稳定、功能有限的 API 头文件声明。
使 “Java+C” 的开发方式终于转正,成为官方支持的开发方式。

14.NotificationManager 中清除消息的方法是:
cancel、cancelAll。


10186693-6336863ebdd14e74.png
image.png

15.TableLayout可以将视图按行或列排列。
AbsoluteLayout可以任意设置视图定位位置。

16.移动端hook框架有(xposed、Substrate、Cydia、frida)

17.FirstActivity跳转到SecondActivity后,然后点击返回键,以下执行顺序可能出现的是:SecondActivity的onPause()->FirstActivity的onRestart()->FirstActivity的onResume()->SecondActivity的onStop()

18.以下哪些属于Android系统中进程间相互通信的方式?
binder、socket、pipe

19.小顶堆:父节点上的值比左右孩子上的值小,且所有子树都满足,如:
12
36 24
85 47 30 53
91
大顶堆:父节点上的值比左右孩子上的值大,且所有子树都满足,如:
91
47 85
24 36 53 30
16

二叉排序树:若左孩子不为null,则其值比父节点小;若右孩子不为null。则其值比父节点大。且所有子树都满足。也就是说根节点值比左子树上的都大,比右子树上的都小。所有子树都满足。如:
30
25 35
17 26 33 39
13 (1)(2)
注意:(1)为26的左孩子节点,要比26小,但要比26的父节点25大,所以此处不能填。(2)处为26右孩子节点,比26大,但作为30的左子树,不能大于30.若大于30的值插入,则在右子树上开始查找,如插入31.则31比35小,在35左子树,与33比,小,则继续往33的左子树上比较,若左子树为null,则插入。
所以插入的情况肯定是作为叶子节点插入。

20.多型数据类型就是数据元素的类型不确定,字符串的每个元素始终都是字符类型,而不会是别的类型,栈、堆、有向图的数据元素的元素类型不确定。

21.堆排序时间复杂度为O(nlogn),初始建堆时间复杂度O(n),一次重建堆时间复杂度O(logn),重建堆的时间复杂度为O(n*logn) 。

堆排序的时间,主要由建立初始堆和反复重建堆这两部分的时间开销构成,它们均是通过调用Heapify实现的。时间复杂度O(n*logn)
如果从底部最后的父节点开始建堆,那么我们可以大概算一下: 假如有N个节点,那么高度为H=logN,最后一层每个父节点最多只需要下调1次,倒数第二层最多只需要下调2次,顶点最多需要下调H次,而最后一层父节点共有2(H-1)个,倒数第二层公有2(H-2),顶点只有1(2^0)个,所以总共的时间复杂度为s = 1 * 2^(H-1) + 2 * 2^(H-2) + ... + (H-1) * 2^1 + H * 2^0 将H代入后s= 2N - 2 - log2(N),近似的时间复杂度就是O(N)。

22.下标从1开始,在含有n个关键字的小根堆(堆顶元素最小)中,关键字最大的记录有可能存储在()位置上。[n/2]+2
首先要明白:中括号取整,就是不大于这个数的最大整数
第二要看清下标是从1开始的。那么
1
2 3
4 5 6 7
...............n
n不论是左子树还是右子树,n的父结点一定是 [n/2],注意中括号的取整规则,正数就是下取整
那么 [n/2] 这个结点还是有子结点的,从 [n/2] + 1 开始一直到 n 都是叶子结点,叶子结点就可能会是最大值。

23.静态变量static在不同的实例中地址是否一样?他们储存在什么区域?(地址一样,在全局区。)

24.初始序列为1 8 6 2 5 4 7 3一组数采用堆排序,当建堆(小根堆)完毕时,堆所对应的二叉树中序遍历序列为:(8 3 2 5 1 6 4 7)
初始化序列:1 8 6 2 5 4 7 3,,小根堆就是要求结点的值小于其左右孩子结点的值,左右孩子的大小没有关系,那么小根堆排序之后为:1 2 4 3 5 6 7 8;
中序遍历:先遍历左孩子,然后访问根结点,最后访问有孩子,故遍历结果为:8 3 2 5 1 6 4 7

25.就分类算法所用的辅助空间而言,堆分类、快速分类和归并分类的关系是(堆分类<快速分类<归并分类)

10186693-95e137594cb20315.png
image.png

26.已知序列25,13,10,12,9是大根堆,在序列尾部插入新元素18,将其再调整为大根堆,调整过程中元素之间进行的比较次数是(2次)
插入18后,首先18与10比较,交换位置,再18与25比较,不交换位置。共比较了2次,调整的过程如下图所示。

10186693-3cc48b61fb444e11.png
image.png

27.最坏情况下 insert sort, quick sort ,merge sort 的复杂度分别是多少?O(nn),O(nn),O(nlogn)
a:简单选择 最好时间 O(n^2) 平均时间O(n^2) 最坏时间 O(n^2)
b:直接插入 最好时间 O(n) 平均时间O(n^2) 最坏时间 O(n^2)
c:冒泡排序 最好时间 O(n) 平均时间O(n^2) 最坏时间 O(n^2)
d:希尔排序 最好时间 O(n) 平均时间O(logn) 最坏时间 O(n^s) 1<s<2
e:快速排序 最好时间 O(nlogn) 平均时间O(nlogn) 最坏时间O(n^2)
f:堆排序 最好时间 O(nlogn) 平均时间O(nlogn) 最坏时间O(nlogn)
g:归并排序 最好时间 O(nlogn) 平均时间O(nlogn) 最坏时间O(nlogn)

28.有关c++静态数据成员,说法正确的是:可以直接用类名调用。
通常静态数据成员在类声明中声明,在包含类方法的文件中初始化.
初始化时使用作用域操作符来指出静态成员所属的类.
但如果静态成员是整型或是枚举型const,则可以在类声明中初始化!!
如果改成有的静态数据成员是可以直接在类中初始化就对了

29.在用堆排序算法排序时,如果要进行增序排序,则需要采用"大根堆"(√)
因为大根堆每次生成的根都会跟最右侧没有排序的叶子节点进行交换,从而使得越大的元素越放在后面。这个特性使用数组的结构能够很清晰的表现出来。最终得到了升序排列。
如果是小根堆,则每次拿到最小的跟最右侧未排过序的叶子节点进行交换,最终得到的序列是递减的。

30.在Windows中,下列关于堆和栈的说法中正确的是:
a.堆都是动态分配的,没有静态分配的堆;栈有静态分配和动态分配2种分配方式。
b.对堆的频繁new/delete会造成内存空间的不连续,从而造成大量的碎片;栈则不会存在这个问题
c.栈是由编译器自动治理;堆的释放工作由程序员控制,轻易产生内存泄露。
1、栈区(stack)由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap)一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事。
区别:
1). 管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生内存溢出。
2). 空间大小:堆内存几乎是没有什么限制。栈一般都是有一定的空间大小。
3). 碎片问题:对于堆来讲,频繁的new/delete会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题。
4). 分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。
5). 分配效率:栈的效率比较高。堆的效率比栈要低得多。
6). 增长方向:堆的增长方向是从程序低地址到高地址向上增长,而栈的增长方向刚好相反(实际情况可能不是这样的,与CPU的体系结构有关)

注意:这里的堆和数据结构中的堆没啥关系。

31.关于堆排序复杂度分析的叙述中正确的是:
堆排序的时间复杂度为O(nlogn)
整个构建堆的时间复杂度为O(n)
堆排序的空间复杂度为O(1)
堆排序是一种不稳定的排序算法

10186693-2e5beab9e17da925.png
image.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值