Android 数据存储方式分为哪几种?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 数据存储方式分为哪几种?相关的知识,希望对你有一定的参考价值。

  10道题值得思考
  
  第一道题
  
  1、android 数据存储方式分为哪几种?
  
  SharedPreferences存储数据
  
  2. CotentProvider内容提供者
  
  3. 文件存储
  
  4. 数据库存储(Sqlite)
  
  5.网络存储
  
  2. NDK是什么? 1. 一系列工具类的集合 2. Arm指令集 3. NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。 NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。 NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。
  
  3.Android线程间的网络通信有哪些?
  
  共享内存(变量);文件,数据库;Handler;Java 里的 wait(),notify(),notifyAll()
  
  4、Android横竖屏生命周期切换?
  
  横竖屏切换生命周期
  
  1、启动程序进入Activity界面
  
  这里写图片描述
  
  onCreate(初始化)–>OnStart(启动)–>OnResume(恢复)
  
  2、旋转切换屏幕
  
  这里写图片描述
  
  onPause(暂停)–>OnSaveInstanceState(保存当前状态)–>http://yszx11.cn/ OnStop(停止)–>OnDestory(销毁)–>onCreate(初始化)–>OnStart(启动)–>OnRestoreInstanceState(再次保存状态)–>OnResume(恢复)
  
  3.Android横竖屏切换在手机开发中比较常见,很多软件在开发过程中为了避免横竖屏切换时引发不必要的麻烦,通常禁止掉横竖屏的切换。
  
  一、在AndroidManifest.xml中设置activity中的android:screenOrientation属性值来实现。
  
  (1)竖屏:android:screenOrientation=”portrait”
  
  (2)横屏:android:screenOrientation=”landscape”
  
  二、在Java代码中通过类似如下代码来设置 (不推荐这种方法,在大的app不同方向启动时会慢)
  
  (1)竖屏: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
  
  (2)横屏:setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
  
  三、如果要彻底禁止翻转,忽略重力感应带来的切换,(模拟器上不管用,在真机上是正确的)
  
  (1)忽略重力:android:screenOrientation=”nosensor”
  
  横竖屏辨识
  
  一、在onConfigurationChanged里判断,为了onConfigurationChanged在监听屏幕方向变化有效需要以下条件
  
  (1)AndroidManifest.xml增加权限:<uses-permission android:name="android.permission.CHANGE_CONFIGURATION"></uses-permission>
  
  (2)AndroidManifest.xml里设置的MiniSdkVersion和 http://www.hsl85.cn/ TargetSdkVersion属性大于等于13
  
  (3)在AndroidManifest.xml的Activity里增加:android:configChanges="keyboard|screenSize|orientation|layoutDirection"
  
  (4)在onConfigurationChanged(Configuration newConfig)进行判断
  
  @Override
  
  public void onConfigurationChanged(Configuration newConfig) {
  
  super.onConfigurationChanged(newConfig);
  
  if(newConfig.orientation == 1)//竖屏
  
  if(newConfig.orientation == 2)// 横屏
  
  二、因为当屏幕变为横屏的时候,系统会重调用Activity的onCreate方法可以在onCreate中来检查当前的方向,然后可以让你的setContentView来载入不同的layout xml。
  
  if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
  
  Log.i("info","landscape"); // 横屏
  
  } else if(this.getResources().getConfiguration().orientation ==Configuration.ORIENTATION_PORTRAIT) {
  
  Log.i("info","portrait"); // 竖屏
  
  注意:该方法是在AndroidManifest.xml中不设置onConfigurationChanged才能重走生命周期
  
  5、页面上现有ProgressBar控件progressBar,请用书写线程以10秒的的时间完成其进度显示工作。
  
  //得到progeressBar的最大长度
  
  int progressBarMax = progressBar.getMax();
  
  try {
  
  //progressBar当前的长度没有达到他的最长度,让循环一直进行
  
  while (progressBarMax != progressBar.getProgress (http://www.hbwfjx.cn/)) {
  
  //拿到一个每次前进的进度值,因为是要10s完成,所以分为10份
  
  int stepProgress = progressBarMax / 10;
  
  //progressBar当前的进度值
  
  int currentProgress = progressBar.getProgress();
  
  //让progressBar进度为每次前进最大值的十分之一
  
  progressBar.setProgress(currentProgress + stepProgress);
  
  //前进一次,睡眠一秒
  
  Thread.sleep(1000);
  
  }
  
  } catch (Exception e) {
  
  e.printStackTrace();
  
  6、Android如何避免OOM?
  
  1)使用更加轻量的数据结构
  
  例如,我们可以考虑使用ArrayMap/SparseArray而不是HashMap等传统数据结构,下图演示了HashMap的简要工作原理,相比起Android系统专门为移动操作系统编写的ArrayMap容器,在大多数情况下,都显示效率低下,更占内存。通常的HashMap的实现方式更加消耗内存,因为它需要一个额外的实例对象来记录Mapping操作。另外,SparseArray更加高效在于他们避免了对key与value的autobox自动装箱,并且避免了装箱后的解箱。
  
  2)避免在Android里面使用Enum
  
  3)减小Bitmap对象的内存占用
  
  Bitmap是一个极容易消耗内存的大胖子,减小创建出来的Bitmap的内存占用是很重要的,通常来说有下面2个措施:
  
  inSampleSize:缩放比例,在把图片载入内存之前,我们需要先计算出一个合适的缩放比例,避免不必要的大图载入。
  
  decode format:解码格式,选择ARGB_8888/RGB_565/ARGB_4444/ http://www.baqist.cn/ ALPHA_8,存在很大差异。
  
  4)使用更小的图片
  
  在设计给到资源图片的时候,我们需要特别留意这张图片是否存在可以压缩的空间,是否可以使用一张更小的图片。尽量使用更小的图片不仅仅可以减少内存的使用,还可以避免出现大量的InflationException。假设有一张很大的图片被XML文件直接引用,很有可能在初始化视图的时候就会因为内存不足而发生InflationException,这个问题的根本原因其实是发生了OOM。
  
  在Android上面最常用的一个缓存算法是LRU(Least Recently Use)
  
  5)复用系统自带的资源
  
  Android系统本身内置了很多的资源,例如字符串/颜色/图片/动画/样式以及简单布局等等,这些资源都可以在应用程序中直接引用。这样做不仅仅可以减少应用程序的自身负重,减小APK的大小,另外还可以一定程度上减少内存的开销,复用性更好。但是也有必要留意Android系统的版本差异性,对那些不同系统版本上表现存在很大差异,不符合需求的情况,还是需要应用程序自身内置进去。
  
  6)注意在ListView/GridView等出现大量重复子组件的视图里面对ConvertView的复用
  
  7)Bitmap对象的复用
  
  在ListView与GridView等显示大量图片的控件里面需要使用LRU的机制来缓存处理好的Bitmap。
  
  利用inBitmap的高级特性提高Android系统在Bitmap分配与释放执行效率上的提升(3.0以及4.4以后存在一些使用限制上的差异)。使用inBitmap属性可以告知Bitmap解码器去尝试使用已经存在的内存区域,新解码的bitmap会尝试去使用之前那张bitmap在heap中所占据的pixel data内存区域,而不是去问内存重新申请一块区域来存放bitmap。利用这种特性,即使是上千张的图片,也只会仅仅只需要占用屏幕所能够显示的图片数量的内存大小。
  
  8)避免在onDraw方法里面执行对象的创建
  
  类似onDraw等频繁调用的方法,一定需要注意避免在这里做创建对象的操作,因为他会迅速增加内存的使用,而且很容易引起频繁的gc,甚至是内存抖动。
  
  9)StringBuilder
  
  在有些时候,代码中会需要使用到大量的字符串拼接的操作,这种时候有必要考虑使用StringBuilder来替代频繁的“+”。
  
  避免对象的内存泄露
  
  内存对象的泄漏,会导致一些不再使用的对象无法及时释放,这样一方面占用了宝贵的内存空间,很容易导致后续需要分配内存的时候,空闲空间不足而出现OOM。显然,这还使得每级Generation的内存区域可用空间变小,gc就会更容易被触发,容易出现内存抖动,从而引起性能问题。
  
  10)注意Activity的泄漏
  
  通常来说,Activity的泄漏是内存泄漏里面最严重的问题,它占用的内存多,影响面广,我们需要特别注意以下两种情况导致的Activity泄漏:
  
  内部类引用导致Activity的泄漏
  
  最典型的场景是Handler导致的Activity泄漏,如果Handler中有延迟的任务或者是等待执行的任务队列过长,都有可能因为Handler继续执行而导致Activity发生泄漏。此时的引用关系链是Looper -> MessageQueue -> Message -http://www.7881188.cn/ > Handler -> Activity。为了解决这个问题,可以在UI退出之前,执行remove Handler消息队列中的消息与runnable对象。或者是使用Static + WeakReference的方式来达到断开Handler与Activity之间存在引用关系的目的。
  
  Activity Context被传递到其他实例中,这可能导致自身被引用而发生泄漏。
  
  内部类引起的泄漏不仅仅会发生在Activity上,其他任何内部类出现的地方,都需要特别留意!我们可以考虑尽量使用static类型的内部类,同时使用WeakReference的机制来避免因为互相引用而出现的泄露。
  
  11)考虑使用Application Context而不是Activity Context
  
  对于大部分非必须使用Activity Context的情况(Dialog的Context就必须是Activity Context),我们都可以考虑使用Application Context而不是Activity的Context,这样可以避免不经意的Activity泄露。
  
  12)注意临时Bitmap对象的及时回收
  
  虽然在大多数情况下,我们会对Bitmap增加缓存机制,但是在某些时候,部分Bitmap是需要及时回收的。例如临时创建的某个相对比较大的bitmap对象,在经过变换得到新的bitmap对象之后,应该尽快回收原始的bitmap,这样能够更快释放原始bitmap所占用的空间。
  
  需要特别留意的是Bitmap类里面提供的createBitmap()方法:
  
  这个函数返回的bitmap有可能和source bitmap是同一个,在回收的时候,需要特别检查source bitmap与return bitmap的引用是否相同,只有在不等的情况下,才能够执行source bitmap的recycle方法。
  
  13)注意WebView的泄漏
  
  Android中的WebView存在很大的兼容性问题,不仅仅是Android系统版本的不同对WebView产生很大的差异,另外不同的厂商出货的ROM里面WebView也存在着很大的差异。更严重的是标准的WebView存在内存泄露的问题,看这里WebView causes memory leak - leaks the parent Activity。所以通常根治这个问题的办法是为WebView开启另外一个进程,通过AIDL与主进程进行通信,WebView所在的进程可以根据业务的需要选择合适的时机进行销毁,从而达到内存的完整释放。
  
  14)资源文件需要选择合适的文件夹进行存放
  
  我们知道hdpi/xhdpi/xxhdpi等等不同dpi的文件夹下的图片在不同的设备上会经过scale的处理。例如我们只在hdpi的目录下放置了一张100100的图片,那么根据换算关系,xxhdpi的手机去引用那张图片就会被拉伸到200200。需要注意到在这种情况下,内存占用是会显著提高的。对于不希望被拉伸的图片,需要放到assets或者nodpi的目录下。
  
  15)谨慎使用static对象
  
  因为static的生命周期过长,和应用的进程保持一致,使用不当很可能导致对象泄漏,在Android中应该谨慎使用static对象。
  
  16)特别留意单例对象中不合理的持有
  
  虽然单例模式简单实用,提供了很多便利性,但是因为单例的生命周期和应用保持一致,使用不合理很容易出现持有对象的泄漏。
  
  17)珍惜Services资源
  
  18)优化布局层次,减少内存消耗
  
  越扁平化的视图布局,占用的内存就越少,效率越高。我们需要尽量保证布局足够扁平化,当使用系统提供的View无法实现足够扁平的时候考虑使用自定义View来达到目的。
  
  19)谨慎使用“抽象”编程
  
  很多时候,开发者会使用抽象类作为”好的编程实践”,因为抽象能够提升代码的灵活性与可维护性。然而,抽象会导致一个显著的额外内存开销:他们需要同等量的代码用于可执行,那些代码会被mapping到内存中,因此如果你的抽象没有显著的提升效率,应该尽量避免他们。
  
  20)谨慎使用多进程
  
  使用多进程可以把应用中的部分组件运行在单独的进程当中,这样可以扩大应用的内存占用范围,但是这个技术必须谨慎使用,绝大多数应用都不应该贸然使用多进程,一方面是因为使用多进程会使得代码逻辑更加复杂,另外如果使用不当,它可能反而会导致显著增加内存。当你的应用需要运行一个常驻后台的任务,而且这个任务并不轻量,可以考虑使用这个技术。
  
  7、Android UI如何刷新View?
  
  第一,利用子线程发消息刷新UI。
  
  第二,利用异步任务更新UI
  
  第三,利用配置文件+activity的生命周期方法刷新UI。
  
  8、面试题有四棵树如何让相邻的书两个之间的距离保持相等(腾讯面试题)
  
  正三菱锥
  
  扔一个坑里
  
  平面解决不了的问题换种思维空间?
  
  9、动画的分类?
  
  动画分类
  
  View动画、帧动画、属性动画
  
  View动画包括:平移、旋转、缩放、透明度,View动画是一种渐近式动画
  
  帧动画:图片切换动画
  
  属性动画:通过动态改变对象的属性达到动画效果
  
  View动画
  
  继承自Animation,四个动画效果实现类:TranslateAnimation、ScaleAnimation、RotateAnimation、AlphaAnimation
  
  10、自定义View?
  
  这里写图片描述
  
  1 2 3表示随机颜色值 90%表示进度条 上面是个五边形 如何实现一直连续的改变颜色值并不断更新进度?





































































































































































































































































以上是关于Android 数据存储方式分为哪几种?的主要内容,如果未能解决你的问题,请参考以下文章

java语言的所有数据类型分为哪几种?

数据存储形式有哪几种?

常用的存储表示方法有哪几种,并简述其原理

有哪几种表的实现方式——4

JS有哪几种传参方式

数据的存储方法都有哪些