大家可以关注一下小编,小编以后会一直更新Android相关技术资料文章。

创建方式

静态创建

首先我们需要创建一个xml文件,然后创建与之对应的java文件,通过onCreatView()的返回方法进行关联,最后我们需要在Activity中进行配置相关参数即在Activity的xml文件中放上fragment的位置。

动态创建

动态创建Fragment主要有以下几个步骤:

创建待添加的fragment实例。

获取FragmentManager,在Activity中可以直接通过调用 getSupportFragmentManager()方法得到。

开启一个事务,通过调用beginTransaction()方法开启。

向容器内添加或替换fragment,一般使用repalce()方法实现,需要传入容器的id和待添加的fragment实例。

提交事务,调用commit()方法来完成。

Adapter对比

FragmnetPageAdapter在每次切换页面时,只是将Fragment进行分离,适合页面较少的Fragment使用以保存一些内存,对系统内存不会多大影响。

FragmentPageStateAdapter在每次切换页面的时候,是将Fragment进行回收,适合页面较多的Fragment使用,这样就不会消耗更多的内存

Activity生命周期

Activity的生命周期如下图:

动态加载:

动态加载时,Activity的onCreate()调用完,才开始加载fragment并调用其生命周期方法,所以在第一个生命周期方法onAttach()中便能获取Activity以及Activity的布局的组件;

静态加载:

1.静态加载时,Activity的onCreate()调用过程中,fragment也在加载,所以fragment无法获取到Activity的布局中的组件,但为什么能获取到Activity呢?

2.原来在fragment调用onAttach()之前其实还调用了一个方法onInflate(),该方法被调用时fragment已经是和Activity相互结合了,所以可以获取到对方,但是Activity的onCreate()调用还未完成,故无法获取Activity的组件;

3.Activity的onCreate()调用完成是,fragment会调用onActivityCreated()生命周期方法,因此在这儿开始便能获取到Activity的布局的组件;

与Activity通信

fragment不通过构造函数进行传值的原因是因为横屏切换的时候获取不到值。

Activity向Fragment传值:

Activity向Fragment传值,要传的值放到bundle对象里;

在Activity中创建该Fragment的对象fragment,通过调用setArguments()传递到fragment中;

在该Fragment中通过调用getArguments()得到bundle对象,就能得到里面的值。

Fragment向Activity传值:

第一种:

在Activity中调用getFragmentManager()得到fragmentManager,,调用findFragmentByTag(tag)或者通过findFragmentById(id),例如:

FragmentManager fragmentManager = getFragmentManager();Fragment fragment = fragmentManager.findFragmentByTag(tag);

第二种:

通过回调的方式,定义一个接口(可以在Fragment类中定义),接口中有一个空的方法,在fragment中需要的时候调用接口的方法,值可以作为参数放在这个方法中,然后让Activity实现这个接口,必然会重写这个方法,这样值就传到了Activity中

Fragment与Fragment之间是如何传值的:

第一种:

通过findFragmentByTag得到另一个的Fragment的对象,这样就可以调用另一个的方法了。

第二种:

通过接口回调的方式。

第三种:

通过setArguments,getArguments的方式。

api区别

add

一种是add方式来进行show和add,这种方式你切换fragment不会让fragment重新刷新,只会调用onHiddenChanged(boolean isHidden)。

replace

而用replace方式会使fragment重新刷新,因为add方式是将fragment隐藏了而不是销毁再创建,replace方式每次都是重新创建。

commit/commitAllowingStateLoss

两者都可以提交fragment的操作,唯一的不同是第二种方法,允许丢失一些界面的状态和信息,几乎所有的开发者都遇到过这样的错误:无法在activity调用了onSaveInstanceState之后再执行commit(),这种异常时可以理解的,界面被系统回收(界面已经不存在),为了在下次打开的时候恢复原来的样子,系统为我们保存界面的所有状态,这个时候我们再去修改界面理论上肯定是不允许的,所以为了避免这种异常,要使用第二种方法。

懒加载

我们经常在使用fragment时,常常会结合着viewpager使用,那么我们就会遇到一个问题,就是初始化fragment的时候,会连同我们写的网络请求一起执行,这样非常消耗性能,最理想的方式是,只有用户点开或滑动到当前fragment时,才进行请求网络的操作。因此,我们就产生了懒加载这样一个说法。

Viewpager配合fragment使用,默认加载前两个fragment。很容易造成网络丢包、阻塞等问题。

在Fragment中有一个setUserVisibleHint这个方法,而且这个方法是优于onCreate()方法的,它会通过isVisibleToUser告诉我们当前Fragment我们是否可见,我们可以在可见的时候再进行网络加载。

从log上看setUserVisibleHint()的调用早于onCreateView,所以如果在setUserVisibleHint()要实现懒加载的话,就必须要确保View以及其他变量都已经初始化结束,避免空指针。

使用步骤:

申明一个变量isPrepare=false,isVisible=false,标明当前页面是否被创建了

在onViewCreated周期内设置isPrepare=true

