1. Activity是Android程序与用户交互的窗口,是四大组件中最为复杂的一种,需要好好的理解并掌握其生命周期,一个activity的创建和销毁包含很多的回调方法。

2. 一个简化的activity运行图,如下图中所示。

一个activity包含创建->开始->继续->暂停->停止->销毁等状态,各个状态间的转化又包含着各种方法,这些方法可以重写或是回调。

activity只有在三个状态下是静态的,就是说只有在这三种状态下可以保存很长的时间。


  • 继续 在这种状态下,Activity处于前台,且用户可以与其交互。(有时也称为“运行”状态。)
  • 暂停 在这种状态下,Activity被在前台中处于半透明状态或者未覆盖整个屏幕的另一个Activity—部分阻挡。 暂停的Activity不会接收用户输入并且无法执行任何代码。
  • 停止 在这种状态下,Activity被完全隐藏并且对用户不可见;它被视为处于后台。 停止时,Activity实例及其诸如成员变量等所有状态信息将保留,但它无法执行任何代码。

记住:其他状态(“创建”和“开始”)是瞬态,系统会通过调用下一个生命周期回调方法从这些状态快速移到下一个状态。 也就是说,在系统调用 onCreate() 之后,它会快速调用 onStart(),紧接着快速调用 onResume()。

AndroidManifest.xml 定义哪个Activity用作主Activity,该说明文件位于您项目目录的根目录中。您的应用的主Activity必须使用 (包括 MAIN 操作和 LAUNCHER 类别)在宣示说明中声明。例如

<activity android:name=".MainActivity" android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter>
</activity>

3. 实现 onCreate() 方法执行应在Activity整个生命周期出现一次的基本应用启动逻辑。例如, onCreate() 的实现应定义用户界面并且可能实例化某些类范围变量。

TextView mTextView; // Member variable for text view in the layout@Override
public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// Set the user interface layout for this Activity// The layout file is defined in the project res/layout/main_activity.xml filesetContentView(R.layout.main_activity);// Initialize member TextView so we can manipulate it latermTextView = (TextView) findViewById(R.id.text_message);// Make sure we're running on Honeycomb or higher to use ActionBar APIsif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {// For the main activity, make sure the app icon in the action bar// does not behave as a buttonActionBar actionBar = getActionBar();actionBar.setHomeButtonEnabled(false);}
}

一旦 onCreate() 完成执行操作,系统会相继调用 onStart() 和 onResume() 方法。 Activity从不会驻留在“已创建”或“已开始”状态。在技术上,Activity会在 onStart() 被调用时变得可见,但紧接着是 onResume(),且Activity保持“继续”状态,直到有事情发生使其发生变化,比如当接听来电时,用户导航至另一个Activity,或设备屏幕关闭。

补充:Bundle主要用于传递数据;它保存的数据,是以key-value(键值对)的形式存在的。还有就是,Bundle是可以对对象进行操作的,而Intent不可以。Bundle相对于Intent比较偏下层,比Intent接口更多,更灵活,但Bundle仍需要借助Intent才能在Activity之间传递。概括一下,Intent旨在数据传递,bundle旨在存取数据,当然intent也提供一部分数据的存取,但比起bundle就显得不专业,不灵活的多。

4.如何销毁activity

@Override
public void onDestroy() {super.onDestroy();  // Always call the superclass// Stop method tracing that the activity started during onCreate()android.os.Debug.stopMethodTracing();
}

5.暂停和继续activity

什么时候会暂停?前台Activity有时会被其他导致Activity暂停的可视组件阻挡。 例如,当半透明Activity打开时(比如对话框样式中的Activity),上一个Activity会暂停。 只要Activity仍然部分可见但目前又未处于焦点之中,它会一直暂停。

当Activity进入暂停状态时,系统会对 Activity 调用 onPause() 方法,通过该方法,可以停止不应在暂停时继续的进行之中的操作(比如视频)或保留任何应该永久保存的信息,以防用户坚持离开应用。如果用户从暂停状态返回到Activity,系统会重新开始该Activity并调用 onResume() 方法。

当半透明Activity阻挡您的Activity时,系统会调用 onPause() 并且Activity会在“暂停”状态下等待 (1)。 如果用户在Activity仍然处于暂停状态时返回Activity,则系统会调用 onResume() (2)。

6. 暂停时,通常应使用 onPause() 回调:

  • 停止动画或其他可能消耗 CPU 的进行之中的操作。
  • 提交未保存的更改,但仅当用户离开时希望永久性保存此类更改(比如电子邮件草稿)。
  • 释放系统资源,比如广播接收器、传感器手柄(比如 GPS) 或当您的Activity暂停且用户不需要它们时仍然可能影响电池寿命的任何其他资源。

例如,如果您的应用使用 Camera, onPause() 方法是释放它的好位置。

