Activity/Fragment

Activity

1. Activity生命周期:

在这里插入图片描述

onCreate(): 创建Activity时调用,设置在该方法中,还以Bundle的形式提供对以前存储的任何状态的访问;主要负责Activity的一般性的初始化设置,包括视图的创建(setContentView())视图数据的绑定广播的注册等等;onCreate()函数只在创建的时候会调用,且只调用一次,所以在onCreate()视图加载,视图数据绑定操作;但是在Activity状态恢复(onRestoreInstanceState)时,会调用onCreate()重建Activity

onStart(): Activity正在由不可见变为可见时,会执行此方法,即(此时Activity已经可见了)只是用户是不可以与之交互的;

此时有个特殊情况:就是当上面覆盖一个透明主题的Activity或上边有个对话框类型时,再返回此Activity不会调用此方法,因为此时Activity已为可见,正处于此生命周期中。

onResume(): 当Activity处于屏幕最前端时(此时的Activity也处在Activity栈顶),此Activity处于可见并可以与用户进行交互操作(无论是启动还是重新启动一个活动,该方法总是被调用);广播的注册,可以在这个函数进行当Activity被暂停,重新启动Activity执行onStart()函数时,需要更新UI时,可以在这个函数执行。

Activity Running :此时Activity正处于激活状态,正在与用户进行交互。此时持续处于Running状态。

onPause():当Activity失去焦点时(即不可与用户进行交互,Activity被暂停或收回cpu和其他资源时调用),此时Activity无论是部分遮挡还是即将被全部遮挡,会回调此方法。此时返回此Activity使其重新获得焦点,则会执行onResume()方法(即6->4过程),所以他们两个是一一对应的;反注册,注销在onResume()执行的资源

此时Activity处于Pause状态(即暂停状态),此时Activity还是可见的。

需要注意:Android中指定如果onPause()在500ms内没有执行完毕的话就会强制关闭Activity,因此不可做耗时操作。

onStop():当Activity不需要展示给用户时(即完全不可见),可能是由于此Activity要被注销或者新的Activity完全遮挡此Activity,就会回调此方法。当Activity由不可见到可见过程中(7->10->3),会执行onRestart()方法,然后最终执行onStart()方法,此时Activity可见;反注册,注销在onStart()执行的资源

此时Activity处于Stopped状态。如果内存,紧张系统直接销毁Activity,则Activity将处于Killed状态。

需要注意:此时Activity还在内存中,没有被回收,如果内存紧张,系统会直接销毁Activity,而不会触发onStop()方法,所以要保存状态和信息时,应该在onPause()方法中,因为有可能onPause()方法会是Activity最后的生命周期方法

onDestroy()方法:当Activity被销毁时,会回调此方法,此方法只会调用一次。和onStop()方法一样,当内存紧张时会直接销毁Activity,而不会回调此方法。

此时Activity处于Killed状态。如果内存紧张,系统直接销毁Activity,则处于Killed状态。

onRestart():此方法在Activity执行onStop()方法后,Activity重新由不可见到可见的过程中(onStart()方法之前)会执行。即在刚开始创建Activity时不会执行此方法。

各种生命周期适合进行的操作总结

onCreate:正常情况下,该方法只会执行一次。鉴于这种情况,在Activity生命周期内,只需要初始化一次的变量可以在这个方法中初始化。比如findViewById。

onStart:只有当Activity有不可见变为可见才回执行一次。由部分可见到完全可见不执行,比如Activityactivity开启了另一个不完全覆盖的activity B,而再次关闭这个B的时候,将不会执行这个方法,但是会执行onResume。所以适合做如下操作:

播放一些在半覆盖情况下需要播放的动画
部分控件的初始化操作,例如GPS

onResume:在activity获得焦点的时候执行,之后用户就可以和activity进行交互了,所以适合如下操作:

与交互强相关的资源初始化,例如某些交互性较强的动画(比如下载进度)
对相机资源的使用。

onPause:当系统调用此方法是,意味着Activity处于部分可见状态,也意味着用户正在离开这个Activity,通常应该在onPause()回调方法里面做以下事情:

activity上弹出一个对话框,不一定会执行onPause,因为对话框可能是一个View,不会对生命周期产生影响;如果是一个activity,则会activity会执行哦你Pause

停止动画等浪费cpu资源的操作
释放系统资源,比如BroadcastRecceivers、相机等
注意此处不宜执行耗时过长的动作,例如保存较大的数据到本地、持久化一些统计信息等。这样将会拉长onPause的时间,从而影响下一个Activity的启动

onStop:在onStop中,可以执行一些较为耗时的操作,例如:

保存文本到本地
对一些调用频率较少的广播进行注销等操作。
对在onStart注册的资源进行释放等

onDestory:activity在销毁前会执行的生命周期方法,这个方法执行后,activity就可能会被回收了。在onDestory中可以释放一些变量,特别是在onCreate中初始化,行进在整个生命周期内的变量

例如:bitmap,bitmap的回收一直是android的一大问题,他的反复创建又比较耗费性能,如果在onStart中来创建,在onStop中来回收也不理想,如果这个页面需要经常切换,反而造成内存抖动,这种情况下,可以选择一直持有,在onDestroy中调用bitmap的recycle方法来回收。

总结:在onResume进行获取的资源适合在onPause中释放,这对方法中不适合耗时太长的方法。在onStart申请的资源对应的在onStop中释放,可以进行一些比较耗时的操作。onCreate和onDestroy中适合进行一些需要Activity长时间持有的资源的获取与回收,因为这俩方法在Activity的生命周期中只会调用一次。

此时Activity处于Stopped状态向Running状态过渡。

1、完整生命周期: 即从一个Activity从出现到消失,对应的周期方法是从onCreate()到onDestroy()。

2、可见生命周期: 当Activity处于可以用户看见的状态,但不一定能与用户交互时,将多次执行从onStart()到onStop()。

3、前景生命周期: 当Activity处于Activity栈最顶端,能够与其他用户进行交互时,将多次执行从onResume()到onPause()。

onStart onResume和onPause onStop的区别?

onStart onStop是针对activity是否可见来说的,onPause onResume是从activity是否位于前台来回调的

2. Activity的重新创建过程(Activity状态恢复与保存)

最后来看看Activity时如何重新创建的。如果你的系统长时间处于stopped形态而且此时系统需要更多内存或者系统内存极为紧张时,系统就会回收你的Activity,而此时系统为了补偿你,会将Activity状态通过onSaveInstanceState()方法保存到Bundle对象中,当然你也可以增加额外的键值对存入Bundle对象以保存这些状态。当你需要重新创建这些Activity的时候,保存的Bundle对象就会传递到Activity的onRestoreInstanceState()方法与onCreate()方法中,这也就是onCreate()方法中参数——Bundle savedInstanceState的来源。
在这里插入图片描述
上图中1、2、3就是Activity的重新创建过程。不过这里需要注意的是,onSaveInstanceState()方法并不是每次当Activity离开前台时都会调用的,如果用户使用finish()方法结束了Activity,则不会调用。而且Android系统已经默认实现了控件的状态缓存,以此来减少开发者需要实现的缓存逻辑。

3. 两个Activity之间跳转时必然会执行的是哪几个方法?

   onCreate()                    //在Activity生命周期开始时调用。
   onRestoreInstanceState()      //用来恢复UI状态。
   onRestart()                   //当Activity重新启动时调用。
   onStart()                     //当Activity对用户即将可见时调用。
   onResume()                    //当Activity与用户交互时,绘制界面。
   onSaveInstanceState()         //即将移出栈顶保留UI状态时调用。
   onPause()                     //暂停当前活动Activity,提交持久数据的改变,停止动画或其他占用GPU资源的东西,由于下一个Activity在这个方法返回之前不会resume,所以这个方法的代码执行要快。
   onStop()                      //Activity不再可见时调用。
   onDestroy()                   //Activity销毁栈时被调用的最后一个方法。

4. Activity的安全编码

5. Activity的四种启动模式

standard:标准启动模式,每次启动都会新建一个实例对象,会默认进入启动它所在的任务栈;邮件、mainfest中没有配置就默认标准模式。

singleTop:栈顶复用模式,如果新activity在栈顶,那么这个activity不会被重新创建,并且会回调onNewIntent方法,通过这个方法的参数取出当前请求的信息;登录页面???、WXPayEntryActivity、WXEntryActivity 、推送通知栏。

singleTask:栈内复用模式,如果新的activity在栈内存在,那么不会重新创建实例,也会回调onNewIntent方法,会把启动的activity放到栈顶,在栈内之前在这个activity之上的会出栈销毁;程序模块逻辑入口:主页面(Fragment的containerActivity)、WebView页面、扫一扫页面、电商中:购物界面,确认订单界面,付款界面
使用场景:希望在Activity永远在顶端,获取焦点,例如:设置主界面以singleTask启动,当更多设置在设置主界面上面,覆盖了设置主界面,按home键退出后,再点击点击启动设置,显示设置主界面

singleInstance:单实例模式,加强的singleTask,这个模式的activity只能单独存在一个任务栈中后续请求均不会创建新的实例; 系统Launcher、锁屏键、来电显示等系统应用

Fragment

