1 serializable和parcelable的区别
两种都是用于支持序列化、反序列化话操作,两者最大的区别在于存储媒介的不同,Serializable使用IO读写存储在硬盘上,而Parcelable是直接在内存中读写,很明显内存的读写速度通常大于IO读写,所以在Android中通常优先选择Parcelable。
2 Fragment之间传递数据 Fragment和Activity传递数据
Fragment之间可以用fragment.setArguments 和 getArguments
Fragment和Activity之间传递
一种最简单的Fragment获取 getActivity().
或者Activity实现一个接口,Fragment在onAttach方法中,将该Activity转化为该接口,在需要调用的时候回调
3 内存溢出和内存泄漏的区别
内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。
内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。
memory leak会最终会导致out of memory!
一句话Memory Leak泄露不会崩溃,但多了会有可能导致OOM崩溃 例子:比如在Activity中注册了一个广播接收器,但是在页面关闭的时候没有进行unRegister,就会出现内存溢出的现象。如果我们的java运行很久,而这种内存泄露不断的发生,最后就没内存可用了,最终就是我们看到的OOM错误
Bitmap的不当处理极可能造成OOM,绝大多数情况应用程序OOM都是因这个原因出现的。Bitamp位图是Android中当之无愧的胖子,所以在操作的时候必须小心。
及时释放recycle。由于Dalivk并不会主动的去回收,需要开发者在Bitmap不被使用的时候recycle掉
4 android 6.0运行时权限问题
Activity和Fragment调用相应的requestPermissions
详细链接:http://www.w2bc.com/article/android-6-0-runtime-permission
Android 6.0在我们原有的AndroidManifest.xml声明权限的基础上,又新增了运行时权限动态检测,以下权限都需要在运行时判断:
身体传感器
日历
摄像头
通讯录
地理位置
麦克风
电话
短信
存储空间
我们需要在build.gradle中声明targetSdkVersion为23
检查并申请权限
我们需要在用到权限的地方,每次都检查是否APP已经拥有权限,比如我们有一个下载功能,需要写SD卡的权限,我们在写入之前检查是否有WRITE_EXTERNAL_STORAGE权限,没有则申请权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
//申请WRITE_EXTERNAL_STORAGE权限
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
WRITE_EXTERNAL_STORAGE_REQUEST_CODE);
}
请求权限后,系统会弹出请求权限的Dialog
用户选择允许或需要后,会回调onRequestPermissionsResult方法, 该方法类似于onActivityResult
5 PendingIntent和Intent的区别
PendingIntent这个类用于处理即将发生的事情。比如在通知Notification中用于跳转页面,但不是马上跳转。 可以理解为延迟执行的intent,PendingIntent是对Intent一个包装
Intent 是及时启动,intent 随所在的activity 消失而消失。
Intent一般是用作Activity、Sercvice、BroadcastReceiver之间传递数据,而Pendingintent,一般用在 Notification上
6 Activity的两种启动方式和Intent解析
intent解析 :http://www.cnblogs.com/engine1984/p/4146621.html
一种是显示启动
- Intent intent=new Intent(this,OtherActivity.class); //方法1 直接class类名跳转
- Intent intent2=new Intent();
- intent2.setClass(this, OtherActivity.class);//方法2 setClass跳转
- intent2.setClassName(this, "com.zy.MutiActivity.OtherActivity"); //方法3 包名跳转 此方式可用于打开其它的应用
- intent2.setComponent(new ComponentName(this, OtherActivity.class)); //方法4
- startActivity(intent2);
隐式调用方法(只要action、category、data和要跳转到的Activity在AndroidManifest.xml中设置的匹配就OK