理解Fragment生命周期

理解Fragment生命周期
理解Fragment生命周期

理解Fragment生命周期

官网帮助文档链接:

https://www.360docs.net/doc/1015174128.html,/guide/components/fragments.html

主要看两张图,和跑代码

一,Fragment的生命周二,与Activity生命周期的对比

场景演示: 切换到该Fragment

11-29 14:26:35.095: D/AppListFragment(7649): onAttach

11-29 14:26:35.095: D/AppListFragment(7649): onCreate

11-29 14:26:35.095: D/AppListFragment(7649): onCreateView

11-29 14:26:35.100: D/AppListFragment(7649): onActivityCreated

11-29 14:26:35.120: D/AppListFragment(7649): onStart

11-29 14:26:35.120: D/AppListFragment(7649): onResume

屏幕灭掉:

11-29 14:27:35.185: D/AppListFragment(7649): onPause

11-29 14:27:35.205: D/AppListFragment(7649): onSaveInstanceState 11-29 14:27:35.205: D/AppListFragment(7649): onStop

屏幕解锁

11-29 14:33:13.240: D/AppListFragment(7649): onStart

11-29 14:33:13.275: D/AppListFragment(7649): onResume

切换到其他Fragment:

11-29 14:33:33.655: D/AppListFragment(7649): onPause

11-29 14:33:33.655: D/AppListFragment(7649): onStop

11-29 14:33:33.660: D/AppListFragment(7649): onDestroyView

切换回本身的Fragment:

11-29 14:33:55.820: D/AppListFragment(7649): onCreateView

11-29 14:33:55.825: D/AppListFragment(7649): onActivityCreated

11-29 14:33:55.825: D/AppListFragment(7649): onStart

11-29 14:33:55.825: D/AppListFragment(7649): onResume

回到桌面

11-29 14:34:26.590: D/AppListFragment(7649): onPause

11-29 14:34:26.880: D/AppListFragment(7649): onSaveInstanceState 11-29 14:34:26.880: D/AppListFragment(7649): onStop

回到应用

11-29 14:36:51.940: D/AppListFragment(7649): onStart

11-29 14:36:51.940: D/AppListFragment(7649): onResume

退出应用

11-29 14:37:03.020: D/AppListFragment(7649): onPause

11-29 14:37:03.155: D/AppListFragment(7649): onStop

11-29 14:37:03.155: D/AppListFragment(7649): onDestroyView

11-29 14:37:03.165: D/AppListFragment(7649): onDestroy

11-29 14:37:03.165: D/AppListFragment(7649): onDetach

比Activity多了一些生命周期,完整和Activity对接上,大家好好利用。

fragment与activity之间通信原理以及例子

首先,如果你想在android3.0及以下版本使用fragment,你必须引用android-support-v4.jar这个包

然后你写的activity不能再继承自Activity类了,而是要继承android.support.v4.app.FragmentActivity,一些其他的父类也有相应的变化.

由于在android的实现机制中fragment和activity会被分别实例化为两个不相干的对象,他们之间的联系由activity 的一个成员对象fragmentmanager来维护.fragment实例化后会到activity中的fragmentmanager去注册一下,这个动作封装在fragment对象的onAttach中,所以你可以在fragment中声明一些回调接口,当fragment调用onAttach 时,将这些回调接口实例化,这样fragment就能调用各个activity的成员函数了,当然activity必须implements这些接口,否则会包classcasterror

fragment和activity的回调机制又是OOP的一次完美演绎!

下面通过一个例子来说明:

我把Activity的UI分为两个部分,左边和右边,左边用来放置点击的按钮(LeftFragment),右边用来放置对应点击后显示的信息(RightFragment).

Activity的布局layout文件:main.xml

[html]view plaincopy

1.

2.

3.android:layout_width="fill_parent"

4.android:layout_height="fill_parent"

5.android:orientation="horizontal">

6.

7.

8.android:id="@+id/left_layout"

9.android:layout_width="wrap_content"

10.android:layout_height="fill_parent"

11.android:layout_weight="1"

12.android:orientation="vertical">

13.

14.

15.

16.android:id="@+id/right_layout"

17.android:layout_width="wrap_content"

18.android:layout_height="fill_parent"

19.android:layout_weight="10"

20.android:orientation="vertical">

21.

22.

23.

LeftFragment的布局layout:leftfragment.xml

[html]view plaincopy

1.

2.

3.android:layout_width="match_parent"

4.android:layout_height="match_parent"

5.android:orientation="vertical">

6.

7.

8.android:id="@+id/first_button"

9.android:layout_width="fill_parent"

10.android:layout_height="wrap_content"

11.android:text="@string/first_button"/>

12.

13.

14.android:id="@+id/second_button"

15.android:layout_width="fill_parent"

16.android:layout_height="wrap_content"

17.android:text="@string/second_button"/>

18.

19.

20.android:id="@+id/third_button"

21.android:layout_width="fill_parent"

22.android:layout_height="wrap_content"

23.android:text="@string/third_button"/>

24.

25.

RightFragment的布局layout:rightfragment.xml

[html]view plaincopy

1.

2.

3.android:layout_width="match_parent"

4.android:layout_height="match_parent"

5.android:orientation="vertical">

6.

7.

8.android:id="@+id/right_show_message"

9.android:layout_width="fill_parent"

10.android:layout_height="fill_parent"

11.android:background="@android:color/holo_orange_dark"

12.android:textColor="@android:color/white"/>

13.

14.

以上是两个fragment和一个Activity的布局文件,下面来看他们的java文件

Activity:

[java]view plaincopy

1.public class FirstActivity extends Activity implements MyListener