@Override
public void onPause() {super.onPause();  // Always call the superclass method first// Release the Camera because we don't need it when paused// and other activities might need to use it.if (mCamera != null) {mCamera.release()mCamera = null;}
}

7. 继续Activity

@Override
public void onResume() {super.onResume();  // Always call the superclass method first// Get the Camera instance as the activity achieves full user focusif (mCamera == null) {initializeCamera(); // Local method to handle camera init}
}

8. 几种Activity停止和重新开始的关键场景:

  • 户打开“最近应用”窗口并从您的应用切换到另一个应用。当前位于前台的您的应用中的Activity将停止。 如果用户从主屏幕启动器图标或“最近应用”窗口返回到您的应用,Activity会重新开始。

  • 用户在您的应用中执行开始新Activity的操作。当第二个Activity创建好后,当前Activity便停止。 如果用户之后按了返回按钮,第一个Activity会重新开始。

  • 用户在其手机上使用您的应用的同时接听来电.

用户离开Activity时,系统会调用 onStop() 停止Activity(1)。 如果用户在Activity停止时返回,系统会调用 onRestart() (2),紧接着调用 onStart() (3) 和 onResume() (4)。 注意:无论什么场景导致Activity停止,系统始终会在调用 onStop() 之前调用 onPause()。

9.停止Activity

@Override
protected void onStop() {super.onStop();  // Always call the superclass method first// Save the note's current draft, because the activity is stopping// and we want to be sure the current note progress isn't lost.ContentValues values = new ContentValues();values.put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText());values.put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle());getContentResolver().update(mUri,    // The URI for the note to update.values,  // The map of column names and new values to apply to them.null,    // No SELECT criteria are used.null     // No WHERE columns are used.);
}

11. 开始/重新开始Activity

@Override
protected void onStart() {super.onStart();  // Always call the superclass method first// The activity is either being restarted or started for the first time// so this is where we should make sure that GPS is enabledLocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);if (!gpsEnabled) {// Create a dialog here that requests the user to enable GPS, and use an intent// with the android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS action// to take the user to the Settings screen to enable GPS when they click "OK"}
}@Override
protected void onRestart() {super.onRestart();  // Always call the superclass method first// Activity being restarted from stopped state
}

12. 每次用户旋转屏幕时,您的Activity将被销毁并重新创建。 当屏幕方向变化时,系统会销毁并重新创建前台Activity,因为屏幕配置已更改并且您的Activity可能需要加载备用资源(比如布局)。

要保存有关Activity状态的其他数据,您必须替代 onSaveInstanceState() 回调方法。当用户要离开Activity并在Activity意外销毁时向其传递将保存的 Bundle 对象时,系统会调用此方法。 如果系统必须稍后重新创建Activity实例,它会将相同的 Bundle 对象同时传递给 onRestoreInstanceState() 和 onCreate() 方法。

当系统开始停止您的Activity时,它会 调用 onSaveInstanceState() (1),因此,您可以指定您希望在 Activity 实例必须重新创建时保存的额外状态数据。如果Activity被销毁且必须重新创建相同的实例,系统将在 (1) 中定义的状态数据同时传递给 onCreate() 方法(2) 和 onRestoreInstanceState() 方法(3)。

13. 要保存Activity的更多状态信息,您必须实现 onSaveInstanceState() 并将键值对添加至 Bundle 对象。 例如:

static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
...@Override
public void onSaveInstanceState(Bundle savedInstanceState) {// Save the user's current game statesavedInstanceState.putInt(STATE_SCORE, mCurrentScore);savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);// Always call the superclass so it can save the view hierarchy statesuper.onSaveInstanceState(savedInstanceState);
}

14.恢复Activity状态

@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); // Always call the superclass first// Check whether we're recreating a previously destroyed instanceif (savedInstanceState != null) {// Restore value of members from saved statemCurrentScore = savedInstanceState.getInt(STATE_SCORE);mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);} else {// Probably initialize members with default values for a new instance}...
}

可以选择实现系统在 onStart() 方法之后调用的 onRestoreInstanceState() ,而不是在onCreate() 期间恢复状态。 系统只在存在要恢复的已保存状态时调用 onRestoreInstanceState() ,因此无需检查 Bundle 是否为 null:

public void onRestoreInstanceState(Bundle savedInstanceState) {// Always call the superclass so it can restore the view hierarchysuper.onRestoreInstanceState(savedInstanceState);// Restore state members from saved instancemCurrentScore = savedInstanceState.getInt(STATE_SCORE);mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
}

