1.AndroidManifest.xml文件中以下这些属性的含义是什么?
android:excludeFromRecents=“true” Activtiy是否能显示在最近打开的Activity中
android:screenOrientation=" portrait " activity显示的模式, “unspecified” 默认值 “landscape” 风景画模式,宽度比高度大一些 “portrait” 肖像模式, 高度比宽度大。
android:configChanges=“orientation|keyboardHidden|navigation”
2.简述activity中以下方法的作用
onSaveInstanceState():当某个activity变得“容易”被系统销毁时,该activity的onSaveInstanceState就会被执行,除非该activity是被用户主动销毁的,例如当用户按BACK键的时候。
onRestoreInstanceState():至于onRestoreInstanceState方法,需要注意的是,onSaveInstanceState方法和onRestoreInstanceState方法“不一定”是成对的被调用的,onRestoreInstanceState被调用的前提是,activity A“确实”被系统销毁了,而如果仅仅是停留在有这种可能性的情况下,则该方法不会被调用,例如,当正在显示activity A的时候,用户按下HOME键回到主界面,然后用户紧接着又返回到activity A,这种情况下activity A一般不会因为内存的原因被系统销毁,故activity A的onRestoreInstanceState方法不会被执行。
onRetainNonConfigurationInstance():当Device configuration发生改变时,将伴随Destroying被系统调用。通过这个方法可以像onSaveInstanceState()的方法一样保留变化前的Activity State,最大的不同在于这个方法可以返回一个包含有状态信息的Object,其中甚至可以包含Activity Instance本身。新创建的Activity可以继承大量来至于Parent Activity State信息。
用这个方法保存Activity State后,通过getLastNonConfigurationInstance()在新的Activity Instance中恢复原有状态。
这个方法最大的好处是:
- 当Activity曾经通过某个网络资源得到一些图片或者视频信息,那么当再次恢复后,无需重新通过原始资源地址获取,可以快速的加载整个Activity状态信息。
- 当Activity包含有许多线程时,在变化后依然可以持有原有线程,无需通过重新创建进程恢复原有状态。
- 当Activity包含某些Connection Instance时,同样可以在整个变化过程中保持连接状态。
Android开发中ANR问题出现及解决
写在前面:Application Not Responding。在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application Not Responding)对话框。用户可以选择“等待”而让程序继续运行,也可以选择“强制关闭”。所以一个流畅的合理的应用程序中不能出现anr,而让用户每次都要处理这个对话框。因此,在程序里对响应性能的设计很重要,这样系统不会显示ANR给用户。默认情况下,在android中Activity的最长执行时间是5秒,BroadcastReceiver的最长执行时间则是10秒。
第一:什么会引发ANR?
在Android里,应用程序的响应性是由Activity Manager和WindowManager系统服务监视的 。当它监测到以下情况中的一个时,Android就会针对特定的应用程序显示ANR:
1.在5秒内没有响应输入的事件(例如,按键按下,屏幕触摸)
2.BroadcastReceiver在10秒内没有执行完毕
造成以上两点的原因有很多,比如在主线程中做了非常耗时的操作,比如说是下载,io异常等。
第二:如何避免ANR?
1、运行在主线程里的任何方法都尽可能少做事情。特别是,Activity应该在它的关键生命周期方法(如onCreate()和onResume())里尽可能少的去做创建操作。(可以采用重新开启子线程的方式,然后使用Handler+Message的方式做一些操作,比如更新主线程中的ui等)
2、应用程序应该避免在BroadcastReceiver里做耗时的操作或计算。但不再是在子 线程里做这些任务(因为 BroadcastReceiver的生命周期短),替代的是,如果响应Intent广播需要执行一个耗时的动作的话,应用程序应该启动一个 Service。(此处需要注意的是可以在广播接受者中启动Service,但是却不可以在Service中启动broadcasereciver,关于原因后续会有介绍,此处不是本文重点)
3、避免在Intent Receiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。如果你的应用程序在响应Intent广 播时需要向用户展示什么,你应该使用Notification Manager来实现。
总结:anr异常也是在程序中自己经常遇到的问题,主要的解决办法自己最常用的就是不要在主线程中做耗时的操作,而应放在子线程中来实现,比如采用Handler+mesage的方式,或者是有时候需要做一些和网络相互交互的耗时操作就采用asyntask异步任务的方式(它的底层其实Handler+mesage有所区别的是它是线程池)等,在主线程中更新UI。
andorid 我们如何管理你的内存?
tank前面做项目时遇到了一个错误:java.lang.OutOfMemoryError
我当时就没有花很多时间去处理内存这个问题。当时就以自己JAVA编程时的习惯以为像PC编程一样,自顾的一顿敲下去。
因为前面我也有做嵌入式方面的开发,当时是基于纯C的嵌入式开发,在程序开发时格外的小心指针和内存的分配,一不小心就会造成把机子内存泄露最后导致死机。
因为JAVA里没有指针,也不能像C里一样Malloc和free,JAVA是自己管理内存的分配和释放所以我一开始也不把内存放在心上,直致java.lang.OutOfMemoryError。
尤其在处理大量图像和做游戏开发时会经常碰到这类问题,所以要额外注意了。
以下我总结和归纳了下内存方面的东东,希望大家一起交流进步,有误之处请大家指正和完善。
如何优化内存管理:
1.在循环内尽量不要使用局部变量。
2.不用的对象可以把它指向NULL,并注意自己的代码质量。
3.显示让系统GC回收
if(bitmapObject.isRecycled()==false) //如果没有回收
bitmapObject.recycle(); //http://www.cnblogs.com/tankaixiong/
4.对大型图片进行缩放有,处理图片时我们经常会用到BitmapFactory类,android系统中读取位图Bitmap时分给虚拟机中图片的堆栈大小只有8M。
用BitmapFactory解码一张图片时,有时也会遇到该错误。这往往是由于图片过大造成的。这时我们需要分配更少的内存空间来存储。
BitmapFactory.Options.inSampleSize设置恰当的inSampleSize可以使BitmapFactory分配更少的空间以消除该错误。inSampleSize的具体含义请参考SDK文档。Android提供了一种动态计算的
方法,可以去查看源码,这里不多讲。
例如:
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inSampleSize = 4 ;
Bitmap bitmap = BitmapFactory.decodeFile(imageFile, opts);
5.Dalvik.VMRuntime类,提供对虚拟机全局,Dalvik的特定功能的接口。
Android为每个程序分配的对内存可以通过Runtime类的 totalMemory() freeMemory() 两个方法获取VM的一些内存信息,对于系统heap内存获取,可以通过Dalvik.VMRuntime类的
getMinimumHeapSize() 方法获取最小可用堆内存,同时显示释放软引用可以调用该类的gcSoftReferences() 方法,收集可用内存。
我们还可以强制定义自己软件的对内存大小,我们使用Dalvik提供的 dalvik.system.VMRuntime类来设置最小堆内存为例:
private final static int CWJ_HEAP_SIZE = 6* 1024* 1024 ;
VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE); //设置最小heap内存为6MB大小。当然对于内存吃紧来说还可以通过手动干涉GC去处理,我们将在下次提到具体应用。
使用 dalvik.system.VMRuntime类提供的setTargetHeapUtilization方法可以增强程序堆内存的处理效率。当然具体原理我们可以参考开源工程,
这里我们仅说下使用方法:
private final static float TARGET_HEAP_UTILIZATION = 0.75f;
在程序onCreate时就可以调用 VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION); 即可。
6.缓存,适量使用缓存,不要过量使用,因为内存有限,能保存路径地址的就不要存放图片数据,不经常使用的尽量不要缓存,不用时就清空。
7.尽量使用Android 自己一套的机制,因为android是基于Dalvik而非JVM。
InputStream is = null;
try {
is = new FileInputStream(new File(picstr));
} catch (FileNotFoundException e) {
// http://www.cnblogs.com/tankaixiong/
// }
下面这个方法肯定优于上面这个方法。
Resources re = mContext.getResources();
InputStream is = re.openRawResource(picstr);