在setUserVisibleHint(boolean isVisible)判断是否显示,设置isVisible=true

判断isPrepare和isVisible,都为true开始加载数据,然后恢复isPrepare和isVisible为false,防止重复加载。

关于Android Fragment的懒加载,可以参考下面的链接:Fragment的懒加载

Activity

Activity启动流程

用户从Launcher程序点击应用图标可启动应用的入口Activity,Activity启动时需要多个进程之间的交互,Android系统中有一个zygote进程专用于孵化Android框架层和应用层程序的进程。还有一个system_server进程,该进程里运行了很多binder service。例如ActivityManagerService,PackageManagerService,WindowManagerService,这些binder service分别运行在不同的线程中,其中ActivityManagerService负责管理Activity栈,应用进程,task。

点击Launcher图标来启动Activity

用户在Launcher程序里点击应用图标时,会通知ActivityManagerService启动应用的入口Activity,ActivityManagerService发现这个应用还未启动,则会通知Zygote进程孵化出应用进程,然后在这个dalvik应用进程里执行ActivityThread的main方法。应用进程接下来通知ActivityManagerService应用进程已启动,ActivityManagerService保存应用进程的一个代理对象,这样ActivityManagerService可以通过这个代理对象控制应用进程,然后ActivityManagerService通知应用进程创建入口Activity的实例,并执行它的生命周期方法。

Android绘制流程窗口启动流程分析

Activity生命周期

Activity的形态

Active/Running:

Activity处于活动状态,此时Activity处于栈顶,是可见状态,可与用户进行交互。

Paused:

当Activity失去焦点时,或被一个新的非全屏的Activity,或被一个透明的Activity放置在栈顶时,Activity就转化为Paused状态。但我们需要明白,此时Activity只是失去了与用户交互的能力,其所有的状态信息及其成员变量都还存在,只有在系统内存紧张的情况下,才有可能被系统回收掉。

Stopped:

当一个Activity被另一个Activity完全覆盖时,被覆盖的Activity就会进入Stopped状态,此时它不再可见,但是跟Paused状态一样保持着其所有状态信息及其成员变量。

Killed:

当Activity被系统回收掉时,Activity就处于Killed状态。

Activity会在以上四种形态中相互切换,至于如何切换,这因用户的操作不同而异。了解了Activity的4种形态后,我们就来聊聊Activity的生命周期。

Activity的生命周期

所谓的典型的生命周期就是在有用户参与的情况下,Activity经历从创建,运行,停止,销毁等正常的生命周期过程。

onCreate

该方法是在Activity被创建时回调,它是生命周期第一个调用的方法,我们在创建Activity时一般都需要重写该方法,然后在该方法中做一些初始化的操作,如通过setContentView设置界面布局的资源,初始化所需要的组件信息等。

onStart

此方法被回调时表示Activity正在启动,此时Activity已处于可见状态,只是还没有在前台显示,因此无法与用户进行交互。可以简单理解为Activity已显示而我们无法看见摆了。

onResume

当此方法回调时,则说明Activity已在前台可见,可与用户交互了(处于前面所说的Active/Running形态),onResume方法与onStart的相同点是两者都表示Activity可见,只不过onStart回调时Activity还是后台无法与用户交互,而onResume则已显示在前台,可与用户交互。当然从流程图,我们也可以看出当Activity停止后(onPause方法和onStop方法被调用),重新回到前台时也会调用onResume方法,因此我们也可以在onResume方法中初始化一些资源,比如重新初始化在onPause或者onStop方法中释放的资源。

onPause

此方法被回调时则表示Activity正在停止(Paused形态),一般情况下onStop方法会紧接着被回调。但通过流程图我们还可以看到一种情况是onPause方法执行后直接执行了onResume方法,这属于比较极端的现象了,这可能是用户操作使当前Activity退居后台后又迅速地再回到到当前的Activity,此时onResume方法就会被回调。当然,在onPause方法中我们可以做一些数据存储或者动画停止或者资源回收的操作,但是不能太耗时,因为这可能会影响到新的Activity的显示——onPause方法执行完成后,新Activity的onResume方法才会被执行。

onStop

一般在onPause方法执行完成直接执行,表示Activity即将停止或者完全被覆盖(Stopped形态),此时Activity不可见,仅在后台运行。同样地,在onStop方法可以做一些资源释放的操作(不能太耗时)。

onRestart

表示Activity正在重新启动,当Activity由不可见变为可见状态时,该方法被回调。这种情况一般是用户打开了一个新的Activity时,当前的Activity就会被暂停(onPause和onStop被执行了),接着又回到当前Activity页面时,onRestart方法就会被回调。

onDestroy

此时Activity正在被销毁,也是生命周期最后一个执行的方法,一般我们可以在此方法中做一些回收工作和最终的资源释放。

总结