2.{

3./**

4. * 实现MyListener,当LeftFragment中点击第一页的时候,让RightFragment显示第一页信息,同理当点击第二页

的时候,RightFragment显示第二页信息

5. *

6. * @param index

7. * 显示的页数

8. */

9.public void showMessage(int index)

10. {

11.if (1 == index)

12. showMessageView.setText(R.string.first_page);

13.if (2 == index)

14. showMessageView.setText(R.string.second_page);

15.if (3 == index)

16. showMessageView.setText(R.string.third_page);

17. }

18.

19./** 得到RightFragment中显示信息的控件 */

20.private TextView showMessageView;

21.

22./** Called when the activity is first created. */

23.@Override

24.public void onCreate(Bundle savedInstanceState)

25. {

26.super.onCreate(savedInstanceState);

27. setContentView(https://www.360docs.net/doc/1015174128.html,yout.main);

28. System.out.println("Activity--->onCreate");

29.

30. FragmentManager manager = getFragmentManager();

31. FragmentTransaction transaction = manager.beginTransaction();

32.// 动态增加Fragment

33. RightFragment rightFragment = new RightFragment();

34. LeftFragment leftFragment = new LeftFragment();

35. transaction.add(R.id.left_layout, leftFragment, "leftfragment");

36. transaction.add(R.id.right_layout, rightFragment, "rightfragment");

37. https://www.360docs.net/doc/1015174128.html,mit();

38.

39. }

40.

41.@Override

42.protected void onResume()

43. {

44.super.onResume();

45. System.out.println("Activity--->onResume"); //注意:findview放到这里

46. showMessageView = (TextView) findViewById(R.id.right_show_message);

47. }

48.}

LeftFragment:

[java]view plaincopy

1.public class LeftFragment extends Fragment

2.{

3./** Acitivity要实现这个接口,这样Fragment和Activity就可以共享事件触发的资源了 */

4.public interface MyListener

5. {

6.public void showMessage(int index);

7. }

8.

9.private MyListener myListener;

10.private Button firstButton;

11.private Button secondButton;

12.private Button thirdButton;

13.

14./** Fragment第一次附属于Activity时调用,在onCreate之前调用 */

15.@Override

16.public void onAttach(Activity activity)

17. {

18.super.onAttach(activity);

19. System.out.println("LeftFragment--->onAttach");

20.

21. myListener = (MyListener) activity;

22. }

23.

24.@Override

25.public void onCreate(Bundle savedInstanceState)

26. {

27.super.onCreate(savedInstanceState);

28. System.out.println("LeftFragment--->onCreate");

29. }

30.

31.@Override

32.public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceSta

te)

33. {

34. System.out.println("LeftFragment--->onCreateView");

35.return inflater.inflate(https://www.360docs.net/doc/1015174128.html,yout.leftfragment, container, false);

36. }

37.

38.@Override

39.public void onResume()

40. {

41.super.onResume();

42. System.out.println("LeftFragment--->onResume");

43.

44. firstButton = (Button) getActivity().findViewById(R.id.first_button);

45. secondButton = (Button) getActivity().findViewById(R.id.second_button);

46. thirdButton = (Button) getActivity().findViewById(R.id.third_button);

47.

48. MyButtonClickListener clickListener = new MyButtonClickListener();

49. firstButton.setOnClickListener(clickListener);

50. secondButton.setOnClickListener(clickListener);

51. thirdButton.setOnClickListener(clickListener);

52. }

53.

54./** 按钮的监听器 */

55.class MyButtonClickListener implements OnClickListener

56. {

57.public void onClick(View v)

58. {

59. Button button = (Button) v;

60.if (button == firstButton)

61. myListener.showMessage(1);

62.if (button == secondButton)

63. myListener.showMessage(2);

64.if (button == thirdButton)

65. myListener.showMessage(3);

66. }

67. }

68.}

RightFragment:

[java]view plaincopy

1.public class RightFragment extends Fragment

2.{

3.@Override

4.public void onCreate(Bundle savedInstanceState)

5. {

6. System.out.println("RightFragment--->onCreate");

7.super.onCreate(savedInstanceState);

8. }

9.

10.@Override

11.public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceSta

te)

12. {

13. System.out.println("RightFragment--->onCreateView");

14.return inflater.inflate(https://www.360docs.net/doc/1015174128.html,yout.rightfragment, container, false);

15. }

16.}

注意,Fragment的生命周期和Activity生命周期之间的关系。在Activity里动态生成Fragment,首先是Activity调用onCreate()方法,但是这时候还没有加载到Fragment里的组件,当Fragment调用其onCreateView()方法后,Activity才能得到Fragment中的组件

这里最关键的就是Fragment要有一个接口和这个接口的引用,而这个接口需要Activity去实现它。当Fragment 调用onAttach(Activity acitivity)方法的时候,将这个activity传递给这个接口引用,这样,就可以和Activity进行交互了.

Fragment 是activity 的界面中的一部分或一种行为。可以把多个Fragment 组合到一个activity 中来创建一个多面界面并且可以在多个activity 中重用一个Fragment。可以把Fragment 认为模块化的一段activity,它具有自己的生命周期,接收它自己的事件,并可以在activity 运行时被添加或删除。

Fragment 不能独立存在,它必须嵌入到activity 中,而且Fragment 的生命周期直接受所在的activity 的影响。例如:当activity 暂停时,它拥有的所有的Fragment 都暂停了,当activity 销毁时,它拥有的所有Fragment 都被销毁。然而,当activity 运行时(在onResume()之后,onPause()之前),可以单独地操作每个Fragment, 比如添加或删除它们。当在执行上述针对Fragment 的事务时,可以将事务添加到一个栈中,这个栈被activity 管理,栈中的每一条都是一个Fragment 的一次事务。有了这个栈,就可以反向执行Fragment 的事务,这样就可以在Fragment 级支持“返回”键(向后导航)。

当向activity 中添加一个Fragment 时,它须置于ViewGroup 控件中,并且需定义Fragment 自己的界面。可以在layoutxml 文件中声明Fragment,元素为:;也可以在代码中创建Fragment,然后把它加入到ViewGroup 控件中。然而,Fragment 不一定非要放在activity 的界面中,它可以隐藏在后台为actvitiy 工作。

1.1.2 生命周期

onCreate():

当创建fragment 时系统调用此方法。在其中必须初始化fragment 的基础组件们。可参考activity 的说明。onCreateView():

系统在fragment 要画自己的界面时调用(在真正显示之前)此方法。这个方法必须返回frament 的layout 的根控件。如果这个fragment 不提供界面,那它应返回null。

onPause():

大多数程序应最少对fragment 实现这三个方法。当然还有其它几个回调方法可应该按情况实现之。所有的生命周期回调函数在“操控fragment 的生命周期”一节中有详细讨论。

下图为fragment 的生命周期(它所在的activity 处于运行状态)。

添加Fragments onAttach() onCreate()

onCreateView()

onActivityCreated()

onStart()

onResume()

Fragments是活动的(正在使用)

Fragment从

返回堆栈中返回到布局文件

用户使用返回功能或Fragments 被移除(替换)

Fragments被

添加到返回堆栈中,接着被移除(替换)

onPause()

onStop

onDestroyView()

onDestroy()

onDetach()

Fragments被销毁

图 1 Fragment 生命周期

1.1.3 派生类

DialogFragment

显示一个浮动的对话框。使用这个类创建对话框是替代activity 创建对话框的最佳选择.因为可以把fragmentdialog 放入到activity 的返回栈中,使用户能再返回到这个对话框。

ListFragment

显示一个列表控件,就像ListActivity 类,它提供了很多管理列表的方法,比如onListItemClick()方法响应click 事件。PreferenceFragment

显示一个由Preference 对象组成的列表,与PreferenceActivity 相同。它用于为程序创建“设置”activity。

1.2 范例

写一个读新闻的程序,可以用一个fragment 显示标题列表,另一个fragment 显示选中标题的内容,这两个fragment 都在一个activity 上,并排显示。那么这两个fragment 都有自己的生命周期并响应自己感兴趣的事件。于是,不需再像手机上那样用一个activity 显示标题列表,用另一个activity 显示新闻内容;现在可以把两者放在一个activity 上同时显示出来。如下图:

图 2 Fragment 说明性示例

Fragment 必须被写成可重用的模块。因为fragment 有自己的layout,自己进行事件响应,拥有自己的生命周期

和行为,所以可以在多个activity 中包含同一个Fragment 的不同实例。这对于让界面在不同的屏幕尺寸下都能给用户完美的体验尤其重要。比如可以在程序运行于大屏幕中时启动包含很多fragment 的activity,而在运行于小屏幕时启动一个包含少量fragment 的activity。

刚才读新闻的程序,当检测到程序运行于大屏幕时,启动activityA,将标题列表和新闻内容这两个fragment 都放在activityA 中;当检测到程序运行于小屏幕时,还是启动activityA,但此时A 中只有标题列表fragment,当选中一个标题时,activityA 启动activityB,B 中含有新闻内容fragment。

1.3 创建Fragmet

要创建fragment,必须从Fragment 或Fragment 的派生类派生出一个类。Fragment 的代码写起来有些像activity。它具有跟activity 一样的回调方法,比如onCreate(),onStart(),onPause()和onStop()。实际上,如果想把老的程序改为使用fragment,基本上只需要把activity 的回调方法的代码移到fragment 中对应的方法即可。

1.3.1 添加有界面的Fragment

Fragment 一般作为activity 的用户界面的一部分,把它自己的layout 嵌入到activity 的layout 中。一个要为fragment 提供layout,必须实现onCreateView()回调方法,然后在这个方法中返回一个View 对象,这个对象是fragment 的layout 的根。

注意:如果的fragment 是从ListFragment 中派生的,就不需要实现onCreateView()方法了,因为默认的实现已经为返回了ListView 控件对象。

要从onCreateView()方法中返回layout 对象,可以从layoutxml 中生成layout 对象。为了帮助这样做, onCreateView()提供了一个LayoutInflater 对象。举例:以下代码展示了一个Fragment 的子类如何从layoutxml 文件example_fragment.xml 中生成对象。

PublicstaticclassExamp leFragmentextendsFragment{ @Override

P ublicV iew onCreat e View (L ay out Inflat erinflat er,View G roup cont ainer, BundlesavedInstanceState){

//Inflate the layout for this fragment

ret urninflat er.inflat e(R.l ay out .examp le_fra gm ent ,cont ainer,false) ; }

}

onCreateView()参数中的container 是存放fragment 的layout 的ViewGroup 对象。savedInstanceState 参数是一个Bundle,跟activity的onCreate()中Bundle差不多,用于状态恢复。但是fragment的onCreate() 中也有Bundle 参数,所以此处的Bundle 中存放的数据与onCreate()中存放的数据还是不同的。

Inflate()方法有三个参数:

layout 的资源ID。

存放fragment 的layout 的ViewGroup。

布尔型数据表示是否在创建fragment 的layout 期间,把layout 附加到container 上(在这个例子中,因为系统已经把layout 插入到container 中了,所以值为false,如果为true 会导至在最终的layout 中创建多余的ViewGroup)。

下面讲述如何把它添加到activity 中。把fragment 添加到activity 一般情况下,fragment 把它的layout 作为activitiy 的loyout 的一部分合并到activity 中,有两种方法将一个fragment 添加到activity 中:

方法一:在activity 的layoutxml 文件中声明fragment 如下代码,一个activity 中包含两个fragment:

Android:orientation=”horizontal” Android:layout_width=”match_parent”

Android:layout_height=”match_parent”>

Android:id=”@+id/list” Android:layout_weight=”1″ Android:layout_width=”0dp”

Android:layout_height=”match_parent”/>

And roid:id=”@+id/viewer” Android:layout_weight=”2″ Android:layout_width=”0dp”

Android:layout_height=”match_parent”/>

以上代码中,中声明一个fragment。当系统创建上例中的layout 时,它实例化每一个fragment,然后调用它们的onCreateView()方法,以获取每个fragment 的layout。系统把fragment 返回的view 对象插入到

元素的位置,直接代替元素。

注:每个fragment 都需要提供一个ID,系统在activity 重新创建时用它来恢复fragment,也可以用它来操作fragment 进行其它的事物,比如删除它。有三种方法给fragment 提供ID:

为Android:id 属性赋一个数字。

为Android:tag 属性赋一个字符串。

如果没有使用上述任何一种方法,系统将使用fragment 的容器的ID。

方法二:在代码中添加fragment 到一个ViewGroup

这种方法可以在运行时,把fragment 添加到activity 的layout 中。只需指定一个要包含fragment 的ViewGroup。

为了完成fragment 的事务(比如添加,删除,替换等),必须使用FragmentTransaction 的方法。

取到FragmentTransaction,如下:

FragmentManagerfragmentManager =getFragmentManager() FragmentTransactionfragmentTransaction=fragmentManager.beginTransaction();

然后可以用add()方法添加一个fragment,它有参数用于指定容纳fragment 的ViewGroup。如,Add()的第一个参数是容器ViewGroup,第二个是要添加的fragment。一旦通过FragmentTransaction 对fragment 做出了改变,必须调用方法commit()提交这些改变。不仅在无界面的fragment 中,在有界面的fragment 中也可以使用tag 来作为为一标志,这样在需要获取fragment 对象时,要调用findFragmentTag()。

1.3.2 添加没有界面的Fragment

上面演示了如何添加fragment 来提供界面,然而,也可以使用fragment 为activity 提供后台的行为而不用显示fragment 的界面。要添加一个没有界面的fragment,需在activity 中调用方法add(Fragment,String)(它支持用一个唯一的字符串做为fragment 的“tag”,而不是viewID)。这样添加的fragment 由于没有界面,所以在实现它时不需调用实现onCreateView()方法。

使用tag 字符串来标识一个fragment 并不是只能用于没有界面的fragment 上,也可以把它用于有界面的fragment 上,但是,如果一个fragment 没有界面,tag 字符串将成为它唯一的选择。获取以tag 标识的fragment,需使用方法findFragmentByTab()。

1.4 Frament 管理

要管理fragment,需使用FragmentManager,要获取它,需在activity 中调用方法getFragmentManager()。可以用FragmentManager 来做以上事情:

使用方法findFragmentById()或findFragmentByTag(),获取activity 中已存在的fragment

使用方法popBackStack()从activity 的后退栈中弹出fragment(这可以模拟后退键引发的动作)用方法addOnBackStackChangedListerner()注册一个侦听器以监视后退栈的变化

还可以使用FragmentManager 打开一个FragmentTransaction 来执行fragment 的事务,比如添加或删除fragment。

在activity 中使用fragment 的一个伟大的好处是能跟据用户的输入对fragment 进行添加、删除、替换以及执行其它动作的能力。提交的一组fragment 的变化叫做一个事务。事务通过FragmentTransaction 来执行。还可以把每个事务保存在activity 的后退栈中,这样就可以让用户在fragment 变化之间导航(跟在activity 之间导航一样)。

可以通过FragmentManager 来取得FragmentTransaction 的实例,如下: FragmentManagerfragmentManager = getFragmentManager(); FragmentTransactionfragmentTransaction =fragmentManager.beginTransaction(); 一个事务是在同一时刻执行的一组动作(很像数据库中的事务)。可以用add(),remove(),replace()等方法构成事

务,最后使用commit()方法提交事务。在调用commint()之前,可以用addToBackStack()把事务添加到一个后退栈中, 这个后退栈属于所在的activity。有了它,就可以在用户按下返回键时,返回到fragment 执行事务之前的状态。如下例:演示了如何用一个fragment 代替另一个fragment,同时在后退栈中保存被代替的fragment 的状态。

//Create new fragment and transaction

Fragment newFragment = newExampleFragment();

FragmentTransaction transaction=getFragmentManager().beginTransaction();

//Replace whatever is in the fragment_container view with thisfragment, //and add the transaction to the backstack

t ransact ion.rep lace(R.id.fra gm ent _cont ainer,new Fra gment );

transaction.addToBackStack(null) ;

//Commit the transaction https://www.360docs.net/doc/1015174128.html,mit();

解释:newFragment 代替了控件IDR.id.fragment_container 所指向的ViewGroup 中所含的任何fragment。然后调用addToBackStack(),此时被代替的fragment 就被放入后退栈中,于是当用户按下返回键时,事务发生回溯,原先的fragment 又回来了。

如果向事务添加了多个动作,比如多次调用了add(),remove()等之后又调用了addToBackStack()方法,那么所有的

在commit()之前调用的方法都被作为一个事务。当用户按返回键时,所有的动作都被反向执行(事务回溯)。

事务中动作的执行顺序可随意,但要注意以下两点:

必须最后调用commit()

如果添加了多个fragment,那么它们的显示顺序跟添加顺序一至(后显示的覆盖前面的) 如果在执行的事务中有删除fragment 的动作,而且没有调用addToBackStack(),那么当事务提交时,那些被删

除的fragment 就被销毁了。反之,那些fragment 就不会被销毁,而是处于停止状态。当用户返回时,它们会被恢复。但是,调用commit()后,事务并不会马上执行。它会在activity 的UI 线程(其实就是主线程)中等待直到线程能执行的时候才执行(废话)。如果必要,可以在UI 线程中调用executePendingTransactions()方法来立即执行事务。

但一般不需这样做,除非有其它线程在等待事务的执行。

注意:只能在activity 处于可保存状态的状态时,比如running 中,onPause()方法和onStop()方法中提交事务, 否则会引发异常。这是因为fragment 的状态会丢失。如果要在可能丢失状态的情况下提交事务,请使用commitAllowingStateLoss()。

1.5 Fragment 与Activity 通讯

尽管fragment 的实现是独立于activity 的,可以被用于多个activity,但是每个activity 所包含的是同一个fragment 的不同的实例。Fragment 可以调用getActivity()方法很容易的得到它所在的activity 的对象,然后就可以查找

activity 中的控件们(findViewById())。例如:

ViewlistView =getActivity().findViewById(R.id.list);同样的,activity 也可以通过FragmentManager 的方法查找它所包含的frament 们。

例如:

Examp leFra gment

fragment =(ExampleFragment)getFragmentManager().findFragmentById(R.id.example_fragment )有时,可能需要fragment 与activity 共享事件。一个好办法是在fragment 中定义一个回调接口,然后在activity 中实现之。例如,还是那个新闻程序的例子,它有一个activity,activity 中含有两个fragment。fragmentA 显示新闻标

题,fragmentB 显示标题对应的内容。fragmentA 必须在用户选择了某个标题时告诉activity,然后activity 再告诉fragmentB,fragmentB 就显示出对应的内容。

如下例,OnArticleSelectedListener 接口在fragmentA 中定义:

public static class FragmentA extends ListFragment{ //Container Activity must implement this interface

public interface OnArticleSelectedListener{

public void onArticleSelected(Uri articleUri);

}

然后activity 实现接口OnArticleSelectedListener,在方法onArticleSelected()中通知fragmentB。当fragment 添加到activity 中时,会调用fragment 的方法onAttach(),这个方法中适合检查activity 是否实现了OnArticleSelectedListener接口,检查方法就是对传入的activity 的实例进行类型转换,如下所示:

public static class FragmentA extends ListFragment{ OnArticleSelectedListenermListener;

@Override

public void onAttach(Activity activity){ super.onAttach(activity);

try{

mListener =(OnArticleSelectedListener)activity; }catch(ClassCastException e){

throw new ClassCastException(activity.toString()+”must implement OnArticleSelectedListener”); }

}

如果activity 没有实现那个接口,fragment 抛出ClassCastException 异常。如果成功了,mListener 成员变量保存OnArticleSelectedListener 的实例。于是fragmentA 就可以调用mListener 的方法来与activity 共享事件。例如,如果fragmentA 是一个ListFragment,每次选中列表的一项时,就会调用fragmentA 的onListItemClick() 方法,在这个方法中调用onArticleSelected()来与activity 共享事件,如下:

public static class FragmentA extends ListFragment{

OnArticleSelectedListenermListener;

@Override

public void onListItemClick(ListViewl,Viewv,intposition,long id){

//Ap pend the clicked item’s row ID with the content provider Uri

Uri noteUri =ContentUris.withAppendedId(ArticleColumns.CONTENT_URI,id); //Send the event and Uri to the host activity mListener.onArticleSelected(noteUri);

}

onListItemClick()传入的参数id 是列表的被选中的行ID,另一个fragment 用这个ID 来从程序的

ContentProvider中取得标题的内容。

现在Fragment的应用真的是越来越广泛了,之前Android在3.0版本加入Fragment的时候,主要是为了解决Android Pad屏幕比较大,空间不能充分利用的问题,但现在即使只是在手机上,也有很多的场景可以运用到Fragment了,今天我们就来学习其中一个特别棒的应用技巧。

很多手机应用都会有一个非常类似的功能,即屏幕的下方显示一行Tab标签选项,点击不同的标签就可以切换到不同的界面,如以下几个应用所示:

上面三个应用从左到右分别是QQ、新浪微博和支付宝钱包,可见,这种底部标签式的布局策略真的非常常见。

那么话说回来,这种效果到底是如何的呢?熟悉Android的朋友一定都会知道,很简单嘛,使用TabHost就OK了!但是殊不知,TabHost并非是那么的简单,它的可扩展性非常的差,不能随意地定制Tab项显示的内容,而且运行还要依赖于ActivityGroup。ActivityGroup原本主要是用于为每一个TabHost的子项管理一个单独的Activity,但目前已经被废弃了。为什么呢?当然就是因为Fragment的出现了!查看Android官方文档中ActivityGroup的描述,如下所示:

可以看到,在API 13的时候Android就已经将ActivityGroup废弃掉了,并且官方推荐的替代方式就是使用Fragment,因为它使用起来更加的灵活。那么剩下的问题就是如何借助Fragment来完成类似于TabHost一般的效果了,因此我们自然要动起手来了。

在开始之前,首先你必须已经了解Fragment的用法了,如果你对Fragment还比较陌生的话,建议先去阅读我前面的一篇文章Android Fragment完全解析,关于碎片你所需知道的一切。

另外,我们还应该准备好程序所需要的资源,比如说每一个Tab项中所用到的图片。我已经事先从QQ里截好了几张图作为这个项目的资源,稍后会连同源码一起给出。

新建一个项目,起名就叫FragmentDemo,这里我使用的是4.0的API。

下面开始编程工作,这里我们首先需要去编写一个类似于QQ的主界面,当然只会去编写界面最下方的TabHost 部分,而不会编写上面的内容界面部分,因为内容界面是应该写在Fragment的布局里的。打开或新建

activity_main.xml作为程序的主布局文件,在里面加入如下代码:

[html]view plaincopy

1.

2.android:layout_width="match_parent"

3.android:layout_height="match_parent"

4.android:orientation="vertical">

5.

6.

7.android:id="@+id/content"

8.android:layout_width="match_parent"

9.android:layout_height="0dp"

10.android:layout_weight="1">

11.

12.

13.

14.android:layout_width="match_parent"

15.android:layout_height="60dp"

16.android:background="@drawable/tab_bg">

17.

18.

19.android:id="@+id/message_layout"

20.android:layout_width="0dp"

21.android:layout_height="match_parent"

22.android:layout_weight="1">

23.

24.

25.android:layout_width="match_parent"

26.android:layout_height="wrap_content"

27.android:layout_centerVertical="true"

28.android:orientation="vertical">

29.

30.

31.android:id="@+id/message_image"

32.android:layout_width="wrap_content"

33.android:layout_height="wrap_content"

34.android:layout_gravity="center_horizontal"

35.android:src="@drawable/message_unselected"/>

36.

37.

38.android:id="@+id/message_text"

39.android:layout_width="wrap_content"

40.android:layout_height="wrap_content"

41.android:layout_gravity="center_horizontal"

42.android:text="消息"

43.android:textColor="#82858b"/>

44.

45.

46.

47.

48.android:id="@+id/contacts_layout"

49.android:layout_width="0dp"

50.android:layout_height="match_parent"

51.android:layout_weight="1">

52.

53.

54.android:layout_width="match_parent"

55.android:layout_height="wrap_content"

56.android:layout_centerVertical="true"

57.android:orientation="vertical">

58.

59.

60.android:id="@+id/contacts_image"

61.android:layout_width="wrap_content"

62.android:layout_height="wrap_content"

63.android:layout_gravity="center_horizontal"

64.android:src="@drawable/contacts_unselected"/>

65.

66.

67.android:id="@+id/contacts_text"

68.android:layout_width="wrap_content"

69.android:layout_height="wrap_content"

70.android:layout_gravity="center_horizontal"

71.android:text="联系人"

Activity生命周期详解

学习并掌握Activity生命周期,对从事Android开发(或者打算日后从事这方面的开发工作)的朋友来讲,是至关重要的。本文将用图解和实例的方式,向大家详细讲解Activity 生命周期的有关知识。 Activity有三个状态: 1.当它在屏幕前台时(位于当前任务堆栈的顶部),它是激活或运行状态。它就是响应用户操作的Activity。 2.当它上面有另外一个Activity,使它失去了焦点但仍然对用户可见时(如图),它处于暂停状态。在它之上的Activity没有完全覆盖屏幕,或者是透明的,被暂停的Activity仍然对用户可见,并且是存活状态(它保留着所有的状态和成员信息并保持和窗口管理器的连接)。如果系统处于内存不足时会杀死这个Activity。

3.当它完全被另一个Activity覆盖时则处于停止状态。它仍然保留所有的状态和成员信息。然而对用户是不可见的,所以它的窗口将被隐藏,如果其它地方需要内存,则系统经常会杀死这个Activity。 当Activity从一种状态转变到另一种状态时,会调用以下保护方法来通知这种变化: void onCreate(Bundle savedInstanceState) void onStart()

void onRestart() void onResume() void onPause() void onStop() void onDestroy() 这七个方法定义了Activity的完整生命周期。实现这些方法可以帮助我们监视其中的三个嵌套生命周期循环: Activity的完整生命周期自第一次调用onCreate()开始,直至调用onDestroy()为止。Activity 在onCreate()中设置所有“全局”状态以完成初始化,而在onDestroy()中释放所有系统资源。例如,如果Activity有一个线程在后台运行从网络下载数据,它会在onCreate()创建线程,而在onDestroy()销毁线程。 Activity的可视生命周期自onStart()调用开始直到相应的onStop()调用结束。在此期间,用户可以在屏幕上看到Activity,尽管它也许并不是位于前台或者也不与用户进行交互。在这两个方法之间,我们可以保留用来向用户显示这个Activity所需的资源。例如,当用户不再看见我们显示的内容时,我们可以在onStart()中注册一个BroadcastReceiver来监控会影响UI的变化,而在onStop()中来注消。onStart() 和onStop() 方法可以随着应用程序是否为用户可见而被多次调用。 Activity的前台生命周期自onResume()调用起,至相应的onPause()调用为止。在此期间,Activity位于前台最上面并与用户进行交互。Activity会经常在暂停和恢复之间进行状态转换——例如当设备转入休眠状态或者有新的Activity启动时,将调用onPause() 方法。当

Android Fragment使用详解

Fragment(一) 1. 继承关系 https://www.360docs.net/doc/1015174128.html,ng.Object |__android.app.Fragment 实现接口:ComponentCallbacks2 View.OnCreateContextMenuListener 引入版本:API Level 11 已知的子类: DialogFragment、ListFragment、PreferenceFragment、WebViewFragment 2. 类概要 一个Fragment是应用程序的用户界面或行为的一个片段,它能够被放置在一个Activity中。通过FragmentManager对象来实现与Fragment对象的交互,能够通过Activity.getFragmentManager()方法和Fragment.getFragmentManager()方法来获取FragmentManager对象。 Fragment类有着广泛的应用,它的核心是代表了一个正在较大的Activity中运行的特俗的操作或界面。Fragment对象跟它所依附的Activity对象是紧密相关的,并且不能被分开使用。尽管Fragment对象定义了它们自己的生命周期,但是这个生命周期要依赖与它所在的Activity:如果该Activity被终止,那么它内部的Fragment是不能被启动的;当Activity被销毁时,它内部的所有Fragment对象都会被销毁。 所有的Fragment子类都必须包含一个公共的空的构造器。在需要的时候,Framework 会经常重新实例化Fragment类,在特殊的状态恢复期间,需要能够找到这个构造器来实例化Fragment类。如果空的构造器无效,那么在状态恢复期间会导致运行时异常发生。 较旧的平台 尽管Fragment API是在HONEYCOMB版本中被引入的,但是通过FragmentActivity也能够在较旧的平台上使用该API。 声明周期 尽管Fragment对象的生命周期要依附于它所在的Activity对象,但是它也有自己标准的活动周期,它包含了基本的活动周期方法,如onResume(),但是同时也包含了与Activity 和UI交互相关的重要方法。

实验2-Activity组件的生命周期

实验二Activity组件的生命周期 一、实验目的 1.了解Activity组件的生命周期; 2.了解Activity组件的运行状态; 3.掌握Activity事件回调函数的作用和调用关系。 二、Activity相关知识 Activity是Android组件中最基本也是最为常见用的四大组件之一(Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器)。Activity中所有操作都与用户密切相关,是一个负责与用户交互的组件,可以通过setContentView(View)来显示指定控件。在一个android应用中,一个Activity 通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。Activity之间通过Intent进行通信。 在android 中,Activity 拥有四种基本状态: 1、Active/Runing 一个新Activity 启动入栈后,它显示在屏幕最前端,处理是处于栈的最顶端(Activity栈顶),此时它处于可见并可和用户交互的激活状态,叫做活动状态或者运行状态(active or running)。 2、Paused 当Activity失去焦点,被一个新的非全屏的Activity 或者一个透明的Activity 被放置在栈顶,此时的状态叫做暂停状态(Paused)。此时它依然与窗口管理器保持连接,Activity依然保持活力(保持所有的状态,成员信息,和窗口管理器保持连接),但是在系统内存极端低下的时候将被强行终止掉。所以它仍然可见,但已经失去了焦点故不可与用户进行交互。 3、Stoped 如果一个Activity被另外的Activity完全覆盖掉,叫做停止状态(Stopped)。它依然保持所有状态和成员信息,但是它不再可见,所以它的窗口被隐藏,当系统内存需要被用在其他地方的时候,Stopped的Activity将被强行终止掉。 4、Killed 如果一个Activity是Paused或者Stopped状态,系统可以将该Activity从内存中删除,Android系统采用两种方式进行删除,要么要求该Activity结束,要么直接终止它的进程。当该Activity再次显示给用户时,它必须重新开始和重置前面的状态。 状态转换 当一个Activity 实例被创建、销毁或者启动另外一个Activity 时,它在这四种状态之间进行转换,这种转换的发生依赖于用户程序的动作。图2.1说明了Activity 在不同状态间转换的时机和条件: 9

android_fragment学习笔记2

Fragment 表现Activity 中用UI的一个行为或者一部分. 可以组合多个fragment 放在一个单独的activity中来创建一个多界面区域的UI,并可以在多个activity里重用某一个fragment.把fragment 想象成一个activity的模块化区域, 有它自己的生命周期, 接收属于它的输入事件, 并且可以在activity运行期间添加和删除. Fragment 必须总是被嵌入到一个activity中, 它们的生命周期直接被其所属的宿主activity的生命周期影响. 例如, 当activity被暂停,那么在其中的所有fragment 也被暂停; 当activity被销毁, 所有隶属于它的fragment也被销毁. 然而,当一个activity正在运行时(处于resumed状态), 我们可以独立地操作每一个fragment, 比如添加或删除它们. 当处理这样一个fragment事务时, 也可以将它添加到activity所管理的back stack -- 每一个activity中的back stack实体都是一个发生过的fragment事务的记录. back stack允许用户通过按下BACK 按键从一个fragment事务后退(往后导航). 将一个fragment作为activity布局的一部分添加进来时, 它处在activity的view hierarchy中的ViewGroup中, 并且定义有它自己的view布局.通过在activity的布局文件中声明fragment来插入一个fragment到你的activity布局中, 或者可以写代码将它添加到一个已存在的ViewGroup.然而, fragment并不一定必须是activity 布局的一部分; 也可以将一个fragment作为activity的隐藏的后台工作者. 本文档描述了如何使用fragment创建你的应用程序, 包括:当被添加到activity的back stack后, fragment如何维护他们的状态. 在activity中,与activity和其他fragment共享事件.构建到activity的action bar.以及更多内容. 设计哲学 Android在3.0中引入了fragments的概念,主要目的是用在大屏幕设备上--例如平板电脑上,支持更加动态和灵活的UI设计. 平板电脑的屏幕要比手机的大得多,有更多的空间来放更多的UI组件,并且这些组件之间会产生更多的交互.Fragment 允许这样的一种设计,而不需要你亲自来管理view hierarchy的复杂变化. 通过将activity的布局分散到fragment中, 你可以在运行时修改activity的外观, 并在由activity管理的back stack中保存那些变化. 例如, 一个新闻应用可以在屏幕左侧使用一个fragment来展示一个文章的列表, 然后在屏幕右侧使用另一个fragment来展示一篇文章–2个fragment并排显示在相同的一个activity中, 并且每一个fragment拥有它自己的一套生命周期回调方法,并且处理它们自己的用户输入事件. 因此, 取代使用一个activity来选择一篇文章,而另一个activity来阅读文章的方式, 用户可以在相同的activity中选择一篇文章并且阅读, 如图所示:

实验6 深入理解Activity

实验6深入理解Activity 一、实验目的 1、掌握Activity的开发、配置和使用。 2、了解Activity的生命周期。 二、实验步骤 1、使用Bundle在Activity之间交换数据,运行的效果如下所示。 图1 第1个Actvity界面图2 通过第1个Actvity启动第2个Activity 要求与注意事项: 1、Activity01.java源代码所对应的布局文件main.xml文件,请参考图1自己编写。 2、OtherActivity.java源代码所对应的布局文件other.xml文件,请参考图2自己编写。 3、注意在AndroidManifest.xml文件中配置两个Activity。 第一个Activity的代码,即com.whq.Activity01.java,请补充所缺代码,给代码添加注释。 package com.whq; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View;

import android.view.View.OnClickListener; import android.widget.Button; public class Activity01 extends Activity { private Button myButton = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(https://www.360docs.net/doc/1015174128.html,yout.main); myButton = (Button) findViewById(R.id.myButton); myButton.setOnClickListener(new MyButtonListener()); } class MyButtonListener implements OnClickListener { @Override public void onClick(View v) { // 生成一个Intent对象 Intent intent = new Intent(Activity01.this,OtherActivity.class); startActivity(intent); } } } 第2个Activity的代码 package com.whq; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.widget.TextView; public class OtherActivity extends Activity{ private TextView myTextView = null; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(https://www.360docs.net/doc/1015174128.html,yout.other); //取得从上一个Activity当中传递过来的Intent对象 Intent intent = getIntent(); //从Intent当中根据key取得value String value = intent.getStringExtra("testIntent"); //根据控件的ID得到响应的控件对象 myTextView = (TextView)findViewById(R.id.myTextView); //为控件设置Text值

理解Fragment生命周期

理解Fragment生命周期 官网帮助文档链接: https://www.360docs.net/doc/1015174128.html,/guide/components/fragments.html 主要看两张图,和跑代码 一,Fragment的生命周二,与Activity生命周期的对比

场景演示: 切换到该Fragment 11-29 14:26:35.095: D/AppListFragment(7649): onAttach 11-29 14:26:35.095: D/AppListFragment(7649): onCreate 11-29 14:26:35.095: D/AppListFragment(7649): onCreateView 11-29 14:26:35.100: D/AppListFragment(7649): onActivityCreated 11-29 14:26:35.120: D/AppListFragment(7649): onStart 11-29 14:26:35.120: D/AppListFragment(7649): onResume 屏幕灭掉: 11-29 14:27:35.185: D/AppListFragment(7649): onPause 11-29 14:27:35.205: D/AppListFragment(7649): onSaveInstanceState 11-29 14:27:35.205: D/AppListFragment(7649): onStop 屏幕解锁 11-29 14:33:13.240: D/AppListFragment(7649): onStart 11-29 14:33:13.275: D/AppListFragment(7649): onResume 切换到其他Fragment: 11-29 14:33:33.655: D/AppListFragment(7649): onPause 11-29 14:33:33.655: D/AppListFragment(7649): onStop 11-29 14:33:33.660: D/AppListFragment(7649): onDestroyView 切换回本身的Fragment: 11-29 14:33:55.820: D/AppListFragment(7649): onCreateView 11-29 14:33:55.825: D/AppListFragment(7649): onActivityCreated 11-29 14:33:55.825: D/AppListFragment(7649): onStart 11-29 14:33:55.825: D/AppListFragment(7649): onResume 回到桌面 11-29 14:34:26.590: D/AppListFragment(7649): onPause 11-29 14:34:26.880: D/AppListFragment(7649): onSaveInstanceState 11-29 14:34:26.880: D/AppListFragment(7649): onStop 回到应用 11-29 14:36:51.940: D/AppListFragment(7649): onStart 11-29 14:36:51.940: D/AppListFragment(7649): onResume 退出应用 11-29 14:37:03.020: D/AppListFragment(7649): onPause 11-29 14:37:03.155: D/AppListFragment(7649): onStop

Android生命周期详解

Android生命周期详解 在Android 中,多数情况下每个程序都是在各自独立的Linux 进程中运行的。当一个程序或其某些部分被请求时,它的进程就“出生”了;当这个程序没有必要再运行下去且系统需要回收这个进程的内存用于其他程序时,这个进程就“死亡”了。可以看出,Android 程序的生命周期是由系统控制而非程序自身直接控制。这和我们编写桌面应用程序时的思维有一些不同,一个桌面应用程序的进程也是在其他进程或用户请求时被创建,但是往往是在程序自身收到关闭请求后执行一个特定的动作(比如从main 函数中return)而导致进程结束的。要想做好某种类型的程序或者某种平台下的程序的开发,最关键的就是要弄清楚这种类型的程序或整个平台下的程序的一般工作模式并熟记在心。在Android 中,程序的生命周期控制就是属于这个范畴——我的个人理解:) 在Android 系统中,当某个activity调用startActivity(myIntent) 时,系统会在所有已经安装的程序中寻找其intent filter 和myIntent 最匹配的一个activity,启动这个进程,并把这个intent 通知给这个activity。这就是一个程序的“生”。比如我们在Home application 中选择“Web browser”,系统会根据这个intent 找到并启动Web browser 程序,显示Web browser 的一个activity 供我们浏览网页(这个启动过程有点类似我们在在个人电脑上双击桌面上的一个图标,启动某个应用程序)。在Android 中,所有的应用程序“生来就是平等的”,所以不光Android 的核心程序甚至第三方程序也可以发出一个intent 来启动另外一个程序中的一个activity。Android 的这种设计非常有利于“程序部件”的重用。

Android中Fragment的使用

Day13.2-Fragment Fragment:Activity片段 a)Fragment的特点: (1)Fragment作为Activity界面的一部分组成出现 (2)可以在一个Activity中同时出现多个Fragment,一个Fragment亦可在多个Activity 中使用。 (3)在Activity运行过程中,可以添加、移除或者替换Fragment(add()、remove()、replace()) (4)Fragment可以响应自己的输入事件,并且有自己的生命周期,当然,它们的生命周期直接被其所属的宿主activity的生命周期影响。只有当Activity处于活动状态时,程序员可通过方法独立的操作Fragment. 例如:Android3.0引入Fragment的初衷是为了适应 大屏幕的平台电脑,Framgment简化了大屏幕UI的设计,对UI组件进行分组,模块化管理,可以更方便地运行过程中动态更新Activity的用户界面,新闻浏览界面,该界面需要屏幕左边显示新闻列表,并在屏幕右边显示新闻内容。此时就可以再Activity中显示两个并排的Fragment,左边的Fragment显示新闻列表,右边的Fragment显示新闻内容。如果需要在正常尺寸的手机屏幕上运行该应用,可以改为使用两个Activity,ActivityA包含FragmentA,ActivityB包含FragmentB. b)使用: 1、建立Fragment:创建类继承Fragment或其子类 2、实现相关的回调函数 通常, 可以实现如下的生命周期方法:onCreate():当创建fragment时, 系统调用该方法. 在实现代码中,应当初始化想要在fragment中保持的必要组件, 当fragment被暂停或者停止 后可以恢复.

Activity生命周期解说

Activity生命周期解说 二、事件方法链 2.1进入Activity onCreate -> onStart -> onResume 2.2BACK键 onPause->onStop->onDestroy 2.3HOME键 Home键退出:onPause->onStop Home键回来:onRestart -> onStart->onResume 2.4休眠/恢复 休眠:onPause

恢复:onResume 2.5旋转屏幕 未设置android:configChanges: onPause -> onStop -> onDestory -> onCreate -> onStart -> onResume 设置了android:configChanges="orientation|keyboardHidden": 不会触发生命周期方法,参见文章这里。 2.6来电 来电,显示来电界面: onPause -> onStop 关闭电话界面,重新回到当前Activity: onRestart -> onStart->onResume 2.7其他Activity 进入下一个Activity: onPause -> onStop 从其他Activity返回至当前Acitivity: onRestart -> onStart->onResume 三、与Activity生命周期结合的应用场景 3.1与广播(Broadcast)结合 在onResume注册广播(registerLinstener),在onPause注销广播(unregisterLinstener)。例如: 做"摇一摇"功能(传感器)、监听网络变化,就可以在onResume中注册监听,在onPause里注销掉,已节省资源提高效率。 3.2与服务(Service)结合 在onStart绑定服务(bindService),在onStop中取消绑定(unbindService)。例如:

android_fragment学习笔记

Android Fragments 详细使用 Fragments 诞生初衷 自从Android 3.0中引入fragments 的概念,根据词海的翻译可以译为:碎片、片段。其上的是为了解决不同屏幕分辩率的动态和灵活UI设计。大屏幕如平板小屏幕如手机,平板电脑的设计使得其有更多的空间来放更多的UI组件,而多出来的空间存放UI使其会产生更多的交互,从而诞生了fragments 。fragments 的设计不需要你来亲自管理view hierarchy 的复杂变化,通过将Activity 的布局分散到frament 中,可以在运行时修改activity 的外观,并且由activity 管理的back stack 中保存些变化。 Fragments 设计理念 在设计应用时特别是Android 应用,有众多的分辨率要去适应,而fragments 可以让你在屏幕不同的屏幕上动态管理UI。例如:通讯应用程序(QQ),用户列表可以在左边,消息窗口在右边的设计。而在手机屏幕用户列表填充屏幕当点击某一用户时,则弹出对话窗口的设计,如下图: Fragments的生命周期 每一个fragments 都有自己的一套生命周期回调方法和处理自己的用户输入事件。对应生命周期可参考下图:

其中大多数程序必须使用Fragments 必须实现的三个回调方法分别为:

onCreate 系统创建Fragments 时调用,可做执行初始化工作或者当程序被暂停或停止时用来恢复状态,跟Activity 中的onCreate相当。 onCreateView 用于首次绘制用户界面的回调方法,必须返回要创建的Fragments 视图UI。假如你不希望提供Fragments 用户界面则可以返回NULL。 onPause 当用户离开这个Fragments 的时候调用,这时你要提交任何应该持久的变化,因为用户可能不会回来。更多的事件可以参考上图的生命周期关系图。 Fragments 的类别 系统内置了三种Fragments ,这三种Fragments 分别有不同的应用场景分别为:DialogFragment 对话框式的Fragments,可以将一个fragments 对话框并到activity 管理的fragments back stack 中,允许用户回到一个前曾摒弃fragments. ListFragments 类似于ListActivity 的效果,并且还提供了ListActivity 类似的onListItemCLick和setListAdapter等功能。 PreferenceFragments 类似于PreferenceActivity .可以创建类似IPAD的设置界面。 Fragments 的详细使用 首先先来看一张DEMO 效果图:

Android中的Activity的生命周期函数

Android开发历程_3(Activity生命周期) Activity中有7个与生命周期有关的函数。其中onCreated()是activity第一次被启动时执行的,主要是初始化一些变量,onRestart()是当前activity重新被启动时调用的;绑定一些监听器等;onStart()是activity界面被显示出来的时候执行的;onResume()是当该activity与用户能进行交互时被执行;onPause()是另一个activity被启动,当前的activity就被暂停了,一般在该函数中执行保存当前的数据;onStop()表示另一个activity被启动完成时,当前activity对用户同时又完全不可见时才调用的;onDestroy()是退出当前activity时调用的,当然如果程序中调用finish()或者说android系统当前资源不够用时就会被调用。 当用多个activity在执行时,这时候android系统会自动将这些activity压入栈中并且总是显示最顶的那个activity,这个栈在android叫做task,但是这个栈只支持压入和弹出操作,不支持排序插入等操作。 Activity的7个生命周期函数中的onStop()函数被调用时是在其对应的activity被另外的activity完全遮挡的时候,如果只有部分遮挡,则不会被调用。部分遮挡一般是以消息activtiy的形式出现,这个只需在AndroidManifest.xml中将其对于的activity的主题设置theme中更改即可。 这7个周期函数,当系统资源不够时,其中onPause(),onStop(),onDestroy()是有可能被系统kill掉的,但其它4个是不会被kill掉。 参考资料为mars老师的资料。 官方给出关于这7个生命周期的图如下:

ip,协议首部,fragment,offset

竭诚为您提供优质文档/双击可除ip,协议首部,fragment,offset 篇一:计算机网络课实验二aRp与ip协议分析 实验二、aRp与ip协议分析 实验类型:验证类实验 实验课时:2学时 姓名:杨学成 实验时间和地点:10月23日星期二、第一大节 (8:00-9:50),计算机中心学号:20xx13418 一、实验目的 了解aRp协议的工作过程,验证ip数据报格式。二、实验准备 安装etherpeek(/soft/17558.html),执行“ipconfig –all”查看本机ip地址和mac地址。自学教材第4.4节网际控制报文协议icmp。三、实验内容1.aRp协议分析(1)假设邻座同学的主机为a,ip地址为w.x.y.z,运行etherpeek,新建一个Filter,只捕获本机与w.x.y.z之间的以太网帧。 (2)进入dos仿真窗口,执行“arp–a”查看本机的

aRp缓存内容,若有w.x.y.z的记录,执行“arp–dw.x.y.z”删除该记录。注:执行“arp-help”可知arp 的各选项用法。 (3)开始捕获,然后执行“pingw.x.y.z”,停止捕获,记录并分析封装aRp报文的帧各字段的含义,如表1。 表2帧和aRp报文格式 (4)执行“arp–dw.x.y.z”清除缓存的ip-mac记录。本机和主机a停止任何数据通信,在主机a上访问本机外的任何主机,再执行“arp–a”查看本机aRp缓存,看是否新增了主机a的ip-mac记录,解释一下。 2.ip数据报格式分析 开始捕获,然后在命令行执行pingw.x.y.z,再停止捕获;分析捕获的帧,特别是封装的ip数据报格式,记录各字段(包括数据部分“icmp报文”的字段)的值和含义(如表1),并与ip数据报、icmp报文的格式进行比较。 重新开始捕获,然后在命令行执行“tracertw.x.y.z”,再停止捕获,记录并分析各字段的含义(如表1),并与ip 分组格式进行比较。四、回答下列问题 (1)aRp的用途、工作原理,ip和aRp是什么关系? aRp协议是“addressResolutionprotocol”(地址解析协议)的缩写。在局域网中,网络中实际传输的是“帧”,帧里面是有目标主机的mac地址的。在以太网中,一个主机

ViewPager+Fragment基本使用

ViewPager+Fragment可以做出多页面滑动效果,让我们的应用程序界面操作起来更加灵活 对于ViewPager和Fragment组件还不熟悉的朋友,可以先看看相关的资料 首先在activity_main.xml布局文件中加入ViewPager组件 既然要实现左右的页面滑动,肯定要往ViewPager中添加一些View视图或者Fragment,这里创建了3个Fragment的布局文件 这3个布局文件非常简单,跟Activity的布局用法一模一样,代码就不贴出来了,直接看Activity的java代码 package huahua.viewpager; import java.util.ArrayList; import java.util.List; import android.os.Bundle; import android.app.Activity; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.app.FragmentStatePagerAdapter; import android.support.v4.view.PagerTabStrip; import android.support.v4.view.PagerTitleStrip; import android.support.v4.view.ViewPager; import android.util.Log;

Android Activity生命周期解析

Android Activity生命周期解析 摘要:Android(安致)操作系统应用包括四个部分:Activity活动,Intent Reciver,service和Content provider。其中,一个activity是应用中的一个单一的屏幕,它继承自Activity类,它将显示由Views组成的UI以及响应事件。 关键词:Android;Activity;生命周期 中图分类号:TP311.52 文献标识码:A文章编号:1007-9599 (2011) 10-0000-01 Android Activity Life Cycle Analysis Li Jiajun (China University of Mining&Technology Resources Institute,Xuzhou221000,China) Abstract:Android operating system applications include four parts:Activity activity,Intent Reciver,service,and Content provider.Among them,an activity is the application of a single screen,it inherits from the Activity class,it will show the composition of the Views UI,and respond to events. Keywords:Android;Activity;Life cycle Android(安致)底层以Linux内核工作为基础,

Android入门之Fragment用法

Android入门之Fragment用法 当我们需要动态的多界面切换的时候,就需要将UI元素和Activity融合成一个模块。在2.3中我们一般通过各种Activity中进行跳转来实现多界面的跳转和单个界面动态改变。在4.0或以上系统中就可以使用新的特性来方便的达到这个效果--Fragment类。Fragment类似一个嵌套Activity,可以定义自己的layout和自己的生命周期。 多个Fragment可以放在一个Activity中(所以上面讲到类似一个嵌套Activity),而这个类可以对这些Fragment进行配置以适应不同的屏幕尺寸(比如平板和手机)。 下面将向您讲述如何创建通过Fragment向用户提供一个动态的体验,并且还可以针对不同的屏幕尺寸做优化,给用户提供更好的使用体验。该特性可以运行在Android1.6上面(当然需要google库的支持)。(all while continuing to support devices running versions as old as Android 1.6.这个真心没搞懂,E文好的同学指点下) 使用Android库 Android支持库是一个jar文件,使用这个支持库可以让我们在低版本上运行高版本的特性(比如Fragment并非1.6的特性,但是通过库的引入,我们可以将包含fragment的程序运行在1.6上面,保证程序兼容性)。

步骤: 1. 通过SDK Manager下载Android Support Package。 2. 在项目代码顶层创建libs文件夹,并将你需要的jar库文件拷贝到libs里面去。 3. 更新manifest文件,设置如下 为了确保没有在旧的系统上面使用新的api特性,却要在使用Fragment的文件中包含如下内容: 应该声明FragmentActivity(而不是Activity)来包含Fragments。 创建Fragment

黑马程序员安卓教程:Service 的生命周期回调函数

Service 的生命周期回调函数 和Activity 一样,service 也有一系列的生命周期回调函数,你可以实现它们来监测service 状态的变化,并且在适当的时候执行适当的工作。 Like an activity, a service has lifecycle callback methods that you can implement to monitor changes in the service's state and perform work at the appropriate times. The following skeleton service demonstrates each of the lifecycle methods: 13

下面的service展示了每一个生命周期的方法: 【文件1-5】Service生命周期回调函数 1.public class TestService extends Service { 2.int mStartMode; //indicates how to behave if the service is killed 3.IBinder mBinder;// interface for clients that bind 4.boolean mAllowRebind;// indicates whether onRebind should be used 5. 6.@Override 7.public void onCreate() { 8.// The service is being created 9.} 10. 11.@Override 12.public int onStartCommand(Intent intent, int flags,int startId){ 13.// The service is starting, due to a call to startService() 14.return mStartMode; 15.} 16. 17.@Override 18.public IBinder onBind(Intent intent) { 19.// A client is binding to the service with bindService() 20.return mBinder; 21.} 22. 23.@Override 24.public boolean onUnbind(Intent intent) { 25.// All clients have unbound with unbindService() 26.return mAllowRebind; 27.} 28. 29.@Override 30.public void onRebind(Intent intent){ 31.// A client is binding to the service with bindService(), 32.// after onUnbind() has already been called 33.} 34. 35.@Override 36.public void onDestroy(){ 37.// The service is no longer used and is being destroyed 38.} 39.} 注意:不同于Activity的生命周期回调方法,Service不须调用父类的生命周期回调方法。 Unlike the activity lifecycle callback methods,you are not required to call the superclass implementation of these callback methods. 14

Fragment的使用方法

Android开发中fragment 其目的是为了解决不同屏幕分辩率的动态和灵活UI设计。大屏幕如平板小屏幕如手机,平板电脑的设计使得其有更多的空间来放更多的UI组件,而多出来的空间存放UI使其会产生更多的交互,从而诞生了fragments 。 因为Fragment必须嵌入在Acitivity中使用,Fragment是activity的界面中的一部分或一种行为,不能独立存在,所以Fragment的生命周期和它所在的Activity是密切相关的。如果Activity是暂停状态,其中所有的Fragment都是暂停状态;如果Activity是stopped状态,这个Activity中所有的Fragment都不能被启动;如果Activity被销毁,那么它其中的所有Fragment都会被销毁。但是,当Activity在活动状态,可以独立控制Fragment的状态,比如加上或者移除Fragment。 介绍一下常用的几个生命周期函数: onAttach(Context) –> 当fragment被绑定到activity上时回调 onCreate(Bundle) –> 当fragment对象创建的时候回调,一般在此方法里做参数接收。onCreateView(LayoutInflater, ViewGroup, Bundle) –> 创建fragment视图时回调onDestoryView –> 视图销毁时回调 onDestory –> 销毁fragment时回调 onDetech() –> fragment与activity失去关联时回调 Fragment的使用方法 使用Fragment时,需要继承Fragment或者Fragment的子类,一般而言要重写三个方法,onCreate():系统在创建Fragment的时候调用这个方法,这里应该初始化相关的组件,一些即便是被暂停或者被停止时依然需要保留的东西。 onCreateView():当第一次绘制Fragment的UI时系统调用这个方法,必须返回一个View,如果Fragment不提供UI也可以返回null。 onPause():当用户离开Fragment时第一个调用这个方法,需要提交一些变化,因为用户很可能不再返回来。 实现Fragment的UI,必须实现onCreateView()方法。 假设Fragment的布局设置写在example_fragment.xml资源文件中,那么onCreateView()方法可以如下写: public static class ExampleFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment return inflater.inflate(https://www.360docs.net/doc/1015174128.html,yout.example_fragment, container, false); } } onCreateView()中container参数代表该Fragment在Activity中的父控件;savedInstanceState 提供了上一个实例的数据。 inflate()方法的三个参数: 第一个是resource ID,指明了当前的Fragment对应的资源文件;

相关文档
最新文档