如何知道网站是否被k,公司宣传册页面设计模板,郑州做网站哪个平台好,河北省建设执业资格中心网站**虚引用#xff1a;**顾名思义#xff0c;就是形同虚设#xff0c;如果一个对象仅持有虚引用#xff0c;那么它相当于没有引用#xff0c;在任何时候都可能被垃圾回收器回收。
7.介绍垃圾回收机制 **标记回收法#xff1a;**遍历对象图并且记录可到达的对象#xff0c…**虚引用**顾名思义就是形同虚设如果一个对象仅持有虚引用那么它相当于没有引用在任何时候都可能被垃圾回收器回收。
7.介绍垃圾回收机制 **标记回收法**遍历对象图并且记录可到达的对象以便删除不可到达的对象一般使用单线程工作并且可能产生内存碎片 **标记-压缩回收法**前期与第一种方法相同只是多了一步将所有的存活对象压缩到内存的一端这样内存碎片就可以合成一大块可再利用的内存区域提高了内存利用率 **复制回收法**把现有内存空间分成两部分gc运行时它把可到达对象复制到另一半空间再清空正在使用的空间的全部对象。这种方法适用于短生存期的对象持续复制长生存期的对象则导致效率降低。 **分代回收发**把内存空间分为两个或者多个域如年轻代和老年代年轻代的特点是对象会很快被回收因此在年轻代使用效率比较高的算法。当一个对象经过几次回收后依然存活对象就会被放入称为老年的内存空间老年代则采取标记-压缩算法 集合、数据结构相关 1.你用过哪些集合类
数据结构中用于存储数据的有哪些
数组
数组存储区间是连续的占用内存严重故空间复杂的很大。但数组的二分查找时间复杂度小为O(1);数组的特点是寻址容易插入和删除困难;
链表
链表存储区间离散占用内存比较宽松故空间复杂度很小但时间复杂度很大达O(N)。链表的特点是寻址困难插入和删除容易。
2.说说hashMap是怎样实现的
哈希表:由数组链表组成的
当我们往HashMap中put元素的时候先根据key的hashCode重新计算hash值根据hash值得到这个元素在数组中的位置(即下标)
如果数组该位置上已经存放有其他元素了那么在这个位置上的元素将以链表的形式存放新加入的放在链头最先加入的放在链尾。
如果数组该位置上没有元素就直接将该元素放到此数组中的该位置上。
3.ArrayList,LinkedList的区别 ArrayList是实现了基于动态数组的数据结构LinkedList基于链表的数据结构。 对于随机访问get和setArrayList觉得优于LinkedList因为LinkedList要移动指针。 对于新增和删除操作add和removeLinedList比较占优势因为ArrayList要移动数据。
4.ArrayList和Vector的主要区别是什么?
ArrayList 和Vector底层是采用数组方式存储数据 Vector: 线程同步 当Vector中的元素超过它的初始大小时Vector会将它的容量翻倍 ArrayList: 线程不同步但性能很好 当ArrayList中的元素超过它的初始大小时ArrayList只增加50%的大小
5.HashMap和 HashTable 的区别 HashTable比较老是基于Dictionary 类实现的HashTable 则是基于 Map接口实现的 HashTable 是线程安全的 HashMap 则是线程不安全的 HashMap可以让你将空值作为一个表的条目的key或value
算法相关 1.排序算法和稳定性快排什么时候情况最坏?
2.给最外层的rootview把这个根视图下的全部button背景设置成红色手写代码不许用递归
算法原理 Android的view视图是按树形结构分布所以按树形结构遍历 循环判断每一层的ViewGroup元素将其入栈;否则判断当前view是否是Button类实例是则改写背景色 当前ViewGroup检查childView完成后判断栈是否非空取出栈顶元素ViewGroup重复步骤2直至栈为空。
Thread、AsynTask相关 1.wait()和sleep()的区别 sleep来自Thread类和wait来自Object类 调用sleep()方法的过程中线程不会释放对象锁。而 调用 wait 方法线程会释放对象锁 sleep睡眠后不出让系统资源wait让出系统资源其他线程可以占用CPU sleep(milliseconds)需要指定一个睡眠时间时间一到会自动唤醒
2.若Activity已经销毁此时AsynTask执行完并且返回结果会报异常吗? 当一个App旋转时整个Activity会被销毁和重建。当Activity重启时AsyncTask中对该Activity的引用是无效的因此onPostExecute()就不会起作用若AsynTask正在执行折会报 view not attached to window manager 异常 同样也是生命周期的问题在 Activity 的onDestory()方法中调用Asyntask.cancal方法让二者的生命周期同步
3.Activity销毁但Task如果没有销毁掉当Activity重启时这个AsyncTask该如何解决?
还是屏幕旋转这个例子在重建Activity的时候会回掉Activity.onRetainNonConfigurationInstance()重新传递一个新的对象给AsyncTask完成引用的更新
4.Android 线程间通信有哪几种方式(重要) 共享内存(变量); 文件数据库; Handler; Java 里的 wait()notify()notifyAll()
5.请介绍下 AsyncTask的内部实现适用的场景是 AsyncTask 内部也是 Handler 机制来完成的只不过 Android 提供了执行框架来提供线程池来 执行相应地任务因为线程池的大小问题所以 AsyncTask 只应该用来执行耗时时间较短的任务 比如 HTTP 请求大规模的下载和数据库的更改不适用于 AsyncTask因为会导致线程池堵塞没有 线程来执行其他的任务导致的情形是会发生 AsyncTask 根本执行不了的问题。 网络相关 1.TCP三次握手
2.为什么TCP是可靠的UDP早不可靠的?为什么UDP比TCP快? TCP/IP协议高因为其拥有三次握手双向机制这一机制保证校验了数据保证了他的可靠性。 UDP就没有了udp信息发出后,不验证是否到达对方,所以不可靠。 但是就速度来说还是UDP协议更高毕竟其无需重复返回验证只是一次性的
3.http协议了解多少说说里面的协议头部有哪些字段? http(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议;http请求由三部分组成分别是请求行、消息报头、请求正文。 HTTP消息报头包括普通报头、请求报头、响应报头、实体报头
4.https了解多少
HTTPS(全称Hyper Text Transfer Protocol over Secure Socket Layer)是以安全为目标的HTTP通道简单讲是HTTP的安全版。即HTTP下加入SSL层HTTPS的安全基础是SSL因此加密的详细内容就需要SSL。
5.谈谈 HTTP 中Get 和 Post 方法的区别 GET - 从指定的服务器中获取数据明文发送内容 POST - 提交数据给指定的服务器处理 POST请求不能被缓存下来 POST请求不会保存在浏览器浏览记录中 以POST请求的URL无法保存为浏览器书签 POST请求没有长度限制
6.推送心跳包是TCP包还是UDP包或者HTTP包
心跳包的实现是调用了socket.sendUrgentData(0xFF)这句代码实现的所以当然是TCP包。
7.如何实现文件断点上传
在 Android 中上传文件可以采用 HTTP 方式也可以采用 Socket 方式但是 HTTP 方式不能上传
大文件这里介绍一种通过 Socket 方式来进行断点续传的方式服务端会记录下文件的上传进度
当某一次上传过程意外终止后下一次可以继续上传这里用到的其实还是 J2SE 里的知识。
这个上传程序的原理是客户端第一次上传时向服务端发送
“Content-Length35;filenameWinRAR_3.90_SC.exe;sourceid“这种格式的字符串服务端 收到后会查找该文件是否有上传记录如果有就返回已经上传的位置否则返回新生成的 sourceid 以及 position 为 0类似 sourceid2324838389;position0“这样的字符串客户端收到返回后 的字符串后再从指定的位置开始上传文件。 Fragment相关 1.Fragment 如何实现类似 Activity 栈的压栈和出栈效果的?
Fragment 的事物管理器内部维持了一个双向链表结构该结构可以记录我们每次 add 的
Fragment 和 replace 的 Fragment然后当我们点击 back 按钮的时候会自动帮我们实现退栈操作。
2.Fragment 在你们项目中的使用 Fragment 是 android3.0 以后引入的的概念做局部内容更新更方便原来为了到达这一点要 把多个布局放到一个 activity 里面现在可以用多 Fragment 来代替只有在需要的时候才加载 Fragment提高性能。
Fragment 的好处 Fragment 可以使你能够将 activity 分离成多个可重用的组件每个都有它自己的生命周期和UI。 Fragment 可以轻松得创建动态灵活的 UI 设计可以适应于不同的屏幕尺寸。从手机到平板电脑。 Fragment 是一个独立的模块,紧紧地与 activity 绑定在一起。可以运行中动态地移除、加入、交换等。 Fragment 提供一个新的方式让你在不同的安卓设备上统一你的 UI。 Fragment 解决 Activity 间的切换不流畅轻量切换。 Fragment 替代 TabActivity 做导航性能更好。 Fragment 在 4.2.版本中新增嵌套 fragment 使用方法能够生成更好的界面效果
3.如何切换 fragement,不重新实例化
正确的切换方式是 add()切换时 hide()add()另一个 Fragment;再次切换时只需 hide()当前 show()另一个 四大组件相关 1.Activity和Fragment生命周期有哪些?
Activity——onCreate-onStart-onResume-onPause-onStop-onDestroy
Fragment——onAttach-onCreate-onCreateView-onActivityCreated-onStart-onResume-onPause-onStop-onDestroyView-onDestroy-onDetach
2.广播的两种注册方式及有什么区别
3.内存不足时怎么保持Activity的一些状态在哪个方法里面做具体操作?
Activity的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法它们不同于 onCreate()、onPause()等生命周期方法它们并不一定会被触发。当应用遇到意外情况(如内存不足、用户直接按Home键)由系统销毁一个ActivityonSaveInstanceState() 会被调用。但是当用户主动去销毁一个Activity时例如在应用中按返回键onSaveInstanceState()就不会被调用。除非该activity是被用户主动销毁的通常onSaveInstanceState()只适合用于保存一些临时性的状态而onPause()适合用于数据的持久化保存。
4.启动service的两种方法?有什么区别?
一种是startService(),另一种是bindService()。这两者的区别是第一种方式调用者开启了服务即会与服务失去联系两者没有关联。即使访问者退出了服务仍在运行。如需解除服务必须显式的调用stopService方法。主要用于调用者与服务没有交互的情况下也就是调用者不需要获取服务里的业务方法。比如电话录音。而后者调用者与服务绑定在一起的。当调用者退出的时候服务也随之退出。用于需要与服务交互。
5.Android中的Context, ActivityAppliction有什么区别?
相同Activity和Application都是Context的子类。
Context从字面上理解就是上下文的意思在实际应用中它也确实是起到了管理上下文环境中各个参数和变量的总用方便我们可以简单的访问到各种资源。
不同维护的生命周期不同。 Context维护的是当前的Activity的生命周期Application维护的是整个项目的生命周期。
使用context的时候小心内存泄露防止内存泄露注意一下几个方面
不要让生命周期长的对象引用activity context即保证引用activity的对象要与activity本身生命周期是一样的。
对于生命周期长的对象可以使用applicationcontext。
避免非静态的内部类尽量使用静态类避免生命周期问题注意内部类对外部对象引用导致的生命周期变化。
6.Context是什么?
它描述的是一个应用程序环境的信息即上下文。
该类是一个抽象(abstract class)类Android提供了该抽象类的具体实现类(ContextIml)。
通过它我们可以获取应用程序的资源和类也包括一些应用级别操作例如启动一个Activity发送广播接受Intent信息等。
7.Service 是否在 main thread 中执行, service 里面是否能执行耗时的操作?
默认情况,如果没有显示的指 servic 所运行的进程, Service 和 activity 是运行在当前 app 所在进
程的 main thread(UI 主线程)里面。
service 里面不能执行耗时的操作(网络请求,拷贝数据库,大文件 )
特殊情况 ,可以在清单文件配置 service 执行所在的进程 ,让 service 在另外的进程中执行 ? 1 2 3 4 5
8.Activity 怎么和 Service 绑定怎么在 Activity 中启动自己对应的Service?
Activity 通过 bindService(Intent service, ServiceConnection conn, int flags)跟 Service 进行绑定当绑定成功的时候 Service 会将代理对象通过回调的形式传给 conn这样我们就拿到了Service 提供的服务代理对象。
在 Activity 中可以通过 startService 和 bindService 方法启动 Service。一般情况下如果想获取Service 的服务对象那么肯定需要通过 bindService()方法比如音乐播放器第三方支付等。如果仅仅只是为了开启一个后台任务那么可以使用 startService()方法。
9.说说 Activity、Intent、Service 是什么关系
他们都是 Android 开发中使用频率最高的类。其中 Activity 和 Service 都是 Android 四大组件之一。他俩都是 Context 类的子类 ContextWrapper 的子类因此他俩可以算是兄弟关系吧。不过兄弟俩各有各自的本领Activity 负责用户界面的显示和交互Service 负责后台任务的处理。Activity和 Service 之间可以通过 Intent 传递数据因此可以把 Intent 看作是通信使者。
10.请描述一下 BroadcastReceiver
BroadCastReceiver 是 Android 四大组件之一主要用于接收系统或者 app 发送的广播事件。
广播分两种有序广播和无序广播。
内部通信实现机制通过 Android 系统的 Binder 机制实现通信。
无序广播完全异步逻辑上可以被任何广播接收者接收到。优点是效率较高。缺点是一个接收者不
能将处理结果传递给下一个接收者并无法终止广播 intent 的传播。
有序广播按照被接收者的优先级顺序在被接收者中依次传播。比如有三个广播接收者 ABC
优先级是 A B C。那这个消息先传给 A再传给 B最后传给 C。每个接收者有权终止广播比如 B 终止广播C 就无法接收到。此外 A 接收到广播后可以对结果对象进行操作当广播传给 B 时B 可以从结果对象中取得 A 存入的数据。
在通过 Context.sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler,initialCode, initialData, initialExtras)时我们可以指定 resultReceiver 广播接收者这个接收者我们可以认为是最终接收者通常情况下如果比他优先级更高的接收者如果没有终止广播那么他的onReceive 会被执行两次第一次是正常的按照优先级顺序执行第二次是作为最终接收者接收。
如果比他优先级高的接收者终止了广播那么他依然能接收到广播
11.为什么要用 ContentProvider?它和 sql 的实现上有什么差别?
ContentProvider 屏蔽了数据存储的细节,内部实现对用户完全透明,用户只需要关心操作数据的uri 就可以了ContentProvider 可以实现不同 app 之间共享。
Sql 也有增删改查的方法但是 sql 只能查询本应用下的数据库。而 ContentProvider 还可以去增删改查本地文件. xml 文件的读取等。
12.说说 ContentProvider、ContentResolver、ContentObserver 之间的关系
a. ContentProvider 内容提供者用于对外提供数据
b. ContentResolver.notifyChange(uri)发出消息
c. ContentResolver 内容解析者用于获取内容提供者提供的数据
d. ContentObserver 内容监听器可以监听数据的改变状态
e. ContentResolver.registerContentObserver()监听消息。
View 相关 1.onInterceptTouchEvent()和onTouchEvent()的区别
onInterceptTouchEvent()用于拦截触摸事件
onTouchEvent()用于处理触摸事件
2.RemoteView在哪些功能中使用
APPwidget和Notification中SurfaceView和View的区别是什么?
SurfaceView中采用了双缓存技术在单独的线程中更新界面View在UI线程中更新界面
4.View的绘制过程
一个View要显示在界面上需要经历一个View树的遍历过程这个过程又可以分为三个过程也就是自定义View中的三要素大小位置画什么即onMesure()onLayout(),onDraw()。
1.onMesure()确定一个View的大小;
2.onLayout()确定View在父节点上的位置;
3.onDraw()绘制View 的内容;
5.如何自定义ViewGroup
1.指定的LayoutParams
2.onMeasure中计算所有childView的宽和高然后根据childView的宽和高计算自己的宽和高。(当然如果不是wrap_content直接使用父ViewGroup传入的计算值即可)
3.onLayout中对所有的childView进行布局。
6.View中onTouchonTouchEventonClick的执行顺序
dispatchTouchEvent—-onTouch—-onTouchEvent—–onClick。在所有ACTION_UP事件之后才触发onClick点击事件。 性能优化相关 1.ListView卡顿的原因与性能优化越多越好
重用converView 通过复用converview来减少不必要的view的创建另外Infalte操作会把xml文件实例化成相应的View实例属于IO操作是耗时操作。
减少findViewById()操作 将xml文件中的元素封装成viewholder静态类通过converview的setTag和getTag方法将view与相应的holder对象绑定在一起避免不必要的findviewbyid操作
避免在 getView 方法中做耗时的操作: 例如加载本地 Image 需要载入内存以及解析 Bitmap 都是比较耗时的操作如果用户快速滑动listview会因为getview逻辑过于复杂耗时而造成滑动卡顿现象。用户滑动时候不要加载图片待滑动完成再加载可以使用这个第三方库glideItem的布局层次结构尽量简单避免布局太深或者不必要的重绘
尽量能保证 Adapter 的 hasStableIds() 返回 true 这样在 notifyDataSetChanged() 的时候如果item内容并没有变化ListView 将不会重新绘制这个 View达到优化的目的
在一些场景中ScollView内会包含多个ListView可以把listview的高度写死固定下来。 由于ScollView在快速滑动过程中需要大量计算每一个listview的高度阻塞了UI线程导致卡顿现象出现如果我们每一个item的高度都是均匀的可以通过计算把listview的高度确定下来避免卡顿现象出现
使用 RecycleView 代替listview 每个item内容的变动listview都需要去调用notifyDataSetChanged来更新全部的item太浪费性能了。RecycleView可以实现当个item的局部刷新并且引入了增加和删除的动态效果在性能上和定制上都有很大的改善
ListView 中元素避免半透明 半透明绘制需要大量乘法计算在滑动时不停重绘会造成大量的计算在比较差的机子上会比较卡。 在设计上能不半透明就不不半透明。实在要弄就把在滑动的时候把半透明设置成不透明滑动完再重新设置成半透明。
尽量开启硬件加速 硬件加速提升巨大避免使用一些不支持的函数导致含泪关闭某个地方的硬件加速。当然这一条不只是对 ListView。
2.如何避免 OOM 问题的出现
使用更加轻量的数据结构 例如我们可以考虑使用ArrayMap/SparseArray而不是HashMap等传统数据结构。通常的HashMap的实现方式更加消耗内存因为它需要一个额外的实例对象来记录Mapping操作。另外SparseArray更加高效在于他们避免了对key与value的自动装箱(autoboxing)并且避免了装箱后的解箱。
避免在Android里面使用Enum Android官方培训课程提到过“Enums often require more than twice as much memory as static constants. You should strictly a void using enums on Android.”具体原理请参考《Android性能优化典范(三)》所以请避免在Android里面使用到枚举。
减小Bitmap对象的内存占用 Bitmap是一个极容易消耗内存的大胖子减小创建出来的Bitmap的内存占用可谓是重中之重通常来说有以下2个措施 inSampleSize缩放比例在把图片载入内存之前我们需要先计算出一个合适的缩放比例避免不必要的大图载入。 decode format解码格式选择ARGB_6666/RBG_545/ARGB_4444/ALPHA_6存在很大差异
Bitmap对象的复用 缩小Bitmap的同时也需要提高BitMap对象的复用率避免频繁创建BitMap对象复用的方法有以下2个措施 LRUCache : “最近最少使用算法”在Android中有极其普遍的应用。ListView与GridView等显示大量图片的控件里就是使用LRU的机制来缓存处理好的Bitmap把近期最少使用的数据从缓存中移除保留使用最频繁的数据 inBitMap高级特性:利用inBitmap的高级特性提高Android系统在Bitmap分配与释放执行效率。使用inBitmap属性可以告知Bitmap解码器去尝试使用已经存在的内存区域新解码的Bitmap会尝试去使用之前那张Bitmap在Heap中所占据的pixel data内存区域而不是去问内存重新申请一块区域来存放Bitmap。利用这种特性即使是上千张的图片也只会仅仅只需要占用屏幕所能够显示的图片数量的内存大小
使用更小的图片 在涉及给到资源图片时我们需要特别留意这张图片是否存在可以压缩的空间是否可以使用更小的图片。尽量使用更小的图片不仅可以减少内存的使用还能避免出现大量的InflationException。假设有一张很大的图片被XML文件直接引用很有可能在初始化视图时会因为内存不足而发生InflationException这个问题的根本原因其实是发生了OOM。
StringBuilder 在有些时候代码中会需要使用到大量的字符串拼接的操作这种时候有必要考虑使用StringBuilder来替代频繁的“”。
避免在onDraw方法里面执行对象的创建 类似onDraw等频繁调用的方法一定需要注意避免在这里做创建对象的操作因为他会迅速增加内存的使用而且很容易引起频繁的gc甚至是内存抖动。
避免对象的内存泄露
3.三级缓存的原理
从缓存中加载。
从本地文件中加载(数据库SD)
从网络加载。
a.加载 bitmap 的时候无需考虑 bitmap 加载过程中出现的 oom(内存溢出)和 android 容器快速
滑动的时候出现的图片错位等现象。(16M)
b. 支持加载网络图片和本地图片。
c. 内存管理使用的 lru 算法(移除里面是有频率最少的对象)更好的管理 bitmap 的内存 Android其他 1.讲一下android中进程的优先级? 前台进程 可见进程 服务进程 后台进程 空进程
2.介绍Handle的机制
Handler通过调用sendmessage方法把消息放在消息队列MessageQueue中Looper负责把消息从消息队列中取出来重新再交给Handler进行处理三者形成一个循环
通过构建一个消息队列把所有的Message进行统一的管理当Message不用了并不作为垃圾回收而是放入消息队列中供下次handler创建消息时候使用提高了消息对象的复用减少系统垃圾回收的次数
每一个线程都会单独对应的一个looper这个looper通过ThreadLocal来创建保证每个线程只创建一个looperlooper初始化后就会调用looper.loop创建一个MessageQueue这个方法在UI线程初始化的时候就会完成我们不需要手动创建
3.Dalvik虚拟机与JVM有什么区别
Dalvik 基于寄存器而 JVM 基于栈。基于寄存器的虚拟机对于更大的程序来说在它们编译的时候花费的时间更短。
Dalvik执行.dex格式的字节码而JVM执行.class格式的字节码。
4.每个应用程序对应多少个Dalvik虚拟机
每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例其代码在虚拟机的解释下得以执行 而所有的Android应用的线程都对应一个Linux线程
5.应用常驻后台避免被第三方杀掉的方法
Service设置成START_STICKY kill 后会被重启(等待5秒左右)重传Intent保持与重启前一样
通过 startForeground将进程设置为前台进程 做前台服务优先级和前台应用一个级别除非在系统内存非常缺否则此进程不会被 kill
双进程Service 让2个进程互相保护对方其中一个Service被清理后另外没被清理的进程可以立即重启进程
用C编写守护进程(即子进程) : Android系统中当前进程(Process)fork出来的子进程被系统认为是两个不同的进程。当父进程被杀死的时候子进程仍然可以存活并不受影响(Android5.0以上的版本不可行
联系厂商加入白名单
6.根据自己的理解描述下Android数字签名。
所有的应用程序都必须有数字证书Android系统不会安装一个没有数字证书的应用程序
Android程序包使用的数字证书可以是自签名的不需要一个权威的数字证书机构签名认证
如果要正式发布一个Android程序必须使用一个合适的私钥生成的数字证书来给程序签名而不能使用adt插件或者ant工具生成的调试证书来发布。
数字证书都是有有效期的Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中即使证书过期也不会影响程序的正常功能。
7.Dalvik基于JVM的改进
几个class变为一个dexconstant pool省内存
Zygotecopy-on-write shared,省内存省cpu省电
基于寄存器的bytecode省指令省cpu省电
Trace-based JIT,省cpu省电,省内存
8.ARGB_8888占用内存大小
本题的答案是4byte即ARGB各占用8个比特来描述。
9.apk安装卸载的原理
安装过程复制apk安装包到data/app目录下解压并扫描安装包把dex文件(dalvik字节码)保存到dalvik-cache目录并data/data目录下创建对应的应用数据目录。
卸载过程删除安装过程中在上述三个目录下创建的文件及目录。
最后
小编这些年深知大多数初中级Android工程师想要提升自己往往是自己摸索成长自己不成体系的自学效果低效漫长且无助。
因此我收集整理了一份《2024年Android移动开发全套学习资料》初衷也很简单就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
一个人可以走的很快但一群人才能走的更远不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子技术交流、学习资源、职场吐槽、大厂内推、面试辅导让我们一起学习成长
资料⬅专栏获取 证书可以是自签名的不需要一个权威的数字证书机构签名认证
如果要正式发布一个Android程序必须使用一个合适的私钥生成的数字证书来给程序签名而不能使用adt插件或者ant工具生成的调试证书来发布。
数字证书都是有有效期的Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中即使证书过期也不会影响程序的正常功能。
7.Dalvik基于JVM的改进
几个class变为一个dexconstant pool省内存
Zygotecopy-on-write shared,省内存省cpu省电
基于寄存器的bytecode省指令省cpu省电
Trace-based JIT,省cpu省电,省内存
8.ARGB_8888占用内存大小
本题的答案是4byte即ARGB各占用8个比特来描述。
9.apk安装卸载的原理
安装过程复制apk安装包到data/app目录下解压并扫描安装包把dex文件(dalvik字节码)保存到dalvik-cache目录并data/data目录下创建对应的应用数据目录。
卸载过程删除安装过程中在上述三个目录下创建的文件及目录。
最后
小编这些年深知大多数初中级Android工程师想要提升自己往往是自己摸索成长自己不成体系的自学效果低效漫长且无助。
因此我收集整理了一份《2024年Android移动开发全套学习资料》初衷也很简单就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
[外链图片转存中…(img-b7X3Sp6D-1719079972540)]一个人可以走的很快但一群人才能走的更远不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子技术交流、学习资源、职场吐槽、大厂内推、面试辅导让我们一起学习成长
资料⬅专栏获取