Android-Activity的使用(二)

Activity作为在Android中四大组件之一,是非常重要。在app应用中,有非常多的activity,那这些activity是通过什么数据结构来管理的呢?同时关于activity的几种启动模式,又有什么区别呢?还有activity的生命周期,这些本文都会一一的讲解。

  1.示例

第一个activity

 1 public class MyActivity extends AppCompatActivity {
 2     private Button mButton = null;
 3     @Override
 4     protected void onCreate(@Nullable Bundle savedInstanceState) {
 5         super.onCreate(savedInstanceState);
 6         setContentView(R.layout.activity_my);
 7         mButton = (Button) findViewById(R.id.id_back);
 8         mButton.setOnClickListener(new View.OnClickListener() {
 9             @Override
10             public void onClick(View v) {
11                 Intent intent = new Intent(MyActivity.this, MainActivity.class);
12                 startActivity(intent);
13             }
14         });
15     }
16 }

第二个activity

 1 public class MyActivity extends AppCompatActivity {
 2     private Button mButton = null;
 3     @Override
 4     protected void onCreate(@Nullable Bundle savedInstanceState) {
 5         super.onCreate(savedInstanceState);
 6         setContentView(R.layout.activity_my);
 7         mButton = (Button) findViewById(R.id.id_back);
 8         mButton.setOnClickListener(new View.OnClickListener() {
 9             @Override
10             public void onClick(View v) {
11                 Intent intent = new Intent(MyActivity.this, MainActivity.class);
12                 startActivity(intent);
13             }
14         });
15     }
16 }

效果如图:

我先点击跳转的按钮,跳转到第二个activity,然后在第二个activity中点击返回按钮,又跳转到第一个activity界面,如此反反复复。最后,在点击手机按键上的返回按钮,效果如下

当我们点击手机上的返回键时,会返回它会返回很多个activity,才能正常退出到桌面,这让人很疑惑,我们只有两个activity,点击手机上的返回键为什么会在第一个界面和第二个界面反复的跳转呢?这就要说一下我们的activity管理的数据结构。

2.activity的管理数据结构--栈

(1)什么是栈

栈是数据结构的一种类型,符合先进先出的规则,只有一个进出口,而且进栈(向栈中添加数据)和出栈(先栈中取数据)都是一个进出口出入的。

进栈示意图:

出栈示意图:

栈的示意图:

 (2)Activity的任务栈

在Android系统的一个app中,所有的Acitivty都维持在一个任务栈中。当我们使用Intent从第一个activit跳转到第二个activity的时候,第一个activity就被送入栈中,并且是栈顶。如果第二个activity又使用Intent跳转回来,第一个activity不会从任务栈出来,因为第二个activity使用Intent跳转回来的时候,它自己也会入栈,它自己成为栈顶。如此以来的话,反反复复的,栈中就有很多第一个activity和第二个activity的对象,如图:

当我们开始点击手机上的返回键时候,这时候系统会从任务栈中的栈顶取得一个activity的对象,取得哪一个activity对象,就显示那个activity的界面,并且该对象在栈中消失,这就解释我们之前的示例出现的原因。

(3)清空任务栈

在Android开发过程中,有时候我们需要清空任务栈中的所有Activity的对象。比如说,我们在一个应用中的注销时,肯定要清空任务栈中的所有的Activity对象,否则的话,有可能就会出现一些问题。

A.使用Intent的flags

在使用Intent的时候,给intent对象设置: intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);通过这一句话,我们可以就可以清空任务栈中的所有Activity对象。

  B.clearTaskOnLaunch

clearTaskOnLaunch顾名思义,就在每次返回该Activity的时候,都将该Activity以上的所有Activity对象清除。通过这个属性,可以让这个Task(任务栈)中,每次初始化的时候,都只有一个Activity对象。

C.finshOnTaskLaunch

finishOnTaskLaunch属性与clearTaskOnLaunch属性类似,只不过clearTaskOnLaunch作用在别人的身上,而finishOnTaskLaunch作用在自己身上。通过这个属性,当离开这个这个Activity所处的Task时,用户在返回的话,该对象的就会被销毁。

D.alwaysRetainTaskState

alwaysRetainTaskState属性给了Task一道免死金牌,如果将Activity的该属性设置为true的话,那么该Activity所处的Task不再接受任何的清理命令。

注意:

1.同一个activity任务栈的中activity不一定都来自同一个APP,同时,同一个app的所有activity不一定都在同一个activity任务栈中,前面为了简洁才那样说的

2.当我们使用startActivity之类的跳转一个activity的时候,如果调用finish()方法,那该activity的对象就不会进入任务栈中

1                 Intent intent = new Intent(MyActivity.this, MainActivity.class);
2                 startActivity(intent);
3                 MyActivity.this.finish();

3.Activity的启动模式

