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调用父类的对应的函数。

0 0
原创粉丝点击