什么是Activity?

Activity是Android组件中最基本也是最为常见用的四大组件(Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器)之一。也是一个view的容器。需要强调的是Activity本身不是界面,但它的主要功能是提供界面,用户可以用来交互为了完成某项任务。Activity中所有操作都与用户密切相关,是一个负责与用户交互的组件,可以通过setContentView(View)来显示指定控件。在一个android应用中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。Activity之间通过Intent进行通信。(Intent方面请看另一篇博客《Android Intent的使用》)

要想正确的使用Activity,就需要知道Activity的生命周期。

Activity的生命周期:

这里有三个比较关键的生命周期。

  • 从最初调用onCreate(Bundle)到最终调用onDestroy()称为完整生命周期。Activity会在onCreate()进行所有“全局”状态的设置,在onDestroy()中释放所有持有的资源。举个例子,如果它有一个从网络上下载数据的后台线程,那他可能就会在onCreate()中创建这个线程并在onDestroy()中停止这个线程。
  • 从activity调用onStart()开始,到调用对应的onStop()为止称为可见生命周期。在这段时间内用户可以在屏幕上看到这个activity,尽管并不一定是在前景也不一定可以和用户交互。在这两个方法之间你可以维护那些activity在用户显示时所需的资源。举个例子来说,你可以在onStart()中注册一个IntentReceiver来监控那些可以对你的UI产生影响的环境改变,当你的UI不继续在用户面前显示时你可以在onStop()中注销这个IntentReceiver。每当activity在用户面前显示或者隐藏时都会调用相应的方法,所以onStart()和onStop()方法在整个生命周期中可以多次被调用。
  • 从activity调用onResume()开始,到调用对应的onPause()为止称为前景生命周期,这段时间activity处于其他所有activity的前面,且与用户交互。一个activity可以经常在resumed和paused状态之间转换——例如手机进入休眠时、activity的结果返回时、新的intent到来时——所以这两个方法中的代码应该非常的简短。

下面用一个例子来感受一下Activity的生命周期:

需要两个Activity:MainActivity和test1。

MainActivity:(注释为该方法中常见的操作)

public class MainActivity extends Activity {
// 初始化操作
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
System.out.println("onCreate");
Button btn1 = (Button) findViewById(R.id.btn1);
btn1.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, test1.class);
startActivity(intent); }
}); } // 对资源进行回收
@Override
protected void onDestroy() {
System.out.println("onDestroy");
super.onDestroy();
} // 注册一些监听(内容观察者)
@Override
protected void onStart() {
System.out.println("onStart");
super.onStart();
} @Override
protected void onRestart() {
System.out.println("onRestart");
super.onRestart();
} // 再次对数据进行查询
@Override
protected void onResume() {
System.out.println("onResume");
super.onResume();
} // 数据的临时保存
@Override
protected void onPause() {
System.out.println("onPause");
super.onPause();
} // 取消监听
@Override
protected void onStop() {
System.out.println("onStop");
super.onStop();
} }

test1.java:

public class test1 extends Activity {

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test1);
System.out.println("onCreate1");
Button btn = (Button) findViewById(R.id.test1_btn);
btn.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
// 数据是使用Intent返回
Intent intent = new Intent(test1.this,MainActivity.class); // 把返回数据存入Intent
startActivity(intent);
test1.this.finish(); }
});
}
@Override
protected void onDestroy() {
System.out.println("onDestroy1");
super.onDestroy();
} @Override
protected void onStart() {
System.out.println("onStart1");
super.onStart();
} @Override
protected void onRestart() {
System.out.println("onRestart1");
super.onRestart();
} @Override
protected void onResume() {
System.out.println("onResume1");
super.onResume();
} @Override
protected void onPause() {
System.out.println("onPause1");
super.onPause();
} @Override
protected void onStop() {
System.out.println("onStop1");
super.onStop();
}
}

布局文件就不展示了。
运行程序,当前为默认的MainActivity。输出如下:

然后点击MainActivity中的button跳转至test1,输出如下:

最后再点击test1中的button按钮,输出如下:

这下,通过示例应该比较好理解了吧。

Activity横竖屏的切换(Ctrl+F12)

横竖屏切换的时候:
竖屏到横屏:activity首先被销毁,在创建一个新的activity
横屏到竖屏:activity首先被销毁,再创建一个新的activity,再把该activity销毁,再创建一个新的activity.(是由于输入法的影响)

Activity栈:

Android 是通过一种 Activity 栈的方式来管理 Activity 的,一个 Activity 的实例的状态决定它在栈中的位置。处于前台的 Activity 总是在栈的顶端,当前台的 Activity 因为异常或其它原因被销毁时,处于栈第二层的 Activity 将被激活,上浮到栈顶。当新的 Activity 启动入栈时,原 Activity 会被压入到栈的第二层。一个 Activity 在栈中的位置变化反映了它在不同状态间的转换。(通俗来讲:task的作用就是用来管理Activity的进入,退出。记录了用户的行为。栈顶的Activity是与用户交互的Activity。)Activity 的状态与它在栈中的位置关系如下图所示:

如上所示,除了最顶层即处在 Active 状态的 Activity 外,其它的 Activity 都有可能在系统内存不足时被回收,一个 Activity 的实例越是处在栈的底层,它被系统回收的可能性越大。系统负责管理栈中 Activity 的实例,它根据 Activity 所处的状态来改变其在栈中的位置。

Activity的四种启动模式: (需要在清单文件中配置)

  1. 标准模式(默认):启动一个Activity就会创建一个新的实例。
  2. singleTop:如果要启动的Activity已经在该任务栈栈顶,会重用栈顶的Activity,并且会调用Activity里面的一个方法:onNewIntent();(浏览器的书签就是采用的这个模式,可以增强用户体验)
  3. singleTask:如果要启动的Activity已经在任务栈里面。会清空这个Activity上面所有的Activity,再重用这个Activity。
  4. singleInstance:这样的Activity会占据一个单独的任务栈。如果去启动的时候发现我们的任务栈中已经有了一个引用,就断开之前的引用。(通话界面:InCallScreen 保证只有一个实例存在)

标准模式就不介绍了,简单的介绍一下其他模式:(a代表AActivity,b代表BActivity)
singleTop:我从a跳转到b,再从b跳转到b,最后从b跳转到a。(标准模式的话Activity栈中会有4个Activity,也就是按返回键需要按4次才能退出)此时,按返回键需要按3次,一次从a到b,第二次从b到a,第三次从a退出程序。

singleTask:我从a跳转到b,再从b跳转到a,最后从a跳转到b。(标准模式的话Activity栈中会有4个Activity,也就是按返回键需要按4次才能退出)此时,按返回键需要按2次,一次从b到a,第二次从a退出程序。

singleInstance:这个不太好说啊~上图吧。

注意:

需要在清单文件中进行配置,例如配置标准模式:

<activity android:name="com.topcsa.test_android.test1"
android:launchMode="standard">

以下部分摘自:http://ant-qingyun27sc.iteye.com/blog/1591682

此外,假设有两个Activity,分别是MainActivity,SecondActivity。MainActivity有一个EditText编辑框,设想一种情况:当我们编辑了一些内容时,MainActivity被跳转去了econdActivity,而正好系统又将MainActivity杀死,如果我们不对EditText的内容加以保存,当系统再度恢复MainActivity时,编辑好的内容就不会出现了。

这种情况可以借助onSaveInstanceState方法来保存Acitivity状态。

 public class MainActivity extends Activity {
private final static String KEY="key";
private EditText et;
private Button btn; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
et = (EditText) findViewById(R.id.et);
btn = (Button) findViewById(R.id.btn);
if(savedInstanceState!=null&&savedInstanceState.containsKey(KEY)==true){
et.setText(savedInstanceState.getString(KEY));
}
btn.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
Intent intent=new Intent();
intent.setClass(getApplicationContext(), main2.class);
startActivity(intent); }
});
} @Override
protected void onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
super.onSaveInstanceState(outState);
String content=et.getText().toString();//将EditText的内容保存到Bundle中,以便下次恢复Activity时读取
outState.putString(KEY, content);
} }