当Activity启动时,依次会调用onCreate(),onStart(),onResume(),而当Activity退居后台时(不可见,点击Home或者被新的Activity完全覆盖),onPause()和onStop()会依次被调用。当Activity重新回到前台(从桌面回到原Activity或者被覆盖后又回到原Activity)时,onRestart(),onStart(),onResume()会依次被调用。当Activity退出销毁时(点击back键),onPause(),onStop(),onDestroy()会依次被调用,到此Activity的整个生命周期方法回调完成。现在我们再回头看看之前的流程图,应该是相当清晰了吧。嗯,这就是Activity整个典型的生命周期过程。

小编在这里祝福大家都能找到比图片里还漂亮的小姐姐做老婆

android activity 显示无焦点_Android面试题集锦之fragemnt相关推荐

  1. android setflag找不到_Android面试题4–Activity之Intent的Flag

    再详细讲解之前先说一下一个小细节: Intent的setFlag和addFlag有什么区别?是不是之前都没有太注意这个问题呢? 简单可以理解成:setFlag是把之前的替换掉,addFlag是添加新的 ...

  2. android studio 显示view树_Android手势分发和嵌套滚动机制

    前言   对于一个Android开发者而言,要开发一个APP你必须要了解事件分发,而要开发一个优秀的APP你就必须要理解嵌套滚动.   在Android的开发体系里面,手势体系是一块非常重要的内容.从 ...

  3. android studio 显示view树_Android 沉浸式解析和轮子使用

    文 | 黑羽 on 移动电商 前言 我们先一起来回顾一下实现沉浸式状态栏的一般套路.在 Android 上,关于对 StatusBar(状态栏)的操作,一直都在不断改善,并且表现越来越好,在 Andr ...

  4. android无焦点跑马灯滚动,Android跑马灯无焦点滚动

    如果对显示没有特别要求可以直接使用属性就能做到,在布局文件中将TextView属性设置一下: android:layout_width="fill_parent" android: ...

  5. android释放焦点_Android videoview抢占焦点的处理方法

    问题描述: android 机顶盒应用: 应用程序主界面(MainActivity)只有两个控件,一个videoview和一个button. 视频框设置无焦点,按键有焦点. 首次进入应用时焦点正常,聚 ...

  6. Android UI设计——ViewPager中设置底部显示圆点焦点(二)

    ViewPager中设置底部显示圆点焦点这种使用其实还是很常见的,对于这个功能的实现其实有很多方式: 1. 通过在显示图片中加入圆点,也就是我们可以直接使用带圆点的图片. 2. 通过在代码中实现这一功 ...

  7. android studio logcat 无筛选 显示全部日志 无应用包名区分

    android studio logcat 无筛选 显示全部日志 无应用包名区分 不显示所有应用 出现这个情况后很多同学无法解决,重启adb,重启studio,重启电脑,都是没用的... 其实是有个开 ...

  8. java推送数据给安卓,java – 如何从Firebase推送通知中获取数据并将其显示在Android Activity中?...

    对不起这个noob问题,我是 android开发的新手.我目前正在开发一个项目,需要向安装了我的应用程序的 Android设备发送推送通知.我已经按照firebase的快速入门教程完成了这项工作,并在 ...

  9. [转]无焦点显示窗口解决方法 [转]AttachThreadInput的用法

    tag: 激活无焦点窗口 转自:http://blog.csdn.net/abcpanpeng/archive/2009/12/29/5099580.aspx 1.不同线程的处理方法 如何在2K/xp ...

最新文章

  1. Go 分布式学习利器(11)-- Go语言通过单链表 实现队列
  2. Docker 安装registry (构建私有镜像库)
  3. ITU-T Technical Paper: QoS 测量 (目标,方法,协议)
  4. 业务工作流平台设计(六)
  5. 什么是 Design System
  6. python画动态爱心-【Python】五分钟画一条动态心形曲线~
  7. 【算法30】从数组中选择k组长度为m的子数组,要求其和最小
  8. docker的镜像创建与Dockefile的编写
  9. 接口中的默认方法和静态方法
  10. jq 在字符串中,去掉指定的元素
  11. 灯亮怎么办_车辆隔音效果不好怎么办?
  12. xml引入约束示例(xsd文件)
  13. 20h2是04服务器操作系统吗,爆料:微软 Win10 20H2 将是小更新
  14. textView设置粗体以及textView文字中划线
  15. 光继电器一体化控制实训系统
  16. ADS1115的四通道使用
  17. 机器学习为什么也可以像人一样认识cang老师
  18. 无法重命名,文件不可信,后台被自动关闭,“Notebook Untitled.ipynb is not trusted jupyter”
  19. JS实现waterfall
  20. 搭建云服务器简单流程【华为云服务器】

热门文章

  1. viewpager默认界面_使用默认方法的界面演变–第一部分:方法
  2. javaone_Javaone 2013评论
  3. 使用精确的Java方法参数
  4. JUnit 5 –动态测试
  5. java swing游戏_Java Swing井字游戏
  6. openshift_红帽Openshift:入门–云中的Java EE6
  7. 如何使用Hibernate批处理DELETE语句
  8. Java 8流和Lambda表达式–解析文件示例
  9. 为什么应该避免JSF
  10. 当字符串为空但不为空时