1. 为什么引入Fragment?

Android在API 11中加入了Fragment,主要是给大屏设备上进行动态灵活的UI设计提供支持,更多的情况下我们把Fragment作为一个可重复利用的模块化组件,利用它自身的生命周期来对功能模块进行分离。

  1. 提高性能,替代TabActivity做导航
  2. 轻量切换,动态切入、切换
  3. 组件化,可以将Activity分离成多个可充用的组件

2. Fragment生命周期

在这里插入图片描述

Activity与fragment生命周期关系:Activity的生命周期函数在Fragment生命周期函数之前执行(例如Activity的onCreate在fragment的onCreate之前)见上图

setUserVisibleHint()设置Fragment可见或者不可见时会调用此方法。在该方法里面可以通过调用getUserVisibleHint()获得Fragment的状态是可见还是不可见的,如果可见则进行懒加载操作。
onAttach()Fragment和Activity相关联时调用。可以通过该方法获取Activity引用,还可以通过getArguments()获取参数。
onCreate()Fragment被创建时调用。
onCreateView()创建Fragment的布局
onActivityCreated():执行该方法时,与Fragment绑定的Activity的onCreate方法已经执行完成并返回,在该方法内可以进行与Activity交互的UI操作,所以在该方法之前Activity的onCreate方法并未执行完成,如果提前进行交互操作,会引发空指针异常。
onStart():当Fragment可见时调用。
onResume():当Fragment可见且可交互时调用。
onPause():当Fragment不可交互但可见时调用。
onStop():当Fragment不可见时调用。
onDestroyView():当Fragment的UI从视图结构中移除时调用。
onDestroy()销毁Fragment时调用。
onDetach():当Fragment和Activity解除关联时调用。
上面的方法中,只有onCreateView()在重写时不用写super方法,其他都需要。

PS:https://blog.csdn.net/pigdreams/article/details/82392410

3. Fragment加载到Activity的两种方式

---------静态加载,直接添加Fragment到Activity的布局文件中。
创建activity中的布局activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <fragment
        android:id="@+id/fragment_test"
        android:name="com.bignerdranch.android.litepalstudy.fragment.FragmentTest"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

---------动态的在Activity中添加Fragment:

getSupportFragmentManager().beginTransaction().replace(R.id.relativeLayout_main, new HomeFragment()).commit;

getSupportFragmentManager().beginTransaction().add(R.id.fragment_test, fragment).commit();

4. commit方法和commitAllowingStateLoss方法的区别?

当Activity中的Fragment发生了变化,FragmentManager会在特定的时间点保存所有Fragment的状态,方便Activity因为被回收之后重建时,重新设置Fragment,如果状态没有被保存,那么Activity就只能按照默认方式显示每个Fragment,显示效果可能跟app的预期不一样。
如果项目中有特定的需求,比如需要在别的Activity中通过广播或者Eventbus的方式控制MainActivity的Fragment切换,那么就需要使用commitAllowingStateLoss()方法来避免异常。

commit和commitAllowingStateLoss方法最终都调用了BackStackRecord类的commitInternal(boolean allowStateLoss)方法,commitAllowStateLoss:是否允许fragment的状态丢失,commit传的是false,commitAllowingStateLoss传的是true(即允许fragment的状态丢失),如果使用commit方法,系统会调用checkStateLoss()方法检查状态,如果已经保存就会抛出以下异常:

private void checkStateLoss() {
    if (mStateSaved) {
        throw new IllegalStateException(
                "Can not perform this action after onSaveInstanceState");
    }

5. Fragment通信

1、在Fragment中调用Activity中的方法:

第一种方法:在Fragment中法,通过getActivity(). 调用Activity中的公开方法;

第二种方法:在Fragment中定义一个内部回调接口,再让包含该Fragment的Activity类实现这个接口,这样Fragment就能够调用这个回调方法,将数据传给Activity。

2、在Activity中调用Fragment中的方法:

第一种方法:在Activity中调用Fragment的方法, getFragmentManager().findFragmentById(R.id.xxx);

第二种方法:创建Bundle数据包,并调用Fragment对象的setArguments方法, 之后在Fragment类中调用getArguments;

3、在Fragment中调用Fragment中的方法:

第一种方法:通过宿主Activity调用另一个Fragment中的方法,getActivity().getFragmentManager().findFragmentById();

第二种方法:接口回调,在F1里面定义接口,Activity里面实现接口。通过回调实现F1与其父亲Activity的通信。在Activity接口回调方法里与F2通信,将参数传给F2;

第三种方法:使用广播,F1中将数据放在广播中发送,F2中接受广播,获取数据。

第四种方法:使用EventBus

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值