一.Activity生命周期
4种状态、7个重要方法和3个嵌套循环
活动(Active/Running)状态:当Activity运行在屏幕前台(处于当前任务活动栈的最上面),此时它获取了焦点能响应用户的操作,属于运行状态,同一个时刻只会有一个Activity 处于活动状态。
暂停(Paused)状态:当Activity失去焦点但仍对用户可见(如在它之上有另一个透明的Activity或Toast、AlertDialog等弹出窗口时)它处于暂停状态。暂停的Activity仍然是存活状态(它保留着所有的状态和成员信息并保持和窗口管理器的连接),但是当系统内存极小时可以被系统杀掉。
停止(Stopped)状态:完全被另一个Activity遮挡时处于停止状态,它仍然保留着所有的状态和成员信息。只是对用户不可见,当其他地方需要内存时它往往被系统杀掉。
非活动(Dead)状态:Activity尚未被启动、已经被手动终止,或已经被系统回收时处于非活动的状态,要手动终止Activity,可以在程序中调用"finish"方法。
onCreate:当Activity第一次被实例化的时候系统会调用,整个生命周期只调用1次这个方法。
onStart():当Activity可见未获得用户焦点不能交互时系统会调用。
onResume():当Activity可见且获得用户焦点能交互时系统会调用。
onRestart():当Activity已经停止然后重新被启动时系统会调用。
onPause():当系统启动另外一个新的Activity时,在新Activity启动之前被系统调用保存现有的Activity中的持久数据,而onSaveInstanceState()来记录activity的临时状态。
onStop():当Activity被新的Activity完全覆盖不可见时被系统调用。
onDestroy():当Activity(用户调用finish()或系统由于内存不足)被系统销毁杀掉时系统调用,(整个生命周期只调用1次)用来释放onCreate ()方法中创建的资源,如结束线程等。
Activity完整的生命周期:从第一次调用onCreate()开始直到调用onDestroy()结束。
Activity的可视生命周期:从调用onStart()到相应的调用onStop()。在这两个方法之间,可以保持显示Activity所需要的资源。如在onStart()中注册一个广播接收者监听影响你的UI的改变,在onStop() 中注销。
Activity的前台生命周期:从调用onResume()到相应的调用onPause()。
二.常见的widget
TextView、EditText、Button、ImageView,功能分视图和事件
三.Fragment
Android是在Android 3.0开始引入Fragment的。我们可以把Fragment想成Activity中的模块,这个模块有自己的布局,有自己的生命周期,单独处理自己的输入,在Activity运行的时候可以加载或者移除Fragment模块,并且可以在多个Activity中复用。
因为Fragment必须嵌入在Acitivity中使用,所以Fragment的生命周期和它所在的Activity是密切相关的。如果Activity是暂停状态,其中所有的Fragment都是暂停状态;如果Activity是stopped状态,这个Activity中所有的Fragment都不能被启动;如果Activity被销毁,那么它其中的所有Fragment都会被销毁。
但是,当Activity在活动状态,可以独立控制Fragment的状态,比如加上或者移除Fragment。
onAttach()->onCreate()->onCreateView()->onActivityCreated->onStart->onResume()->active->onPause()->onStop()->onDestroyView()->onDestroy()->onDetach()
需要重写的3个方法:
onCreate():系统在创建Fragment的时候调用这个方法,这里应该初始化相关的组件,一些即便是被暂停或者被停止时依然需要保留的东西。
onCreateView():当第一次绘制Fragment的UI时系统调用这个方法,必须返回一个View,如果Fragment不提供UI也可以返回null。注意,如果继承自ListFragment,onCreateView()默认的实现会返回一个ListView,所以不用自己实现。
onPause():当用户离开Fragment时第一个调用这个方法,需要提交一些变化,因为用户很可能不再返回来。
Fragment加入Activity的2种方式:
在布局文件中使用标签添加;
通过编程的方式将Fragment加入到一个ViewGroup中,首先,需要一个FragmentTransaction实例,之后,用add()方法在父控件中加上Fragment的对象,通过commit()方法使得FragmentTransaction实例的改变生效。
四.ActionBar
Android是在Android 3.0开始引入ActionBar的。取代3.0之前的标题栏,并提供更为丰富的导航效果。
主要功能包含:
1. 显示选项菜单。
2. 提供标签页的切换方式的导航功能,可以切换多个fragment。
3. 使用程序的图标作为返回Home主屏或向上的导航操作。
获取:actionBar = this.getActionBar()
隐藏:在manifest.xml中将主题设置为Theme.Holo.NoActionBar为一个Activity去除掉ActionBar。或者调用show()或者hide()方法来相应的显示或者隐藏ActionBar。
添加Item:
(1)通过程序动态添加,重写onCreateOptionsMenu方法,以MenuItem为对象,通过setShowAsAction方法绑定到Bar上。
(2)通过Menu.xml文件布局,重写onCreateOptionsMenu方法,以MenuInflater的方式将布局填充到Bar上。
使用带字的ActionItem:(1)Action item 默认格式是如果菜单项含字和图标的话,只显示图标
(2)如果想要显示字的效果,在xml里如下设置:android:showAsAction="ifRoom|withText" 或者在代码里调用setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM)
ActionBar的单击事件:ActionItem的触发与以前版本中的活动菜单回调方法onOptionsItemSelected()一致。
图标:默认图标在ActionBar的左侧,当用户点击图标时,系统会调用你的Activity里面的onOptionsItemSelected() 方法里面的Android.R.id.Home里定义的事件。我们可以重写这个方法,添加一个条件执行该行为:让它跳转到这个应用的主Activity而不是返回的主屏幕。如果选择返回应用的主activity,最好的方式是在创建的Intent中添加FLAG_ACTIVITY_CLEAR_TOP这个标签,表示如果应用的主Activity已经在activity栈中存在,所有在其上的activity都会被销毁,然后主activity会到栈顶,而不用创建主Activity的的新实例。当我们想实现用户点击图标后返回前一个activity,可以通过在Actionbar设置setDisplayHomeAsUpEnabled(true) 来实现。
添加视图:我们可以在Menu.xml中的Item项中的android:actionLayout属性来指定我们希望现实布局资源的ID,来实现定制的视图。主要的Item类别和属性如下:
1).搜索栏:android:actionLayout="@layout/collapsibleview"
2).普通类型(带图片带文字):android:showAsAction="ifRoom|withText"
3).分享类型:android:actionProviderClass="android.widget.ShareActionProvider"
4).可拓展类型:android:showAsAction="collapseActionView"
5).列表类型:再套一层