android+抛弃java_Java+Android 基础

Java中Map,List与Set的区别

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

list:可以自动扩展

set:没有重复

Synchronized与volatile区别

volatile只能修饰变量,而synchronized可以修改变量,方法以及代码块**

volatile在多线程中不会存在阻塞问题,synchronized会存在阻塞问题

volatile能保证数据的可见性,但不能完全保证数据的原子性,synchronized即保证了数据的可见性也保证了原子性

volatile解决的是变量在多个线程之间的可见性,而sychroized解决的是多个线程之间访问资源的同步性

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

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的规则与其他因素选择杀掉某些进程

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) 接口中不能出现静态方法和静态代码块,抽象类中可以(不能有静态的抽象方法:因为静态属于字节码,不需要对象就可以运行;而抽象方法没有方法体,运行没有意义,所以不能共存。)

设计上接口与抽象类的区别:

抽象类是对事物本身的抽象,接口是对事物行为的抽象

Handler的优化

通过程序逻辑来进行保护

(1) 在关闭Activity的时候停掉你的后台线程。

(2) removeCallbacksAndMessages

将Handler声明为静态类

静态类+弱引用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值