在Android中,Activity是代表的是一个界面,同时每一个Activity都有自己的启动模式。在开始学习Android的时候,可能不知道什么是启动模式,也不知道启动模式有什么作用。之前我们说过Activity有相应的任务栈,其实启动模式就是关于Activity的对象在任务栈中是怎么创建和使用。

在Android中,启动模式一共分为4种,分别是standard,singleTop,singleTask,singleInstance。我们可以在AndroidManifest.xml文件中来配置每一个的Activity的启动模式,之前我们在创建一个Activity的时候,就在AndroidManifest.xml文件中进行了注册。在设置Activity的启动模式时,在<activity>标签中通过android:launchMode属性来设置启动模式。

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 3     package="com.example.android_demo">
 4
 5     <uses-permission android:name="android.permission.FLASHLIGHT" />
 6     <uses-permission android:name="android.permission.VIBRATE"></uses-permission>
 7
 8     <application
 9         android:allowBackup="true"
10         android:icon="@mipmap/ic_launcher"
11         android:label="@string/app_name"
12         android:roundIcon="@mipmap/ic_launcher_round"
13         android:supportsRtl="true"
14         android:theme="@style/AppTheme">
15         <activity android:name=".MainActivity"
16             android:launchMode="standard"
17             >
18             <intent-filter>
19                 <action android:name="android.intent.action.MAIN"></action>
20                 <category android:name="android.intent.category.LAUNCHER"></category>
21             </intent-filter>
22
23         </activity>
24         <activity android:name=".MyActivity"></activity>
25     </application>
26 </manifest>

(1).standard

standard模式是Activity的默认启动模式,如果我们注册一个Activity的时候,对启动模式不进行设置的话,那么这个Activity的启动模式默认就是standard模式。

在standard模式下,每当使用Intent来启动一个Activity的时候,都会将原Activity的对象压入栈中,并且在创建第二个Activity的对象,无论栈中时候含有相应Activity的对象。之前我们演示的那个示例,就是这种启动模式。

 (2).singleTop

如果指定启动Activity为singleTop模式时,那么在启动一个新的Activity时,先在任务栈中判断当前的栈顶对象是否是新的Activity对象,如果是的话,则不进行创建新的Activity的对象,直接使用栈顶的对象就行。

 (3).singleTask

singleTask模式与singleTop比较类似。只是singleTop判断当前栈顶的Activity的对象是不是将要启动的Activity的对象,如果是的话,则不进行创建启动的Activity的对象,如果不是的话,则创建;而singleTask是判断整个任务栈中是否含有将要启动的Activity的对象,如果有的话,则不进行创建对象, 将该对象移动至栈顶,并且将栈中在该对象以上的activity的对象销毁;如果没有的话,才进行创建。总而言之,singleTask启动模式保证该Activity的对象在任务栈中只含有一个对象。

 (4).singleInstance

singleInstance这种启动模式和使用的浏览器工作原理很像。当多个程序访问浏览器时,如果当前的浏览器没有打开的话,则打开浏览器,否则会在当前的浏览器中打开的。启动模式为singleInstance的Activity会出现在一个新的任务栈中,而且该任务栈中只含有一个Activity的对象,也就是该Activity的对象。

4.Activity的生命周期

在这里,才接触Android的人肯定有疑问,什么是生命周期。其实Activity的生命周期就像是人的一生,人从出生到成长,再到衰老,最后到死亡。Activity的生命周期跟人的一生相似,也有出生(创建)-成长(启动)-衰老(暂定)-死亡(销毁)的过程。

这个是Google官方给的一张示意图,这里面就详细介绍了一个Activity的声生命周期的每一个过程。

大体的流程是:onCreate() -->  onStart() --> onResume() -->onPause() --> onStop() --> onDestroy();

(1).onCreate()

这个方法是Activity开始创建的时候调用的。我们可以在这个方法里面进行初始换的操作,比如说,绑定布局,初始化事件等等。

(2).onStart()

当Activity调用了onCreate()方法后,就会调用这个方法,这个方法就是在启动Acitivty的时候就会调用。

(3).onReume()

这个方法在该Activity在该应用的最顶层时调用,也就是当前用户正在跟该Activity进行交互。

(4).onPause()

这个方法在该Activity准备启动或者是恢复其他的Acitivty调用。我们通常会在这个方法里面释放一些CPU资源,以及保存一些数据,但是这个方法一定执行的快,不然会影响到新的栈顶Activity的使用。还有就是在启动一个Dialog时,也会调用该方法。

(5).onStop()

这个方法在该Activity完全不可见时调用,也就是说该Activity被其他的东西完全覆盖了,就会调用该方法。

(6).onDestroy()

这个方法在该Activity准备销毁时开始调用。

(7).onReStart()

这个方法在该Activity从完全不可见到可见的过程调用。

时间: 2024-11-07 03:03:21

Android-Activity的使用(二)的相关文章

从零开始学android&lt;RatingBar评分组件.二十三.&gt;

