一、万事开头的序

  网上看见大牛们的博客写的那样精彩,各种羡慕之情溢于言表。几次冲动均想效仿牛人写些博客来记录下自己的心得体会,但均无感亦或是感觉容易被喷,相信很多菜鸟和我一样都有过这样的担忧。万事开头难,不逼一下自己怎么知道自己能不能飞起来。由于本人处于初学阶段,写此博客仅是对前辈总结的review,对自己记忆的加深及后续使用的方便查找。请各位看官将就看看,手下留情。在此谢过!有错的地方或者更好的心得体会欢迎随时骚扰!

二、Activity介绍

Android中常说的四大组件包括:Activity、Service、Broadcast、Content Provider

其中最基础也是最常见的就是今天review的主题:Activity

Activity存在的意义:用户与Android系统的交互的途径

三、Activity的生命周期

老套路先上经典的生命周期图:

(1)正常情况下的生命周期

Activity的生命周期主要由上述8个方法组成

  • onCreate表示Activity已经被创建(初始化)

在该方法中我们可以做一些初始化的相关操作

  1. 加载布局资源文件:setContentView(R.layout.XX);
  2. 初始化数据:findViewById(R.id.XX);
  • onRestart 通常在Activity从不可见, 重新变为可见时, 在onStart之前调用
  • onStart 表示Activity已经显示出来, 但是不能进行交互
  • onResume 表示Activity不仅仅显示出来, 而且已经在前台活动
  • onPause 表示Activity退出前台活动

在该方法中可以做以下操作:
1: 储存数据
2: 停止动画
onStop:表示Acitivity正在停止或者即将被销毁
onDestroy:表示Activity的销毁, 所做的操作和onCreate正好相反
PS: 耗时操作不要放到onPause或onStop中

  1. 首次打开:onCreate()->onStart()->onResume()
  2. 按back键结速应用程序:onPause()->onStop()->onDestory()
  3. 按home键隐藏应用程序:onPause()->onStop()//此时程序未销毁
  4. 再次启动应用程序:onRestart()->onStart()->onResume()
  5. 从Activity(A)跳转到Activity(B):onPause(A)->onCreate(B)->onStart(B)->onResume(B)->onStop(A)

(2)异常情况下的生命周期

当用户转动屏幕时,Activity销毁并重建的过程如下:

onPause()->onSaveInstanceState()->onStop()->onDestory()->onCreate()->onStart()->onRestoreInstanceState()->onResume()

系统自带的控件, 如TextView的文本内容Android系统会帮我们保存和恢复
App的状态, 则需要我们自己在onSaveInstanceState和onRestoreInstanceState中保存和恢复

@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.i(TAG, "onSaveInstanceState"); outState.putString(BUNDLE_DATA, "xyz");
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.i(TAG, "onRestoreInstanceState: " + savedInstanceState.getString(BUNDLE_DATA));
}

我们能否在系统配置更新时, 自己对Activity的生命周期进行控制呢?
答案是可以的, android提供了这样的机制
我们在AndroidManifest.xml中的Activity描述中添加如下配置
android:configChanges="orientation|screenSize"
再次旋转屏幕看看, Activity并没有销毁和重建了

四、Activity启动模式

与Activity生命周期息息相关的是Activity启动模式,不同的启动模式,导致的Activity生命周期则不同。

Activity有如下4种启动模式:

  • standard
  • singleTop
  • singleTask
  • singleInstance

1: standard

Step 1: (standard launch)FirstActivity
Current Task Stack:
++++FirstActivity
Step 2: (standard launch)SecondActivity
Current Task Stack:
++++SecondActivity
++++FirstActivity
Step 3: (standard launch)FirstActivity
Current Task Stack:
++++FirstActivity
++++SecondActivity
++++FirstActivity

standard下: 总是会新建一个Activity入栈

Standard,默认的启动模式,只要激活了Activity,就会创建一个新的实例,并放入任务栈中,这样任务栈中可能同时存在一个Activity的多个实例。

2: singleTop

Step 1: (standard launch)FirstActivity
Current Task Stack:
++++FirstActivity
Step 2: (standard launch)SecondActivity
Current Task Stack:
++++SecondActivity
++++FirstActivity
Step 3: (singleTop launch)SecondActivity
Current Task Stack:
++++SecondActivity
++++FirstActivity

singleTop下: 如果栈顶是该Activity, 则不新建, 如果栈顶不是该Activity, 则新建该Activity

SingleTop,激活Activity时,如果栈顶是Activity,就不会创建新的实例,如果栈顶不是这个Activity,则会创建新的实例对象。

