Android复习笔记
来源:互联网 发布:c语言调用matlab 编辑:程序博客网 时间:2024/05/29 03:24
1.Activity在发生旋转时会销毁自身并重新创建,若其视图中有需要存储的数据,需覆写onSaveInstanceSate(Bundle)方法,将所需的参数传入bundle中,当Activity再次被Create时,通过Bundle将其取出并还原。
2.可以通过创建layout-land文件夹并将layout文件夹中的xml文件放入其中,以适应APP的横屏模式。
常用的配置修饰符
中文语言(values-zh)
水平模式的屏幕方位(layout-land)
中等的屏幕显示密度(drawable-mdpi)
11及以上的API级别(values-v11)
屏幕尺寸修饰符
更多可观察:https://developer.android.com/guide/topics/resources/providing-resources.html#ResourceTypes
3.当一个列表项中有checkbox的时候,由于checkbox会获得焦点。当点击列表项时会被理解成切换checkbox的状态,这将导致该列表项的onItemClick(…)方法无法被触发。
因此,在列表项中设置任何可聚焦组件(Button,Checkbox)等,都应将其设置为非聚焦状态,即为其添加android:focusable=”false”属性
4.一个fragment要传递信息给另一个activity的fragment可以用到intent,将信息装入intent附带的bundl中,通过startActivity启动并将信息附带给新的Activity中,然后在新的Activity的fragment中直接getActivity.getIntent来获取,但该种方法将会破坏fragment的封装性,使得其与父activity高度耦合。
解决方法是利用fragment的newInstance方法,将信息在activity构造其fragment时传入,并将其放入fragment自身的argument中,这种做法加大了内存开销,但使得fragment不再依赖于activity,提高复用度。
5.activity生命周期
官网拉出来的图,需要注意的是pause的时候是activity失去焦点的时候,而stop是视图被遮盖的时候才会触发,在系统需要内存的时候,stop级别(后台进程)的会优先被kill掉,然后才是pause(可见进程)。
另外,用户的设备发生一些改变的时候可能会导致Activity的销毁和重建,因此保存Activity的瞬时状态显得十分重要,我们可以通过onSaveInstanceState()来将activity的一些数据进行存储,注意这个方法只是辅助我们去存储一些轻量级的数据(例如当前显示的数据),该方法在Activity.finish()的时候并不会被触发。
经过测试,该方法会在pause之后stop之前触发,只要不是经过finish进入的销毁态都会触发,而RestorSaveInstanceStae()会在start之后resume之前触发,该方法只在destory发生过以后才会触发,事实上我们只要从onCreate方法中恢复就行。当然,即便我们不去覆写该方法,也有许多view会自动保存自己的状态(如EditText、CheckBox)。
值得注意的是,当前Activity即便弹出一个对话框,也不会触发Activity生命周期的改变,但若启动一个对话框样式的Activity则会使得当前Activity进入pause状态。
最后,两个Activity的生命周期是有可能存在重叠的,当ActivityA启动ActivityB的时候,会先调用A的onPause(),然后依次调用AcitivityB的onCreate(),onStart(),onResume,如果此时A被遮盖住,失去了焦点,A才会进入onStop(),故若是A、B同时操作一个介质的时候,应在A的onPause()之中或之前完成,否则B无法获取到修改。
6.fragment生命周期
与Activity的生命周期类似,但是需要注意的是它比Activity多了几个生命周期,一个是Attach以及对应的Detach,这两个生命周期是在Fragment与父Activity建立联系以及取消联系的时候会触发的,另外需要注意的是,如果在Activity的onCreate的方法里面直接执行Fragment的创建,那么该Fragment并不会立刻就被创建,而是等到Activity的onCreate方法执行完毕后才执行,所以顺序为:
Activity.onCreate()->Fragment.onAttach()->Fragment.onCreate()->Fragment.onCreateView()->Fragment.onActivityCreated()->Fragment.onStart()->Activity.onStart()->Activity.onResume()->Fragment.onResume()
上述就是Activity与Fragment第一次创建的顺序。摧毁顺序如下
> Fragment.onPause()->Activiy.onPause()->Fragment.onSaveInstanceState()->Activity.onSaveInstanceState()->Fragment.onStop()->Activity.onStop()
但有趣的是,当屏幕发生旋转导致Fragment与Activity的销毁并重建的时候,Fragment.onAttach与onCreate会优先触发,接下来才是Activity的onCreate。
7.可以利用setRetainInstance(boolean)方法来保存一个fragment实例,当屏幕状态发生改变的时候,Activity会被销毁重绘,故其上的fragment同样会被销毁并重绘,但如果此时fragment正在处理一些不可中断的任务(例如播放视频),则可以利用该方法。
该方法设置为True后,发生旋转时,该fragment的视图会被销毁,但是本身不会被destroy,当activity重新创建后,新的fragmentManager会找到被保留的fragment重新创立其视图
在这个过程中,fragment的onDestroy()方法 onCreate()方法将不会被调用,onAttach()和onDetach()以及onActivityCreate()方法仍会被调用。
但fragment中若有数据需要长久被持有的时候,该方法不适用,在系统需要内存时,fragment会被回收导致数据丢失,此时应该使用onSaveInstance()方法保存需要的数据
8.若要使得fragment持有menu,则在fragment中覆写onCreateOptionMenu,同时,由于menu是由fragmentManager负责调用的,故需要通知fragmentmanager,在onCreate中调用setHasOptionsMenu(true)
9.在使用了AppcompatActivity的情况下 要获取Actionbar只能使用getSupportActionBar()
10.setEmptyView()限制
11.若要对列表中的选项进行修改,无需使用dialogFragment制造子菜单,使用onCreateContextMenu()方法可以创建上下文浮动菜单,在honycomb之后的系统更是可以利用上下文操作模式,即调用listview.setChoiceMode(ListView.CHOICE_MODE_MULTTIPLE_MODAL);启用上下文操作模式3
12.requestWindowFeature(Window.FEATURE_NO_TITLE); 对于AppcompatActivity无效,需要使用getSupportActionBar.hide();
13.关于Bitmap.recycle(),该方法可以会释放bitmap占用的原始内存,若不主动调用,GC也会在将来的某个时刻将其回收,因此最好在确认不需要图片的时候将其主动回收释放内存。
14.R.string文件中的string支持占位符填充,具体格式为 %(序号)$(类型)如:
<string name="crime_report">%1$s! The crime was discovered on %2$s. %3$s, and %4$s</string>
序号为依次要填充的值,类型有三种
%d:表示整数型;
%f :表示浮点型,其中f前面的.2表示小数的位数
%s:表示字符串
然后通过代码
String report = getString(R.string.crime_report ,mCrime.getTitle(),dateString,solvedString,suspect);
即可填充。
15.在做音乐播放器选择用Service来后台播放音乐的时候,不能选择intentService,因为它在执行完所有的intent之后会销毁自己,而mediaplayer的播放是依赖在service上的,故会被瞬间销毁。
IntentService:异步处理服务,新开一个线程:handlerThread在线程中发消息,然后接受处理完成后,会清理线程,并且关掉服务。
IntentService有以下特点:
(1) 它创建了一个独立的工作线程来处理所有的通过onStartCommand()传递给服务的intents。
(2) 创建了一个工作队列,来逐个发送intent给onHandleIntent()。
(3) 不需要主动调用stopSelft()来结束服务。因为,在所有的intent被处理完后,系统会自动关闭服务。
(4) 默认实现的onBind()返回null
(5) 默认实现的onStartCommand()的目的是将intent插入到工作队列中
继承IntentService的类至少要实现两个函数:构造函数和onHandleIntent()函数。要覆盖IntentService的其它函数时,注意要通过super调用父类的对应的函数。
- Android复习笔记1
- Android复习笔记
- Android复习笔记
- android 整体复习笔记(一)
- Android 复习笔记之图解Fragment
- Android 复习笔记之图解Actionbar
- Android 复习笔记之图解Activity
- Android 复习笔记之图解Service
- Android 复习笔记之图解BroadcastReceiver
- android复习笔记(1) - Activity相关
- Android复习笔记(2) - Intent介绍
- Android复习笔记(4) - 文件读取相关
- Android复习笔记(5)-数据库操作 sqllite
- Android复习笔记(6) -BrodCastReceiver (广播接收者
- Android复习笔记(7) -发送广播
- Android复习笔记(8) - 服务(Service)
- Android复习笔记(9) - 调用远程服务
- Android复习笔记(10) -对话框的使用
- 循环移位(翻转算法)
- solr 学习之路 如何将数据库中大量的数据导入solr <三>
- java多线程总结2——Lock
- 详解 HTTP与HTTPS
- 设计模式(8) ------- 桥接模式
- Android复习笔记
- 面向对象五大基本原则(二)
- ubuntu 虚拟机上不了网 主机能上网
- cdoj 1131 男神的礼物 区间dp
- String创建方式内存终极分析
- 仿QQ音乐播放界面(已实现主要功能)
- Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean wi
- string stringbuffer stringbuilder区别
- 关于office work老弹出宏错误