Android 四大组件之Acticity的更多相关文章

  1. Android四大组件之一Service介绍-android学习之旅(十二)

    基本概念: service是android四大组件之一,运行在后台执行耗时操作,并不提供用户界面.其他组件如acticity可以通过startService启动该组件,也可以通过bindService ...

  2. Android四大组件之一“广播”

    前言 Android四大组件重要性已经不言而喻了,今天谈谈的是Android中的广播机制.在我们上学的时候,每个班级的教室里都会装有一个喇叭,这些喇叭都是接入到学校的广播室的,一旦有什么重要的通知,就 ...

  3. Android 四大组件 与 MVC 架构模式

    作为一个刚从JAVA转过来的Android程序员总会思考android MVC是什么样的? 首先,我们必须得说Android追寻着MVC架构,那就得先说一下MVC是个啥东西! 总体而来说MVC不能说是 ...

  4. android四大组件(简单总结)

    activity 一个Activity通常就是一个单独的屏幕(窗口) Activity之间通过Intent进行通信 android应用中每一个Activity都必须要在AndroidManifest. ...

  5. android四大组件之Broadcast

    广播的概念 现实中:我们常常使用电台通过发送广播发布消息,买个收音机,就能收听 Android:系统在产生某个事件时发送广播,应用程序使用广播接收者接收这个广播,就知道系统产生了什么事件.Androi ...

  6. Android 四大组件之再论service

    service常见的有2种方式,本地service以及remote service. 这2种的生命周期,同activity的通信方式等,都不相同. 关于这2种service如何使用,这里不做介绍,只是 ...

  7. Android四大组件及activity的四大启动模式

    Android四大组件 1. 广播接收者的两种类型: (1)系统广播接收者,就是继承BroadcastReceiver这个类,然后还要在清单文件中注册,注册之后给他一个action.当系统发生了这个a ...

  8. Android成长日记-Android四大组件之Service组件的学习

    1.什么是Service? Service是Android四大组件中与Activity最相似的组件,它们都代表可执行的程序,Service与Activity的区别在于:Service一直在后台运行,它 ...

  9. Android四大组件之Activity(活动)及其布局的创建与加载布局

    Android四大组件之Activity(活动)及其布局的创建与加载布局 什么是Activity ? 活动(Activity)是包含用户界面的组件,主要用于和用户进行交互的,一个应用程序中可以包含零个 ...

随机推荐

  1. Unity3D实现简单的抽奖程序

    下面是具体的代码,注意,我这里用到了NGUI这个插件.大概的原理很简单,就用了2张图片Sprite,同时向下移动,当上面一张图片移动到下面一张图片原来的位置时,就把这2张图片向上移到初始的位置.这时, ...

  2. 【现代程序设计】【homework-02】【11061027】

    Q:描述在这么多相似的需求面前, 你怎么维护你的设计 (父类/子类/基类, UML, 设计模式,  或者其它方法) 让整个程序的架构不至于崩溃的? A:由于使用的是面向过程的C语言,所以维护设计这个问 ...

  3. nyoj 289 苹果

    苹果 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 ctest有n个苹果,要将它放入容量为v的背包.给出第i个苹果的大小和价钱,求出能放入背包的苹果的总价钱最大值. ...

  4. IAR 编译错解决Error[e16]: Segment NEAR_Z (size: 0x16d align: 0) is too long for segment definition. At least 0x83 more bytes needed.

    Error[e16]: Segment NEAR_Z (size: 0x16d align: 0) is too long for segment definition. At least 0x83 ...

  5. IE6完美解决fixed方法

    ie6对position:fixed不支持,网上有很多解决方法,有的在ie6,ie7上调试成功后,在ie8上又不好使,div层还是跟随滚动条浮 动:以下总结方法,在ie6,ie7,ie8上都调试成功, ...

  6. 《MEF程序设计指南》博文汇总

    <MEF程序设计指南>博文汇总 在MEF之前,人们已经提出了许多依赖注入框架来解决应用的扩展性问题,比如OSGI 实现以Spring 等等.在 Microsoft 的平台上,.NET Fr ...

  7. MySQL 约束

    MySQL中约束保存在information_schema数据库的table_constraints中,可以通过该表查询约束信息: 约束主要完成对数据的检验,保证数据库数据的完整性:如果有相互依赖数据 ...

  8. linux系统基础(二)

    磁盘管理(一) Linux设备认识 /dev/cdrom /dev/sr0 /dev/mouse /dev/sda /dev/hda IDE硬盘(支持4块):hd(a-d) [非IDE硬盘]SCSI硬 ...

  9. Genymotion中文手册

    目录1.概述 22.特点 22.1最擅长于虚拟Android 22.2高可控性 22.3管理你的设备 22.4从Eclipse中开启虚拟设备 33.要求 33.1操作系统要求 33.2系统硬件要求 3 ...

  10. js中substr,substring,indexOf,lastIndexOf,split用法

    1.substr substr(start,length)表示从start位置开始,截取length长度的字符串. var src="images/off_1.png"; aler ...