Activity 与 Fragment
Activity---Android应用常用组件(粗粒度)
Activity
建立自己的Activity需要继承Activity基类,或继承Activity的子类
Activity类间接或直接第继承了Context、ContextWrapper、ContextThemeWrapper等基类,因此Activity可以直接调用它们的方法
创建一个Activity需要实现方法,最常实现的就是onCreate(Bundle status)方法,调用setContentView(View view)方法来显示要展示的View。调用findViewById(int id)方法来获取程序界面的组件。
LauncherActivity---继承了ListActivity,本质是一个开发列表界面的Activity,每个列表项对应一个Intnet。需要重写Intent intentForPosition(int position)方法用于启动不同的Intent。
setListAdapter(adapter);
ExpandableListActivity---为该Activity传入一个ExpandableListAdapter对象即可,生成一个可展示的列表窗口
setListAdapter(adapter);
PreferenceActivity---结合PreferenceFragment实现参数设置界面。专门用于设置选项参数。
创建一个对应的界面布局文件---其中PreferenceActivity只负责加载选项设置列表的布局文件,PreferenceFragment才负责加载选项设置的布局文件。
<preference-headers ... />
<header ... />
...
<intent ... />
onBuildHeaders(List<Header> target)
{
loadHeadersFormResource(R.xml.preference_headers,target);
}
选择XML文件的根元素为PreferenceScreen
PreferenceCategory 用于对参数进行分组
在PreferenceFragment程序中使用界面布局文件进行参数设置、保存
继承PreferenceFragment
在onCreate(Bundle savedInstanceState)方法中调用addPerferencesFormResource(...)方法加载指定的界面布局文件
配置Activity---所有的应用程序组件都必须显式进行配置
为<application .../>元素添加<activity.../>子元素即可配置Activity
name
icon
label
exported---是否允许其他应用程序调用
launchMode---加载模式
<intent_filter.../>---指定该Activity可以响应的Intent
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
启动、关闭Activity
startActivity(Intent intent)
startActivityForResult(Intent intent,int requestCode)
指定的请求码启动Activity,程序会获取新启动的Activity返回的结果(通过重写onActivityResult(..)来获取)
finish()
finishActivity(int requestCode)---结束以startActivtiyForResult()启动的Activity
使用Bundle 在Activity之间交换数据
Intent提供对个重载方法“携带”额外数据
putExtras(Bundle data)
Bundle getExtras()
putExtra(String name,Xxx value)
getXxxExtra(String name)
Bundle 就是一个简单的数据携带包,包含多个方法来存入数据及取出数据
putXxx(String key,Xxx data)
putSerializable(String key,Serializable data)
getXxx(String key)
getSeriakizable(String key,Serializable data)
Bundle data=new Bundle()
data.putSeriazable("person",p)
...
intent.putExtras(data);
...
获取启动该Activity上的Intent
Intent intent=getIntent();
Person p=(person) intent.getSeriazable("person");
p.getName()
...
启动其他Activity并返回结果
当前Activity需要重写onActivityResult(int resquestCode,int resultCode,Intent intent),当被启动的Activity有结果返回时,该方法将会被触发,其中requeatCode代表请求码,而resultCode代表Activity返回的结果码,由开发者自行设定
被启动的Activity需要调用setResult()方法设置处理结果
Activity的回调机制---随着应用程序的运行,Activity会不断的在不同的状态之间切换,该Activity中特定的方法就会被回调。
Activity的生命周期 与 加载模式
Activity生命周期
运行
暂停
停止
销毁
onCreate(Bundle savedStatus)---创建时被回调,只会被调用一次
onStart()---启动时回调
onRestart()---重新启动时回调
onResume()---恢复Activity时被回调。在onStart方法后一定会调用
onPause()---暂停时被回调
onStop()---停止时被回调
onDestroy()---销毁时被回调,只会被调用一次
onSaveInstanceState(Bundle outState){
super.onSaveInstanceState(outState)
outSate.putString("key","...");
}
onBackPressed(){
super.onBackPressed();
log.d(TAG,"onBackPressed")}
第一个onPause---第二个显示---第一个onStop
Actvity 与 Servlet 的区别
相似:
职责都是向用户呈现界面
都继承系统的基类
都需要进行配置
Activity运行于Android中,而Servlet运行于Web应用中
无需创建实例,无需调用方法。都是由系统以回调的方式来调用的
都有生命周期,生命周期都是由外部负责管理
都不会直接相互调用,因此不能直接进行数据交换。
差距:
Activity是Android窗口的容器,因此Activity最终以窗口的形式显示。而servlet并不会生成应用界面,只是向浏览者生成文本响应
Activity运行于Android应用中,因此Activity的本质还是通过各种界面组件来搭建界面;而servlet则主要是以IO流向浏览者生成文本响应,浏览者看到的界面其实是由浏览器负责生成的
Activity之间的跳转主要是通过Intent对象来控制,而Servlet之间的跳转则主要是由用户请求来控制的
4中加载模式---Android采用Task来管理对个Activity,Android并没有为Task提供API,只能调用Activity的getTaskId()来获取它所在的Task的ID。可以理解为Activity栈,Task以栈的形式管理Activity。
standard---不启用新的Task,创建新的实例
singleTop---只要位于栈顶,不创建新的实例,直接复用已有的Activity实例。不刷新页面。
singleTask---Task内单例模式。不适合需要变化/刷新的对象。
singleInstance---全局单例模式。创建一个目标Activity实例,并会使用一个全新的Task栈来加载该Activity实例。一个Task只存在一个Activity实例。不刷新页面。
Fragment---拥有自己的生命周期,可以接受自己的输入事件
Fragment概述及其设计初衷---必须被“嵌入”Activity中使用,Fragment生命周期会受到它所在的Activity的生命周期控制。
Fragment总是作为Activity界面的组成部分
Fragment可调用getActivity()获取所在的Activity
Activity可调用FragmentManager的findFragmentById()或findFragmentByTags()来获取Fragment
在Activity运行中,可调用FragmentManager的add()、remove()、replace()动态添加、删除或替换Fragment
一个Activity可以组合多个Fragment;一个Fragment也可以别多个Activity复用
Fragment可以响应自己的输入事件,并拥有自己的生命周期,但被其所属的Activity的生命周期控制
创建Fragment
继承Fragment及其子类
实现回调方法
onCreate()
onCreateView()---返回一个View,该View也是该Fragment所显示的View
View rootview=inflater.inflate(R.layout.fragment_book_detail,container,false)
onPause
ListFragment
setListAdapter(adapter)
Fragment 与 Activity 通信
将Fragment添加进Activity
布局文件中使用<fragment.../>
Java中可通过FragmentTransaction对象的add()来添加
Activity的getFragmentManager()可返回FragmentManager,FragmentManager对象的beginTransaction()即可开启并返回FragmentTransaction对象
交互信息:
Fragment获取所在Activity:getActivity()
Activity获取包含的Fragment:findFragmentById(int id)或者findFragmentByTag(String tag)
Activity向Fragment传递数据:在Activity中创建Bundle数据包,并调用Fragment的setArguments(Bundle bundle)即可将Bundle数据包传给Fragment
Fragment向Activity传递数据或Activtity需要在Fragment运行中进行实时通信:在Fargment中定义一个内部回调接口,再让包含该Fragment的Activity实现该回调接口,这样Fragment即可调用该回调方法将数据传给Activity
Fragment 管理 与 Fragment事务---Activity管理Fragment主要依靠FragmentManager
FragmentManager功能:
使用findFragmentById()/findFragmentByTag()
调用popBackStack()将Fragment从后台栈中弹出
调用addOnBackStackChangeListener()注册一个监听器,用于监听后台栈的变化
添加、删除、替换Fragment,则需要借助FragmentTransaction对象,FragmentTransaction代表Activity对Fragment执行的多个改变
getFragmentManager().beginTransaction().add()/.remove()/.replace();
.addToBackStack();
.commit()
Fragment 生命周期
运行
暂停
停止
销毁
onAttach()---被添加到Activity时回调,只会被调用一次
onCreate(Bundle saveStatus)---创建,一次
onCreateView()---创建、绘制时回调,Fragment将会显示该方法返回的View组件
onActivityCreated()---所在Activity被启动完成后调用
onStart()
onResume()
onPause()
onStop()
onDestroyView()---销毁该Fragment所包含的View组件时调用
onDestroy()---销毁Fragment时调用,只会调用一次
onDetach()---将Fragment从Activtity中替换、删除完成时回调该方法。在onDestroy()后一定会回调onDetach()方法,只会调用一次。
小结:
本章学习Android四大组件之一:Activity。一个应用包含多个Activtity,每个Activity对应一个窗口。用Bundle在不同的Activity之间通信,启动其他Activity并返回结果。Activity的生命周期。另一个是Fragment,Fragment开发界面、添加到Activity、Fragment与Activity通信以及其生命周期。
生活感悟:
夜长一定会梦多——若不想要太多变数请尽快解决;若想事情有所转机,那就争取更多的时间。