疯狂android讲义(第三版)——第四章:深入理解Activity与Fragment

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通信以及其生命周期。

 

生活感悟:

夜长一定会梦多——若不想要太多变数请尽快解决;若想事情有所转机,那就争取更多的时间。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值