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。
12.android开机启动流程。