android studio for android learning (五) 最新Activity理解与其生命周期相关推荐

  1. 【Android应用开发】Android Studio 简介 (Android Studio Overview)

    一. Intelij IDEA 环境简介 Android Studio 来源 : Android Studio 是 Intelij IDEA 的免费版本 + Android SDK 集成的; -- I ...

  2. 【Android studio】Android studio的安装及模拟器(夜神)的连接

    一.安装JDK,配置环境变量 在此之前jdk已经安装好了,因此不再进行安装,通过cmd命令行检查环境变量是否已经配置好: 进入cmd命令行,输入java –version查看java版本 从图中可以看 ...

  3. android studio zbar,Android Studio 0.2.6和ZBar项目设置

    我使用的是最新的Android Studio 0.2.6和最新的ZBar Android SDK.到目前为止我做了什么: 创建了一个名为QRTest的全新项目 在我的项目中创建了一个名为libs的文件 ...

  4. android工程中的软件,通过Android Studio创建Android应用程序(附带解析)

    这一节我们主要来创建一个简单的 Android 的应用程序. 创建 HelloWorld 工程 启动 Android Studio,依次选择 File --> New --> New Pr ...

  5. Android开发工具Android Studio、Android SDK和Genymotion完全配置

    所谓"工欲善其事,必先利其器".Android Studio 是谷歌推出一个Android集成开发工具,基于IntelliJ IDEA. 类似 Eclipse ADT,Androi ...

  6. 【Android Studio】Android Studio 搭建开发环境(Linux Ubuntu篇)

    Windows篇:[Android Studio]Android Studio 搭建开发环境(Windows篇)_dandelionela的博客-CSDN博客 Ubuntu篇参考: Ubuntu 18 ...

  7. android studio1.2.6,1.2.2 使用Android Studio开发Android APP | 菜鸟教程

    写在前面本节将介绍如何使用Android Studio开发Android APP,和前面Eclipse + ADT + SDK搭建Android开发环境一样,本节也只是介绍一些基本东西,深入的,比如快 ...

  8. android生命周期方法,Android零基础入门|Activity状态和生命周期方法

    原标题:Android零基础入门|Activity状态和生命周期方法 前面两期我们学习了Activity的创建和注册.以及启动和关闭,也学会了重写onCraete方法,这些知识在实际开发中远远不够,还 ...

  9. Android零基础入门第75节:Activity状态和生命周期方法

    前面两期我们学习了Activity的创建和注册.以及启动和关闭,也学会了重写onCraete方法,这些知识在实际开发中远远不够,还需要学习了解更多. 生命周期就是一个对象从创建到销毁的过程,每一个对象 ...

  10. AndroidStudio中打开新项目提示:Unrecognized Android Studio (or Android Support plugin for IntelliJ IDEA)

    在导入Google官方项目时提示我们Unrecognized Android Studio (or Android Support plugin for IntelliJ IDEA) version ...

最新文章

  1. 如何在Azure machine learning中使用异常检测
  2. 从玩具到游戏,另类的项目激励机制
  3. 学习-SQL查询连续号码段的巧妙解法--转载
  4. 分享一张理解数据库inner join,left join,right join,full join的图
  5. 插入排序---希尔插入排序算法(Javascript版)
  6. 【OpenCV 例程200篇】62. 图像锐化——钝化掩蔽
  7. PostgreSQL统计信息的几个重要视图
  8. react启动命令_十分钟搭建React开发环境
  9. Atitit 小程序前端api艾提拉总结 索引 目录 1. 基础 37 2 1.1. 系统 38更新 38小程序 39调试 41定时器 42 2 2. 路由 43 2 3. 界面 44 2 3.1.
  10. 关于如何卸载VS2012
  11. idea调代码时返回到上一步的快捷键
  12. 曾国藩-200句名言归纳
  13. android判断网络类型5G,iOS中如何判断当前网络环境是2G/3G/4G/5G/WiFi
  14. 使用广和通L610模块搭配RT-Thread操作系统连接onenet云
  15. 三次插值ClampedB样条曲线Matlab代码实现
  16. Microsoft Edge浏览器不兼容解决办法
  17. oracle查询数据都是问号,Oracle数据库PL/SQL Developer查询结果显示问号乱码的解决方法...
  18. C语言中entry用法,Tkinter模块(3)-Entry
  19. 5y计算机应用选择题答案,2016年电大网考计算机应用基础统考试题模拟真题及答案 含小抄复习资料推荐.docx...
  20. GCN论文笔记——HopGAT: Hop-aware Supervision Graph Attention Networks for Sparsely Labeled Graphs

热门文章

  1. 云南满泽生物科技有限公司 满泽玛卡玛咖精片 东革阿里 奶昔
  2. MySql中PreparedStatement对象与Statement对象
  3. LimeSurvey
  4. 电脑故障速查方法集萃
  5. SpringBoot 房屋租赁系统3.0 manland.liuyanzhao.com
  6. Briefly unavailable for scheduled maintenance. Check back in a minute.
  7. android ajax chrome,chrome浏览器ajax请求状态200,response为空的探索
  8. php表单附件数据回填,从表单发送文件附件使用phpMailer和PHP
  9. webdriver 等待页面加载完成_Python+selenium自动化之等待
  10. python辗转相除法求最大公约数_vb编程实现用辗转相除法求两个数a和b的最大公约数...