大家好,如果您还对深入解析:Android操作系统及其应用领域不太了解,没有关系,今天就由本站为大家分享深入解析:Android操作系统及其应用领域的知识,包括的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!
Fragment循环图看一下附着在Activity上的Fragment的生命状态图:
Fragment 和Activity 生命周期的综合图。 Fragment生命周期的方法真多,快来了解一下吧!去!去!去
Fragment生命周期方法含义:
public void onAttach(Context context)Fragment 与Activity 窗口关联后,将立即调用onAttach() 方法。从该方法开始,可以通过Fragment.getActivity()方法获取与Fragment关联的Activity窗口对象,但是由于Fragment的控件没有初始化,所以无法操作该控件。public void onCreate(Bundle savedInstanceState)调用onAttach()后,会立即调用onCreate()方法,可以在Bundle对象中获取Activity中传递的一些数据。通常,在该方法中读取保存的转换,并获取或初始化一些数据。不要在该方法中执行耗时的操作,否则Activity窗口将不会显示。public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)该方法是Fragment非常重要的生命周期方法,因为Fragment显示的View会在该方法中创建,inflater用于加载布局文件,container是该标签的父标签对应的对象,通过saveInstanceState参数可以获得Fragment保存的过渡状态。如果不保存,则为空。public void onViewCreated(View view,Bundle savedInstanceState)Android在Fragment中创建View对象后会立即回调该方法。 view参数是onCreateView中返回的视图,bundle对象用于一般用途。public void onActivityCreated(Bundle savedInstanceState)Activity的onCreate()方法执行后,Android系统会立即调用该方法,表明Activity窗口已经初始化。从此时起,您可以在Fragment中使用getActivity().findViewById(R.id)。xxx);来操作Activity中的视图。public void onStart()这个没什么好说的,但是你需要知道的一个细节是,当系统调用这个方法时,fragment已经显示在UI上了,但是无法与之交互,因为onResume()方法已经尚未被处决。public void onResume()该方法是Android系统从fragment的创建到显示的最后一个生命周期方法。调用该方法后,fragment就可以与用户进行交互了。public void onPause()片段从活动状态变为非活动执行时的第一个回调方法。通常可以用这种方法保存一些需要暂时暂停的工作。例如:保存音乐播放速度,然后在onResume()方法中恢复音乐播放进度。public void onStop()当onStop()返回时,片段将从屏幕上消失。public void onDestoryView()调用该方法意味着在onCreateView()中创建的视图将被移除。public void onDestroy()当Fragment不再使用时Android会调用该方法。需要注意的是,这是一个Fragment,并没有连接到Activity!并且可以获得Fragment对象,但是不能对获得的Fragment进行任何操作。public void onDetach()是Fragment生命周期中的最后一个方法。该方法执行后,Fragment不再与Activity关联。
Fragment比Activity多了几个额外的生命周期回调方法:
onAttach(Activity):当Fragment 与Activity 关联时使用。onCreateView(LayoutInflater,ViewGroup,Bundle):创建Fragment 的视图onActivityCreate(Bundle):当Activity 的onCreate() 方法返回时调用onDestoryView():对应onCreateView,当移除Fragment 的视图时调用onDetach():对应onAttach(),当调用当Fragment和Activity之间的关联被取消时。
注意:除了onCreateView()方法,其他的所有的方法如果你重写了,必须调用父类对于该方法的实现
管理fragment生命周期与管理activity生命周期很相像
和activity一样,fragment也有三种状态:
Resumed片段在正在运行的活动中可见。Paused另一个Activity 位于前台并获得焦点,但该Fragment 所在的Activity 仍然可见(前台Activity 部分透明,或者没有覆盖全屏)。Stopped片段不可见。主机活动已停止,或者片段已从活动中删除但已添加到返回堆栈中。停止的片段仍然存在(所有状态和成员信息仍然由系统保留)。但是,它不再对用户可见,并且如果Activity 被杀死,它也会被杀死。
————————————————————————————————
如果活动的进程被终止,则在重新创建活动时恢复片段状态。您可以执行fragment的onSaveIntanceState()来保存状态(注意:fragment在onCreate()、onCreateView()或onActivityCreate()中恢复)
在生命周期方面,activity和fragment之间一个很重要的不同是它在各自的返回堆栈中的存储方式。当activity停止时时,默认情况下该Activity放置在系统管理的Activity Back Stack中;fragment只有在删除事务时显式调用addToBackStack() 请求保存的实例才能删除片段。放置在由主机活动管理的返回堆栈上。
要创建片段,您必须创建片段的子类。一般来说,我们至少需要实现以下fragment生命周期方法: onCreate()、onCreateView()、onPause()@Override
public View onCreateView(LayoutInflater inflater, ViewGroup 容器,
捆绑已保存实例状态) {
//膨胀该片段的布局
返回inflater.inflate(R.layout.example_fragment,
容器,假);
}```
inflate()函数需要以下三个参数:
(1).要膨胀的布局的资源ID
(2).膨胀布局的父ViewGroup
(3)。一个布尔值,指示在inflate 期间正在inflate 的布局是否应附加到ViewGroup(第二个参数容器)。 (在本例中,传入false 是因为系统已经将膨胀的布局插入到容器中。—— 传入true 会在最终布局中创建一个额外的ViewGroup。)
#####Fragment和Activity之间的交互:
* 将片段添加到活动中
您可以在Activity 布局文件中声明Fragment,使用Fragment 标记将Fragment 插入到Activity 的布局中,或者使用应用程序源代码将其添加到现有ViewGroup 中。但片段不一定是活动布局的一部分。片段也可以无形地为活动工作。
**(1)。在活动布局文件中声明片段**
就像视图一样,可以为片段指定布局属性。代码如下:xml version="1.0"encoding="utf-8"? Fragment标签中的android:name属性指定了布局中实例化的Fragment类。
当系统创建Activity布局时,它会实例化布局文件中指定的每个Fragment,并为它们调用onCeateView()函数来获取每个Fragment的布局。系统直接将fragment返回的View插入到元素的位置。
**注意:每个片段都需要一个唯一的标识符。如果activity重新启动,系统可以用来恢复fragment(并且可以用来捕获fragment的事务处理,比如移除fragment)。可以通过三种方式为片段提供ID:**
1: 使用android:id 属性提供唯一标识符
2: 使用android:tag 属性提供唯一字符串。
3: 如果以上属性都不可用,系统将使用其容器视图(view)的ID。
**(2)。通过编码将片段添加到现有ViewGroup**
您可以在活动运行时随时将片段添加到活动布局中。要管理活动中的片段,您可以使用FragmentManager。可以通过在activity中调用getFragmentManager()来获取。您可以使用FragmentManager 执行以下操作,包括:
1: 使用findFragmentById()(用于在activity布局中提供带有接口的fragment或findFragmentByTag()来获取activity中存在的fragment(用于有或没有接口的fragment))
2: 使用popBackStack()(模仿用户的Back 命令)从返回堆栈中弹出片段。
3: 使用addOnBackStackChangeListener() 注册返回堆栈中更改的侦听器。
在Android中,对Fragment的事务操作是通过FragmentTranSaction来执行的。操作大致可以分为两类:
1: 显示:add()、replace()、show()、attach()
2: 隐藏:remove()、hide()、detach()
**注意**:当调用show() hide()方法时,Fragment的生命周期方法不会被执行,只会显示或隐藏Fragment的View。当执行replace()时(至少两个Fragment),会执行第二个Fragment的onAttach()方法和第一个Fragment的onPause()-onDetach()方法。同时,containerView会分离第一个Fragment的View。 add()方法执行onAttach()-onResume()生命周期,而remove()执行剩余的onPause()-onDetach()周期。
您可以从Activity 获取FragmentTransaction 的实例,如下所示: FragmentManagerfragmentManager=getFragmentManager()
FragmentTransactionfragmentTransaction=fragmentManager
.beginTransaction();```
您可以使用add() 函数添加片段,并指定要添加的片段以及要插入的视图(注意提交事务):
ExampleFragment 片段=new ExampleFragment();
fragmentTransaction.add(R.id.fragment_container, 片段);
fragmentTransaction.commit();```
**(3).添加无界面片段**
您还可以使用片段为活动提供后台操作,而无需呈现冗余的用户界面。要添加没有界面的片段,可以使用add(Fragment, String) (为片段提供唯一的字符串“标签”而不是视图ID)。通过这种方式添加了fragment,但是由于它没有与activity布局中的view关联,所以无法接收到onCreateView()调用。所以没有必要实现这个方法。对于无头片段,字符串标签是识别它的唯一方法。如果稍后想从Activity 中获取Fragment,则需要使用findFragmentByTag()。
* Fragment和Activity的交互可以通过Fragment.setArguments(Bundle args)和Fragment.getArguments()来实现。
#####Fragment状态的持久化:
由于Activity配置经常变化,因此附加到其上的Fragment需要保存其状态。持久化Fragment状态常用的方法有两种。
*方法1
状态可以通过``protected void onSaveInstanceState(Bundle outState), protected void onRestoreInstanceState(Bundle savingInstanceState)```来持久化。
* 方法2(更方便,让Android自动帮我们保存Fragment状态)
**1.** 我们只需要将整个Fragment保存为Activity中的变量即可。只要保存了Fragment,就会保存Fragment的状态,所以我们可以通过以下方法获取Fragment数据。 FragmentManager.putFragment(捆绑包,字符串键,片段
fragment) 是Activity 中保存Fragment 的方法。
FragmentManager.getFragment(Bundle捆绑,字符串键)
是获取Activity中保存的Fragment的方法。 ````
2.显然,上面1中的key是fragment的id,fragment就是你要保存状态的fragment。不过我们注意到,上面两个方法的第一个参数都是Bundle,也就是说FragmentManager通过Bundle来保存Fragments。不过这个方法只能保存Fragment中控件的状态,例如:用户在EditText中输入的文本(注意:这里需要给控件设置一个id值,否则Android不会保存该控件的状态)我们的控制)。 Fragment中需要持久化的变量仍然会丢失,但是还有一个解决办法,就是使用方法一!
3.以下是状态持久化示例代码:
/** Activity 中的代码**/
片段B片段B;
@覆盖
protected void onCreate(@Nullable Bundle savingInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_activity);
if(savedInstanceState!=null){
fragmentB=(FragmentB) getSupportFragmentManager()
.getFragment(savedInstanceState,"fragmentB");
}
初始化();
}
@覆盖
protected void onSaveInstanceState(Bundle outState) {
if( 片段B !=null ){
获取SupportFragmentManager()
.putFragment(outState,"fragmentB",fragmentB);
}
super.onSaveInstanceState(outState);
}
/** 在Fragment中保存变量的代码**/
@可为空
@覆盖
公共视图onCreateView(LayoutInflater inflater, @Nullable
ViewGroup 容器,@Nullable Bundle savingInstanceState) {
AppLog.e("onCreateView");
如果(空!=保存实例状态){
字符串保存字符串=保存实例状态
.getString("字符串");
//获取保存的字符串
}
查看根=inflater.inflate(R.layout.fragment_a,null);
返回根;
}
@覆盖
公共无效onSaveInstanceState(Bundle outState){
outState.putString("string","anAngryAnt");
super.onSaveInstanceState(outState);
}
静态的使用Fragment
1.集成Fragment,重写onCreateView(),确定Fragment的布局
2、在Activity中声明这个Fragment,就像普通View一样。
Fragment常用的API
android.support.v4.app.Fragment:主要用于定义Fragment android.support.v4.app.FragmentManager:主要用于操作Activity中的Fragment,可以使用FragmentMagager.findFragmentById()和FragmentMagager.findFragmentByTag()找到Fragment的方法android.support.v4.app.FragmentTransaction:为了保证一些Fragment操作的原子性,熟悉一下事务这个词。主要操作都是FragmentTransaction方法(一般为了向后兼容,我们会使用support.v4包中的Fragment)
getFragmentManager() //如果Fragment使用的是support.v4包,则使用getSupportFragmentManager,而不是链接:关于getChildFragmentManager()、getFragmentManager()、getSupportFragmentManager()的使用
主要操作有FragmentTransaction方法: FragmentTransaction transaction=fm.benginTransatcion();//启动事务
//向Activity添加一个Fragment
交易.add()
事务.remove()
//从Activity中移除一个Fragment,如果移除的Fragment没有添加到返回栈中
(回滚栈后面会详细讨论),这个Fragment实例就会被销毁。
交易.replace()
//使用另一个Fragment来替换当前的Fragment,其实就是remove()和add()的组合~
交易.隐藏()
//隐藏当前Fragment。它只是变得不可见,不会被破坏。
交易.show()
//显示之前隐藏的Fragment
分离()
//当片段被添加到返回堆栈时,该方法与*remove()*效果相同。
//相反,这个方法只是从视图中删除片段。
//该片段稍后仍然可以通过*attach()* 方法重用,
//调用*remove()*方法后,
//不仅Fragment会从视图中移除,而且该Fragment将不再可用。
附()
//重建视图,将其附加到UI并显示它。
交易.commit()
//提交事务在调用commit()之前,可以将事务添加到fragment事务回栈中(通过调用addToBackStatck())。该返回堆栈由活动管理,并允许用户通过按BACK 键返回到先前的片段状态。
在下面的代码中,一个片段替换了另一个片段,并且前一个片段状态保留在返回堆栈中:
片段newFragment=new ExampleFragment();
FragmentTransaction 事务=getFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);
事务.commit();```
**注意**:
如果添加多个更改事务(例如另一个add()或remove())并调用addToBackStack(),则调用commit()之前应用的所有更改都会作为单个事务添加到返回堆栈中,并按BACK键滚动它们回到一起。
当删除一个fragment时,如果调用addToBackStack(),该fragment将在之后停止,并且如果用户退出则恢复。
调用commit() 不会立即执行事务。相反,它采用预留方法,并且可以在活动的接口线程(主线程)准备就绪后运行。但是,如果需要,您可以从接口线程调用executePendingTransations()来立即执行commit()提交的事务。
您只能在活动保存状态之前(当用户离开活动时)使用commit() 提交事务。如果您尝试在该时间之后提交,则会引发异常。这是因为如果需要恢复Activity,则已提交的状态将会丢失。对于这种类型的丢失提交,可以使用commitAllowingStateLoss()
#####管理片段回滚堆栈
* 跟踪回滚堆栈的状态
我们通过实现“OnBackStackChangedListener”接口来实现后台堆栈状态跟踪。具体代码如下: //实现接口
公共类XXX 实现FragmentManager.OnBackStackChangedListener
//实现接口所要实现的方法
@覆盖
公共无效onBackStackChanged(){
//做你想做的事
}
//设置返回栈监听接口
getSupportFragmentManager().addOnBackStackChangedListener(this);
*管理回滚堆栈
**(1).````FragmentTransaction.addToBackStack(String)````**
将新添加的Fragment添加到返回栈中
**(2).````getSupportFragmentManager().getBackStackEntryCount()````**
获取返回堆栈中实体的数量
**(3).````getSupportFragmentManager().popBackStack(String name, int flags)````**
立即根据名称弹出栈顶的fragment
**(4).````getSupportFragmentManager().popBackStack(int id, int flags)````**
立即根据id弹出栈顶的fragment
**结论:相信自己,你一定会成为你想成为的人,加油! ---王令
QQ:2585085940
邮箱:wang91ling@163.com
【深入解析:Android操作系统及其应用领域】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
智能手机市场やっぱり安卓最受欢迎了!
有17位网友表示赞同!
安卓机子的价格还是挺容易接受的。
有16位网友表示赞同!
喜欢安卓那开放性和可定制性了,啥都能改动到。
有10位网友表示赞同!
用安卓系统太多年了,现在换其他的都不适应。
有9位网友表示赞同!
安卓手机上还有很多好用的小软件呢!
有15位网友表示赞同!
安卓的应用商店比其他的好像更多呢?
有8位网友表示赞同!
希望以后安卓系统的更新可以更快一点.
有19位网友表示赞同!
最近看一款新手机,是安卓系统,颜值挺高的呢。
有15位网友表示赞同!
安卓手机游戏兼容性确实强吧!
有6位网友表示赞同!
我爸用的安卓手机一直都没出现什么问题。
有18位网友表示赞同!
想尝试一下旗舰级的安卓手机,听说性能很厉害的。
有13位网友表示赞同!
朋友跟我推荐了一款安卓系统的新手机,说很流畅很好用。
有5位网友表示赞同!
安卓机子的相机功能越来越好了吧。
有7位网友表示赞同!
安卓手机自带的文件管理软件太好用啦!
有12位网友表示赞同!
安卓系统的图标设计也变得更简洁美观了。
有10位网友表示赞同!
安卓手机的电池续航性能也是挺不错的嘛。
有13位网友表示赞同!
有些游戏只有安卓平台上才有,所以安卓就比较方便。
有18位网友表示赞同!
安卓系统越来越智能化了,还挺有趣的。
有6位网友表示赞同!
安卓和苹果手机各有优缺点吧,喜欢哪个用哪个就好。
有20位网友表示赞同!
最近安卓系统的安全功能好像有所提升呢?
有15位网友表示赞同!