3: singleTask

Step 1: (standard launch)FirstActivity
Current Task Stack:
++++FirstActivity
Step 2: (standard launch)SecondActivity
Current Task Stack:
++++SecondActivity
++++FirstActivity
Step 3: (singleTask launch)FirstActivity
Current Task Stack:
++++FirstActivity

singleTask下: 如果栈里已经存在该Activity, 即pop到该Activity, 如果栈里没有该Activity, 则新建Activity

singleTask,如果栈中存在Activity的实例,则将栈中该实例以上的其他Activity的实例移除,让该Activity的实例处于栈顶,如果栈中不存在该实例,则创建新的实例。

4: singleInstance

Step 1: (standard launch)FirstActivity
Current Task Stack:
++++FirstActivity
Step 2: (singleInstance launch)ThirdActivity
Current Task Stack:
++++FirstActivity ++++ThirdActivity
Step 3: (standard launch)SecondActivity
Current Task Stack:
++++SecondActivity
++++FirstActivity ++++ThirdActivity

singleInstance下: 会新开一个栈, 单独放置该Activity

多个应用共享Activity的一个实例,不论是否是同一个应用,只要是激活该Activity,都重用这个实例。

五、Activity实例

1.Activity注册

 // in AndroidManifest.xml
<activity android:name=".SecondActivity" >
</activity>

2.Activity之Intent

 // in FirstActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_first);
Button standardButton = (Button) findViewById(R.id.standard_button);
standardButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Intent intent = new Intent(FirstActivity.this,
SecondActivity.class);
startActivity(intent);
}
});
}

3.Activity之Intent-Filter

 //in mainifest.xml
<intent-filter>
<action android-name="android.intent.action.MAIN" />
<category android-name="android.intent.category.LAUNCHER" />
</intent-filter>

4.Activity间通信: FirstActivity -> SecondActivity

 // in FirstActivity.java
public static final String EXTRA_DATA = "extra_data";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_first);
Button standardButton = (Button) findViewById(R.id.standard_button);
standardButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Intent intent = new Intent(FirstActivity.this,
SecondActivity.class);
intent.putExtra(EXTRA_DATA, "cba");
startActivityForResult(intent, REQUEST_CODE);
}
});
}
// in SecondActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Intent intent = getIntent();
Toast.makeText(
SecondActivity.this,
"Data from FirstActivity: "
+ intent.getStringExtra(FirstActivity.EXTRA_DATA),
Toast.LENGTH_LONG).show();
}

5.Activity间通信: SecondActivity -> FirstActivity

 // in FirstActivity.java
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_first);
Button standardButton = (Button) findViewById(R.id.standard_button);
standardButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Intent intent = new Intent(FirstActivity.this,
SecondActivity.class);
startActivityForResult(intent, REQUEST_CODE);
}
});
}
// in SecondActivity.java
@Override
protected void onResume() {
super.onResume();
Intent intent = new Intent();
intent.putExtra(EXTRA_DATA, "abc");
setResult(Activity.RESULT_OK, intent);
}
// in FirstActivity.java
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != Activity.RESULT_OK) {
return;
}
switch (requestCode) {
case REQUEST_CODE:
Toast.makeText(
FirstActivity.this,
"Result from SecondActivity: "
+ data.getStringExtra(SecondActivity.EXTRA_DATA),
Toast.LENGTH_LONG).show();
break;
default:
break;
}
}

6.配置Activity启动模式
静态方式
即在AndroidManifest.xml中配置

android:launchMode="singleTop"
android:launchMode="singleTask"
android:launchMode="singleInstance"

动态方式
即在源码中配置

intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

