1.Activity的生命周期
1)多个Activity组成Activity栈,当前活动位于栈顶。我们先来看看各种Activity基类的类图:
当Activity类定义出来之后,这个Activity何时被实例化、它所包含的方法何时被调用,这些都不是由开发者所决定的,都应该由Android系统来决定。
下面我们来看一下Activity的生命周期:
2.Activity的用法
1)启动、关闭Activity
// 首先需要创建启动的Activity对应的Intent Intent intent = new Intent(MainActivity.this, TwoActivity.class); // 启动Activity startActivity(Intent intent); startActivityForResult(Intent intent, int requestCode); // requestCode:请求码 //startActivityForResult方法以指定的请求码启动Activity,并通过重写onActivityResult方法获取返回的结果。 // 关闭Activity finish(); finishActivity(int requestCode); // finishActivity方法结束以startActivityForResult方法启动的Activity。
2)启动其他Activity并返回结果
当前Activity重写onActivityResult(int requestCode, int resultCode, Intent intent)
requestCode:请求码(指出该方法是从哪个请求的结果触发的)
resultCode:Activity返回的结果码(指出返回的数据来自于哪个新的Activity)
被启动的Activity需要调用setResult()方法设置处理结果。
实例:
在当前Activity中重写onActivityResult方法
public class MainActivity extends Activity { Button bn; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 获取界面上的组件 ... // 绑定事件监听器 bn.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(MainActivity.this, TwoActivity.class); startActivityForResult(intent, 0); // 0是请求码,用于标识该请求 } }); } @Override public void onActivityResult(int requestCode, int resultCode, Intent intent) { // 处理特定的结果 if (requestCode == 0 && resultCode == 0) { // 取出Intent里的Extras数据 Bundle data = intent.getExtras(); // 取出Bundle中的数据 String result = data.getString("test"); Toast.makeText(getApplicationContext(), result, 0).show(); } } }
然后在被启动的TwoActivity中调用setResult()方法设置处理结果
// 获取启动该Activity之前的Activity对应的Intent Intent intent = getIntent(); intent.putExtra("test", "test"); // 设置该SelectActivity的结果码,并设置结束之后退回的Activity SelectCityActivity.this.setResult(0, intent); // 结束TwoActivity TwoActivity.this.finish();
3.使用Bundle在Activity之间交换数据
Intent提供了多个重载的方法来“携带”额外的数据,如下:
intent.putExtras(Bundle data); // 向Intent放入数据包 intent.putExtras(String name, Xxx value); // 向Intent中按key-value对的形式放入数据 intent.getExtras(); // 取出Intent中携带的数据包 intent.getXxxExtras(String name); //从Intent中按key取出指定类型的数据
上面方法中Bundle就是一个简单的数据携带包,Intent主要通过Bundle对象来携带数据,Bundle包含多个方法来存取数据:
Bundle bundle = new Bundle(); // 首先创建一个Bundle对象 bundle.putXxx(String key, Xxx data); // 向Bundle中放入数据 bundle.putSerializable(String key, Serializable data); // 向Bundle中放入一个可序列化的对象(即实现了java.io.Serializable接口) bundle.getXxx(String key); // 从Bundle中取出数据 bundle.getSerializable(String key); // 从Bundle中取出一个可序列化的对象
4.Activity的四种加载模式
配置AndroidManifest.xml中Activity时,可指定android:launchMode属性用于配置该Activity的加载模式,该属性支持4个属性值:
standard:标准模式;
singleTop:栈顶单例模式;
singleTask:栈内单例模式(如果目标Activity已经存在、但没有位于栈顶,系统会把位于该Activity上面的所有Activity移出Task栈,从而使目标Activity转入栈顶);
singleInstance:全局单例模式(新创建Activity将放入新栈,一个栈只包含一个Activity,如果目标Activity已经存在,系统会把该Activity所在Task转到前台显示出来)。
5.Fragment的生命周期
Fragment是AndroiD3.0引入的新API,Fragment代表Activity子模块(Activity片段),Fragment必须嵌入到Activity中使用,Fragment的生命周期受它所在Activity的生命周期的控制。
Fragment可调用getActivity()方法获取它所在Activity;
Activity可调用FragmentManager的findFragmentById()或findFragmentByTag()方法获取Fragment;
在Activity运行过程中,可调用FragmentManager的add()、remove()、replace()方法动态的添加、删除和替换Fragment。
1)我们先来看看各种Fragment基类的类图:
2)下面我们来看一下Fragment的生命周期,并和Activity的生命周期做对比:
6.Fragment的用法
1)创建Fragment
创建Fragment通常要实现如下三个方法:
onCreate()、onCreateView()、onPause()
为了控制Fragment显示的组件,通常需要重写onCreateView()方法,该方法返回的View将作为该Fragment显示的View组件。
// 重写该方法,该方法返回的View将作为Fragment显示的组件 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // 加载/res/layout/目录下的fragment.xml布局文件 View view = inflater.inflate(R.layout.fragment, container, false); TextView name = (TextView)view.findViewById(R.id.name)); ... return view; }
2)将Fragment添加到Activity
将Fragment添加到Activity有如下两种方式:
第1种:在布局文件中使用<fragment.../>元素添加Fragment,<fragment.../>元素的android:name属性指定Fragment的实现类。
第2种:在Java代码中通过FragmentTransaction对象的add()方法来添加Fragment。
Activity的getFragmentManager()方法可返回FragmentManager,FragmentManager对象的beginTransaction()方法即可开启并返回FragmentTransaction对象。
3)如何在Activity中动态的添加、更新、以及删除Fragment呢?
首先需要在MainActivity布局文件中添加FrameLayout(设置id为fl),然后简单创建一个两个Fragment(MyFragment和TwoFragment)如下:
public class MyFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_my, container, false); } } public class TwoFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_two, container, false); } }
接下来就可以在MainActivity中动态的添加、更新、以及删除Fragment了,MainActivity中调用的方法如下:
// 设置默认的Fragment FragmentManager fm = getFragmentManager(); FragmentTransaction transaction = fm.beginTransaction(); myFragment = new MyFragment(); transaction.replace(R.id.fl, myFragment); transaction.commit();
假设点击某按钮更新Fragment,该按钮点击事件如下:
@Override public void onClick(View v) { FragmentManager fm = getFragmentManager(); // 开启Fragment事务 FragmentTransaction transaction = fm.beginTransaction(); twoFragment = new TwoFragment(); // 使用当前Fragment的布局替代fl的控件 transaction.replace(R.id.fl, twoFragment); // transaction.addToBackStack(); // 将事物添加到back栈,允许用户按BACK按键返回到替换Fragment之前的状态 // 事务提交 transaction.commit(); }
以上就是对Android Activity和Fragment 的资料整理,后续继续补充相关资料,谢谢大家对本站的支持!
本文向大家介绍Android 中Fragment与Activity通讯的详解,包括了Android 中Fragment与Activity通讯的详解的使用技巧和注意事项,需要的朋友参考一下 Android 中Fragment与Activity通讯的详解 与activity通讯 尽管fragment的实现是独立于activity的,可以被用于多个activity,但是每个activity所包含的是同一
本文向大家介绍详解Android activity与fragment之间的通信交互,包括了详解Android activity与fragment之间的通信交互的使用技巧和注意事项,需要的朋友参考一下 前言 纵观市场,大多数的APP都采用导航+fragment这种设计模式,如微信,QQ,京东,淘宝,究其原因:简洁。 在开发过程中不可避免的会出现fragment与fragment,fragment与a
具体问题是调用自定义arrayadapter的getView方法失败。我使用一个片段来显示一个列表。生成列表的活动允许从微调器中选择人员。然后,我使用所选人员的id从DB中检索数据。我将这些数据打包到指定给ArrayList的自定义holder对象中。以下是创建片段事务的活动代码。 片段正确地获取绑定的数据。onCreate方法和onCreateView方法执行正确。以下是onCreateView
本文向大家介绍Android开发教程之Fragment定义、创建与使用方法详解【包含Activity通讯,事务执行等】,包括了Android开发教程之Fragment定义、创建与使用方法详解【包含Activity通讯,事务执行等】的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Android开发教程之Fragment定义、创建与使用方法。分享给大家供大家参考,具体如下: 概述 Fragme
Activity生命周期 在上面的图中存在不同状态之间的过渡,但是,这些状态中只有三种可以是静态,也就是说 Activity 只能在三种状态之一下存在很长时间。 继续:在这种状态下,Activity处于前台,且用户可以与其交互(又称为运行态,在调用 onResume() 方法调用后)。 暂停:在这种状态下,Activity被在前台中处于半透明状态或者未覆盖整个屏幕的另一个Activity—部分阻挡
问题内容: 我正在升级Android应用程序(1.6兼容性),该应用程序使用显示三个带有嵌套活动的不同选项卡。 当时,我使用技巧在选项卡中显示嵌套的活动,但是我对此方法感到非常不满意,因为处理某些功能确实很麻烦。 我听说过1.6版的Fragments API兼容性软件包,并且看起来非常适合我想做的事情(在带有过渡效果和内容的选项卡中显示嵌套视图/功能),但我无法使其与(这是为了与一起使用,但在兼容