name = "android.intent.action.PICK"/>
缺点:
常驻型,占资源比较大
registerReceiver(receiver,filter);
用意是方便各大组件中进行即时的相互通讯
6、什么是ANR,如何产生的,如何避免它?
在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:
Application Not Responding)对话框。
运行在主线程里的任何方法都尽可能少做事情,多用工作线程,耗时操作一定要在工作线程
7、什么情况下回产生ForceClose?
写出你遇到的几个导致其产生的异常?
导致出现Force Close的原因有很多,常见的有比如空指针啦,类没有找到啦,资源没找到,就连Android API使用的顺序错误也可能导致(比如setContentView()之前进行了findViewById()操作)
8、谈一下横竖屏切换时候activity的生命周期?
1、不设置Activity的android:
configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
2、设置Activity的android:
configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
3、设置Activity的android:
configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
9、当ListView带有网络图片怎么避免oom异常?
读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出现OutOfMemory异常
1.要及时回收Bitmap的内存 Bitmap类有一个方法recycle() System.gc();
2. 捕获异常
3. 缓存通用的Bitmap对象
4. 压缩图片
10.介绍一下service,service作为一个后台程序,能否执行耗时操作?
不能,理论上四大组件都是运行在主线程上面的,主线程是不允许执行耗时操作的
11、谈谈android屏幕多分辨下的开发
在res目录下创建不同的layout文件夹
drawable-mdpi、drawable-xhdpi、drawable-xxhdpi 这三个主要是为了支持多分辨率
(1)drawable-mdpi里面存放低分辨率的图片,如WVGA (480x800),FWVGA (480x854)
(2)drawable-xhdpi里面存放中等分辨率的图片,如 (1280x720)
(3)drawable-xxhdpi里面存放高清分辨率的图片,如(1920x1080)
12.android:
layout_gravity,android:
gravity,android:
padding,android:
layout_margin之间的区别
gravity 属性是对该view 内容的限定
layout_gravity 是用来设置该view相对与起父view 的位置
padding 填充的意思,指的是view中的content与view边缘的距离 margin表示的是view的左边缘与parent view的左边缘的距离
margin一般用来描述控件间位置关系,而padding一般描述控件内容和控件的位置关系。
13.Intent的使用,能传递那些数据类型?
怎么传对象?
Bitmap怎么传递
简单或基本数据类型 传递一个Bundle
传递Serializable对象 Parcelable对象 Intent
Android中Intent传递类对象提供了两种方式 一种是 通过实现Serializable接口传递对象,一种是通过实现Parcelable接口传递对象。
要求被传递的对象必须实现上述2种接口中的一种才能通过Intent直接传递。
使用intent传递bitmap对象 存:
i.putExtra("0", bitmap);
取:
i = getIntent(); bitmap= i.getParcelableExtra("0");
android高级
1、如果后台的Activity由于某些原因被系统回收了,如何在系统回收的之前保存当前状态?
Activity中提供了一个方法:
onSavedInstanceState(Bundle obj).当系统销毁一个Activity时,会将Activity的状态信息已键值对形式存放在bundle对象中.
onCreate方法的定义是"protected void onCreate (Bundle savedInstanceState) Activity还有个onRestoreInstanceState(Bundle outState)方法.这个方法的描述中也写到在Activity回复先前保存的状态时会被调用
2、请解释下Message、Handler、MessageQueue、Looper之间的关系。
Handler获取当前线程中的looper对象,looper用来从存放Message的MessageQueue中取出Message,再有Handler进行Message的分发和处理. Message Queue(消息队列):
用来存放通过Handler发布的消息,通常附属于某一个创建它的线程,可以通过Looper.myQueue()得到当前线程的消息队列
Handler:
可以发布或者处理一个消息或者操作一个Runnable,通过Handler发布消息,消息将只会发送到与它关联的消息队列,然也只能处理该消息队列中的消息
Looper:
是Handler和消息队列之间通讯桥梁,程序组件首先通过Handler把消息传递给Looper,Looper把消息放入队列。
Looper也把消息队列里的消息广播给所有的 Handler:
Handler接受到消息后调用handleMessage进行处理
Message:
消息的类型,在Handler的handleMessage方法中得到单个的消息进行处理
3、请说明 synchronized 关键字的用法
方法前加上synchronized,这个方法即是同步的,
而使用synchronized(obj)和一对大括号包围住的代码块,则是同步块。
4、谈一下自定义控件的步骤和注意点,及怎么使用。
1. 写一个自定义控件类,这个类就是你的自定义控件的实现.
2. 在res/values目录下建立一个attrs.xml的文件,在这个文件中增加对控件的自定义属性的定义.
3. 使用带AttributeSet参数的类的构造函数,并在构造函数中将自定义控件类中变量与attrs.xml中的属性连接起来.
4. 在自定义控件类中使用这些已经连接的属性变量.
5. 将自定义的控件类定义到布局用的xml文件中去.
6. 在界面中生成此自定义控件类对象,就完成了自定义控件的创建和使用了.
5、在一个应用程序中,已知按顺序启动6个activity,编号按顺序分别是1,2,3,4,5,6,如何从第6个activity跳转到第2个activity,并清除中间的activity?
设置2的launchMode="singleTask,其它的launchMode都为默认的standard,然后设置2和6的android:
taskAffinity为一样的值,这时,6跳转到2时,会清除掉中间的activity
6、如何保证service不被后台系统杀死,service杀死后如何重启。
Android开发的过程中,每次调用startService(Intent)的时候,都会调用该Service对象的onStartCommand(Intent,int,int)方法,然后在onStartCommand方法中做一些处理。
然后我们注意到这个函数有一个int的返回值
从Android官方文档中,我们知道onStartCommand有4种返回值:
START_STICKY:
如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。
随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。
如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。
START_NOT_STICKY:
“非粘性的”。
使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。
START_REDELIVER_INTENT:
重传Intent。
使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。
START_STICKY_COMPATIBILITY:
START_STICKY的兼容版本,但不保证服务被kill后一定能重启。
现在的安卓手机,只要一长按home键,通常都会列出近期任务,这里可以干掉所有进程所以一直不断的在后台运行是不行的,但是你可以通常广播来激活你的service
7、请用代码来计算字符串“Iamgotoswimming”中每个字母的个数,并打印出来
publicstaticvoidmain(String[]args){
Stringstring="Iamgotoswimming";
Mapmap=newHashMap<>();
for(inti=0;icharchars=string.charAt(i);
intsum=search(string,chars);
map.put(chars,sum);
}
System.out.println(map);
}
publicstaticintsearch(Stringsr,charar){
intcount=0;
intnum=0;
inttemp=0;
while((sr.length()-temp)>=1){
num=sr.indexOf(ar,temp);
if(num==-1){
temp=sr.length();
}else{
temp=num+1;
count++;
}
}
returncount;
}