基础总结之Activity的更多相关文章

  1. Android基础——Fragment与Activity交互

    今天继续讲解Fragment组件的特性,主要是跟Activity的交互和生命周期的关系,我们前面已经说过Fragment是依赖于Activity的,而且生命周期也跟Activity绑定一起.下面我们看 ...

  2. Android基础知识04—Activity活动之间传递数据

    ------活动之间传递数据------ 向下一个活动传递数据: Intent中提供了一系列的putExtra()方法,可以把数据暂存到Intent中,启动另一个活动的时候就可以取出来. 代码: (存 ...

  3. Android基础知识03—Activity的基本用法

    ------Activity 活动------ 活动 Activity 是一种包含用户界面的组件,即一个界面就是一个活动 创建活动的过程: >> 创建一个类,继承自Activity类,并且 ...

  4. Android学习之基础知识四-Activity活动7讲(活动的启动模式)

    在实际的项目开发中,我们需要根据特定的需求为每个活动指定恰当的启动模式.Activity的启动模式一共有4种:standard.singleTop.singleTask.singleInstance. ...

  5. Android学习之基础知识四-Activity活动6讲(体验Activity的生命周期)

    一.体验活动的生命周期的执行 代码组成: 1.三个Java类:MainActivity.java.NormalActivity.java.DialogActivity.java 2.三个布局文件:ac ...

  6. Android学习之基础知识四-Activity活动5讲(Activity的生命周期)

    一.返回栈 1.Android是通过任务(Task)来管理活动,一个任务就是一个返回栈内所有活动的集合. 2.返回栈是一个后进先出的数据结构,每启动一个新的活动,该活动就会覆盖原来的活动,位于栈顶位置 ...

  7. Android学习之基础知识四-Activity活动4讲(Intent传递数据)

    Intent除了可以开启一个活动,还能在启动活动的时候传递数据,此时Intent相当于一个保存数据的库,我们先把数据保存在Intent中,然后再根据各个activity的需要从其中取出数据.  一.使 ...

  8. Android学习之基础知识四-Activity活动3讲(Intent的使用)

    主活动名称FirstActivity.java改为了MenuTest.java 一.什么是Intent: 1.Intent是Android程序中各组件之间进行交互的重要方式,不仅可以指明当前组件想要进 ...

  9. Android学习之基础知识四-Activity活动2讲

    一.在活动(activity)中添加Toast显示: 1.Toast作用:Android系统提供的一种非常好的提醒方式,将一些短小的信息提供给用户,这些信息会在一段时间后自动消失,不会占用任何屏幕空间 ...

随机推荐

  1. 微信网页开发之获取用户unionID的两种方法--基于微信的多点登录用户识别

    假设网站A有以下功能需求:1,pc端微信扫码登录:2,微信浏览器中的静默登录功能需求,这两种需求就需要用到用户的unionID,这样才能在多个登录点(终端)识别用户.那么这两种需求下用户的unionI ...

  2. jquery学习(一)

    简单的jquery学习,首先在页面引入jquery <!-- 引入jquery --> <script src="js/jquery-1.8.3.js" type ...

  3. 太多选择——企业如何选择合适的BI工具?

    在没认清现状前,企业当然不能一言不合就上BI. BI不同于一般的企业管理软件,不能简单归类为类似用于提高管理的ERP和WMS,或用于提高企业效率的OA.BPM.BI的本质应该是通过展现数据,用于加强企 ...

  4. BPM配置故事之案例1-配置简单流程

    某天,Boss找到了信息部工程师小明. Boss:咱们新上了H3 BPM,你研究研究把现在的采购申请流程加上去吧,这是采购申请单. 小明:好嘞 采购申请单 小明回去后拿着表单想了想,开始着手配置. 他 ...

  5. android计算每个目录剩余空间丶总空间以及SD卡剩余空间

    ublic class MemorySpaceCheck { /** * 计算剩余空间 * @param path * @return */ public static String getAvail ...

  6. CentOS7 + mono +Jexus 环境的搭建

    CentOS7的安装和配置 1,从http://www.centos.org/下载CentOS7的镜像,并在VMWare中创建该镜像的虚拟机,为方便操作,把虚拟机的网络连接设置为桥接模式:在安装过程中 ...

  7. 【腾讯bugly干货分享】微信Android热补丁实践演进之路

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://bugly.qq.com/bbs/forum.php?mod=viewthread&tid=1264& ...

  8. 提升网速的路由器优化方法(UPnP、QoS、MTU、交换机模式、无线中继)

    在上一篇<为什么房间的 Wi-Fi 信号这么差>中,猫哥从微波炉.相对论.人存原理出发,介绍了影响 Wi-Fi 信号强弱的几大因素,接下来猫哥再给大家介绍几种不用升级带宽套餐也能提升网速的 ...

  9. Nodejs之MEAN栈开发(八)---- 用户认证与会话管理详解

    用户认证与会话管理基本上是每个网站必备的一个功能.在Asp.net下做的比较多,大体的思路都是先根据用户提供的用户名和密码到数据库找到用户信息,然后校验,校验成功之后记住用户的姓名和相关信息,这个信息 ...

  10. 简单例子了解View的事件分发

    什么是事件分发 我们在写自定义ViewGroup或者自定义View的时候经常要处理用户的点击事件,如果我们的View在最底层,他在很多ViewGroup里面,我们如何让我们的点击事件准确传递到View ...