欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android开发 Activity和Fragment详解

程序员文章站 2024-03-06 17:13:14
1.activity的生命周期 1)多个activity组成activity栈,当前活动位于栈顶。我们先来看看各种activity基类的类图: 当activity类...

1.activity的生命周期

1)多个activity组成activity栈,当前活动位于栈顶。我们先来看看各种activity基类的类图:

Android开发 Activity和Fragment详解

当activity类定义出来之后,这个activity何时被实例化、它所包含的方法何时被调用,这些都不是由开发者所决定的,都应该由android系统来决定。

下面我们来看一下activity的生命周期:

Android开发 Activity和Fragment详解

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基类的类图:

Android开发 Activity和Fragment详解

2)下面我们来看一下fragment的生命周期,并和activity的生命周期做对比:

Android开发 Activity和Fragment详解

Android开发 Activity和Fragment详解

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 的资料整理,后续继续补充相关资料,谢谢大家对本站的支持!