Java+Android 基础

Java中Map,List与Set的区别

数组是大小固定的,集合可以存储和操作数目不固定的一组数据,集合只能存放引用类型的的数据,不能存放基本数据类型

list:可以自动扩展

set:没有重复

TreeSet,TreeList,Tree**:自动排序
参考:
http://blog.csdn.net/speedme/article/details/22398395

Synchronized与volatile区别

  • volatile只能修饰变量,而synchronized可以修改变量,方法以及代码块**
  • volatile在多线程中不会存在阻塞问题,synchronized会存在阻塞问题
  • volatile能保证数据的可见性,但不能完全保证数据的原子性,synchronized即保证了数据的可见性也保证了原子性
  • volatile解决的是变量在多个线程之间的可见性,而sychroized解决的是多个线程之间访问资源的同步性

参考:
http://www.cnblogs.com/MOBIN/p/5407965.html?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io

使用新版Android Studio检测内存泄露和性能

参考:
http://blog.csdn.net/yangxi_pekin/article/details/51860998

Android内存管理机制

每开一个应用就会打开一个独立的虚拟机

Android进程种类:

  • 前台进程(foreground)
  • 目前正在屏幕上显示的进程和一些系统进程
  • 可见进程(visible)
  • 不在前台,但用户依然可见的进程
  • 桌面进程(home app)即launcher
  • 次要服务(secondary server)
  • 后台进程(hidden)
  • 内容供应节点(content provider)
  • 空进程(empty)

执行条件:
剩余内存小于应用定义的APP_MEM值,开始查看adj值列表,kill相应程序

内存管理机制:

  • 内存共享
    每一个app的process都是从同一个被叫做Zygote的进程中fork出来的,大多数的RAM pages被用来分配给framework的代码与资源,并在应用的所有进程中进行共享
  • 分配与回收内存
    (1) 每一个进程的Dalvik heap都有一个限制的虚拟内存范围
    (2) 逻辑上讲的heap size和实际物理上使用的内存数量是不等的
    (3) Dalvik heap与逻辑上的heap size不吻合,这意味着Android并不会去做heap中的碎片整理用来关闭空闲区域
  • 限制应用的内存
    Android为每一个app都设置了一个硬性的heap size限制,如果你的app已经到了heap的限制大小并且再尝试分配内存的话,会引起OutOfMemoryError的错误
    通过getMemoryClass()来查询 heap size
  • 切换应用
    Android并不会在用户切换不同应用时候做交换内存的操作。Android会把那些不包含foreground组件的进程放到LRU cache中
    当系统开始进入低内存状态时,它会由系统根据LRU的规则与其他因素选择杀掉某些进程

参考:
http://blog.csdn.net/chaihuasong/article/details/8289367
http://blog.csdn.net/double2hao/article/details/51067834

Android中进程管理机制

Android并不会在用户切换不同应用时候做交换内存的操作。Android会把那些不包含foreground组件的进程放到LRU cache中。
当系统开始进入低内存状态时,它会由系统根据LRU的规则与其他因素选择杀掉某些进程。

如何进行进程管理?

  • ActivityManager.getRunningAppProcesses方法,就可以获取到正在运行的进程列表.
  • 遍历整个进程列表,我们可以获取进程的信息RunningAppProcessInfo info,我们可以直接通过进程信息对象的成员变量获取其中的信息,代码如下:
    info.processName //当前进程的应用包名
    info.pid //进程id号
  • 通过进程的id号,我们就可以获取进程的内存占用等信息,当然我们需要一个PackageManager对象,代码如下:
PackageManager pm = ctx.getPackageManager();
int[] pids = new int[]{info.pid};
//根据进程id获取memInfo,传递几个id就会给几个memoryInfo
MemoryInfo[] memInfo = am.getProcessMemoryInfo(pids );
memInfo[0].getTotalPrivateDirty();//获取当前进程"弄脏的"占用的内存数,该方法返回的内存大小是以KB为单位的
  • 通过包管理器和相应的包名我们又可以获取到应用程序的信息,代码如下:
Drawable icon = pm.getApplicationIcon(packageName);//获取当前进程的Icon
ApplicationInfo appInfo = pm.getApplicationInfo(packageName, 0);
String appName = appInfo.loadLabel(pm).toString();//进程名称
if((appInfo.flags & ApplicationInfo.FLAG_SYSTEM)!=0){//通过应用的flags值与系统flag按位相与可以知道当前应用是否为系统应用
taskInfo.setSysProc(true);//系统进程
}else{
taskInfo.setSysProc(false);//用户进程
}

通过判断应用程序是否是系统应用,来判断当前进程是否为系统进程

  • 当然这其中会有一些小问题,由于某些进程应用是使用C语言写的,我们无法获取到应用的图标,也无法获取到当前应用的应用名称,我们只能使用包名代替应用名称,而图标我们自己定义一个特定的图标即可.处理代码如下:
taskInfo.setIcon(ctx.getResources().getDrawable(R.drawable.ic_launcher));
taskInfo.setAppName(packageName);
taskInfo.setSysProc(true);//我们一般将C语言程序定义为系统程序
  • 如何清理进程
    只需要使用ActivityManager的杀死后台进程的方法即可,代码如下:
am.killBackgroundProcesses(taskInfo.getPackageName());

该方法只能清理掉后台进程,前台前台进程/可见进程/系统进程是无法清理的,但是为了用户能有一个更好的体验,我们不得不将用户点击的所有进程全部”清理掉”(从显示列表中移除)
当然我们还可以完成锁屏自动清理,这时我们就需要开启服务,并在服务中注册一个屏幕锁定的广播接收者,当收到锁屏广播时清理进程.
隐藏系统进程也是一个不错的方法,实现起来也更为方便,只需要在显示的ListView的Adapter的getCount方法中返回用户进程的数量就可以了.
参考:
http://blog.csdn.net/qq_25804863/article/details/48565619

Java的接口和抽象类

继承是"是不是"的关系,而接口是“有没有”的关系

  • 抽象类和普通类的区别
    (1) 抽象类不能实例化
    (2) 抽象类只能用 public 或 protected 来修饰
    (3) 抽象类被子类继承后,子类必须实现其所有的抽象方法,如果没有实现父类的抽象方法,则子类得定义为抽象类。
  • 抽象类和接口的区别
    语法上抽象类和接口的区别:
    (1) 抽象类中可以有方法的实现,也可以有方法的定义,但接口中只能有方法的定义
    (2) 抽象类,单继承,接口,多实现
    (3) 接口中不能出现静态方法和静态代码块,抽象类中可以(不能有静态的抽象方法:因为静态属于字节码,不需要对象就可以运行;而抽象方法没有方法体,运行没有意义,所以不能共存。)
    设计上接口与抽象类的区别:
    抽象类是对事物本身的抽象,接口是对事物行为的抽象

参考:
http://www.jianshu.com/p/205e4020f59d

Handler的优化

  • 通过程序逻辑来进行保护
    (1) 在关闭Activity的时候停掉你的后台线程。
    (2) removeCallbacksAndMessages
  • 将Handler声明为静态类
    静态类+弱引用

参考:
http://colobu.com/2015/01/04/How-to-Leak-a-Context-Handlers-Inner-Classes/
https://my.oschina.net/rengwuxian/blog/181449

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容