您的位置:首页 > 移动开发 > Android开发

Android常见问题

2017-01-04 23:18 204 查看
1.android中常见的内存泄露方式有哪些?

答:1.查询数据库而没有关闭Cursor

2.调用registerReceiver后未调用unregisterReceiver().

3.未关闭InputStream/OutputStream

4.Bitmap使用后未调用recycle()

5.Context泄露

6.集合中对象没有清理,例如对activity引用一直未释放

7.列表没有使用convertview复用

2.android中内存泄露的根本原因。

答:长生命周期对象(Thread)持有短生命周期对象(Activity)的引用

3.Activity中如何动态的添加Fragment?

答:1.获取到FragmentManager,在Activity中可以直接通过getFragmentManager得到。

2.开启一个事务,通过调用beginTransaction方法开启。

3.向容器内加入Fragment,一般使用replace方法实现,需要传入容器的id和Fragment的实例。

4.提交事务,调用commit方法提交。

4.怎么判断android中ScrollView滑动到了最底部?

答:滚动到顶部判断:getScrollY() == 0

滚动到底部判断:
View childView = getChildAt(0);
childView.getMeasuredHeight() <= getScrollY() + getHeight();
其中getChildAt表示得到ScrollView的child View
childView.getMeasuredHeight()表示得到子View的高度,
getScrollY()表示得到y轴的滚动距离,
getHeight()为scrollView的高度
getScrollY()达到最大时加上scrollView的高度就的就等于它内容的高度了.

判断滑动位置的地方,可以有两种方式:
1、实现OnTouchListener来监听是否滑动到最底部;
2、重写ScrollView的onScrollChanged的方法,在onScrollChanged函数中判断


5.View中onTouch,onTouchEvent,onClick的执行顺序

答:dispatchTouchEvent—->onTouch—->onTouchEvent—–>onClick。并且如果仔细的你会发现,是在所有ACTION_UP事件之后才触发onClick点击事件。

6.res/raw和assets的相同点:

.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。

res/raw和assets的不同点:

1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename;assets文件夹下的文件不会被映射到R.java中,访问 的时候需要AssetManager类。

2.res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹

注意1:Google的Android系统处理Assert有个bug,在AssertManager中不能处理单个超过1MB的文件,不然会报异常,raw没这个限制可以放个4MB的 Mp3文件没问题。

注意2:assets 文件夹是存放不进行编译加工的原生文件,即该文件夹里面的文件不会像 xml, java 文件被预编译,可以存放一些图片,html, js, css 等文件。

7.android中数据持久化方式?

答:1、Shared Preferences

2、Internal Storage

3、External Storage

4、SQLite Databases

5、Network Connection

8.JVM 和Dalvik虚拟机的区别

答:1.Dalvik 基于寄存器,而 JVM 基于栈。

2.JVM字节码由.class文件组成,每个文件一个class。JVM在运行的时候为每一个类装载字节码。相反的,Dalvik程序只包含一个.dex文件,这个文件包含了程序中所有的类。

3.Dalvik 经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik 应用作为一个独立的Linux 进程执行。

9.Service与Activity怎么实现通信?

答:1.Activity调用bindService (Intent service, ServiceConnection conn, int flags)方法,得到Service对象的一个引用,这样Activity可以直接调用到Service中的方法,如果要主动通知Activity,我们可以利用回调方法

2.Service向Activity发送消息,可以使用广播,当然Activity要注册相应的接收器。比如Service要向多个Activity发送同样的消息的话,用这种方法就更好

10.android中Invalidate和postInvalidate的区别

答:Android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用。

Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中调用。

11.Fragment嵌套多个Fragment会出现bug吗?

答:

1.当使用Fragment去嵌套另外一些子Fragment的时候,我们需要去管理子Fragment,这时候需要调用ChildFragmentManager去管理这些子Fragment,由此可能产生的Exception主要是: java.lang.IllegalStateException: No activity

解决方法:在Fragment被detached的时候去重置ChildFragmentManager

2.当我们从一个Activity启动了一个Fragment,然后在这个Fragment中又去实例化了一些子Fragment,在子Fragment中去有返回的启动了另外一个Activity,即通过startActivityForResult方式去启动,这时候造成的现象会是,子Fragment接收不到OnActivityResult,如果在子 Fragment中是以getActivity.startActivityForResult方式启动,那么只有Activity会接收到OnActivityResult,如果是以 getParentFragment.startActivityForResult方式启动,那么只有父Fragment能接收(此时Activity也能接收),但无论如何子Fragment接 收不到OnActivityResult。

解决方法:如果我们需要在OnActivityResult的时候处理一些事情的话,我们可以通过在子Fragment中以getParentFragment.startActivityForResult的方式来启动,然后在父Fragment中去接收数据,我们需要在子Fragment中提供一个方法,如 :getResultData(Object obj),通过父Fragment中的子Fragment实例去调用这个方法,把相应的数据传过去,然后去更新子Fragment。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 面试题