如果现在用户要对某个应用程序打分往往会使用图所示的组件,通过选择的"五角星"的个数来决定最终的打分成绩 这样的功能在Android之中,可以使用RatingBar组件实现,使用此组件可以方便用户的输入,而且很直观,RatingBar类的定义结构如下: java.lang.Object ? android.view.View ? android.widget.ProgressBar ? android.widget.AbsSeekBar ? android.widget.RatingBa

Android学习路线(二十)运用Fragment构建动态UI

要在Android系统上创建一个动态或者多面板的用户界面,你需要将UI组件以及activity行为封装成模块,让它能够在你的activity中灵活地切换显示与隐藏.你可以使用Fragment类来创建这些模块,它们能够表现得有些像嵌套的activity,它们定义着自己的布局,管理自己的生命周期. 当一个fragment指定了它自己的布局,它可以在activity中和其他的fragment配置为不同的组合,这样就能够为不同的屏幕尺寸来修改你的布局配置(在小屏幕上一次展现一个fragment,而在大屏

Android学习路线(二十一)运用Fragment构建动态UI——创建一个Fragment

你可以把fragment看成是activity的模块化部分,它拥有自己的生命周期,接受它自己的输入事件,你可以在activity运行时添加或者删除它(有点像是一个"子activity",你可以在不同的activity中重用它).本课将向你展示如何使用Support Libaray继承 Fragment 类来让你的应用能够兼容正在运行Android 1.6的设备. 提示: 如果你决定你的应用需求的最低API级别是11或者更高,那么你不需要使用Support Library,你可以直接使用

Android Framework 记录之二

原文地址:http://blog.csdn.net/banketree/article/details/24982021 接着上次的记录,续写. 23.services目录 文件 描述 class AlarmManagerService extends IAlarmManager.Stub { //定时管理服务 public class AppOpsService extends IAppOpsService.Stub {  // 程序选项服务 public class AppsLaunchFa

Android学习笔记(二)--iparty登陆界面

打开应用,判断是否第一次使用. 1 private void beforeInitMenu() { 2 AppContext appContext = (AppContext) getApplicationContext(); 3 4 if (appContext.isFirstLogin()) { 5 // 第一次启动 6 //如果第一次启动,出现5张引导图片. 7 Intent intent = new Intent(this, GuideActivity.class); 8 startAc

android快速上手(二)android开发环境搭建及hello world

基本了解了java语法,下一步,我们一起开启hello world的神秘之旅. (一)android开发环境搭建 之前搭建android开发环境是件非常费力的事情,下载Eclipse,安装ADT等,如今android官方给我们提供了全套配置. https://developer.android.com/sdk/index.html 搭建android开发环境之前记得先安装jdk (二)开启Hello World之旅 (1)创建Hello World项目 安装完带ADT的Eclipse,打开Ecl

Android Activity启动模式

在Android的联机文档中,有对Activity的简单介绍,现在通过编写代码对Activity的启动模式做一个深入的理解.在配置文件AndroidManifest.xml中,activity元素的android:launchMode属性用来配置对应Activity的启动模式,目前有以下四种启动模式:1.standard2.singleTop3.singleTask4.singleInstance如果不对Activity设置启动模式,默认就是standard模式 一.standard 请看以下代

[转]Android:Activity+Fragment及它们之间的数据交换(一)

2014-05-18         来源:Android:Activity+Fragment及它们之间的数据交换(一)   简介: 为什么要用Fragment?使用Fragment可以在一个Activity中实现不同的界面.Fragment与 Fragment之间的动画切换,远比Activity与Activity之间的动画切换变化方式多.很多时候,我们通过使用一个Activity,切换 多个Fragment.本次博客,主要列举一下Fragment与它的Activity之间进行数据交换的方式.

Android APP压力测试(二)之Monkey信息自动收集脚本

Android APP压力测试(二) 之Monkey信息自动收集脚本 前言: 上一篇Monkey介绍基本搬抄官方介绍,主要是为了自己查阅方便.本文重点介绍我在进行Monkey时如何自动收集相关信息,主要收集Monkey测试日志.手机日志.手机屏幕截图.测试手机信息,自动按次按时间点保存信息.只需轻轻一点,腾出手腾出脑想干吗干吗,执行结束应该有信息的都有收集,一定程序提升了效率,节约了时间.可以偷空看看美图.聊天扯淡...哦不,是学习提高审美观,沟通交流增进同事情感... 转载请注明出处:Find

Android 适配器教程(二)

上次我写了一个类似前言的东西,向大家粗略介绍了一下什么是适配器,并且举了一个最简单的例子帮助大家理解,使用了安卓原生的ArrayAdapter,现在我们继续向下学习,同时也继续在我们上次的Demo项目中继续添加例子,一步步的向下深入学习. 这次要讲解的是另外一个常用的安卓原生适配器-SimpleCursorAdapter: 关于SimpleCursorAdapter,sdk的解释是这样的: An easyadapter to map columns from a cursor to TextVi