博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android开发学习笔记(五):Starting an Activity
阅读量:6157 次
发布时间:2019-06-21

本文共 4726 字,大约阅读时间需要 15 分钟。

hot3.png

Starting an Activity

不像其他的编程模式中,应用程序是由main()方法发起的,Android系统启动代码在一个activity实例通过调用的回调方法,对应于特定阶段的生命周期。有一系列回调方法用于启动一个activity,和一系列回调方法用以拆毁一个activity。

这一课将提供一个生命周期方法的总览,并且告诉你如何处理第一个回调方法,在创建一个新的activity实例时。

了解生命周期回调(Understand the Lifecycle Callbacks)

在一个activity的生命周期中,系统调用的一组核心的生命周期方法序列类似的一个阶梯金字塔。就是说,activity生命周期的每一个阶段是一个单独的步骤的金字塔。为系统创建了一个新的activity实例,每个回调方法移动activity状态的一个步骤对顶部。顶部的塔是在该点的,activity在前台运行,用户可以与它交互。

当用户开始离开activity时,系统会调用其他的(函数)方法,把activity的状态从金字塔向下转移,以拆除这个activity。在某些情况下,活动将只有一部分的方式下锥体等(如当用户切换到另一个应用程序),这一点让activity可以回到顶部(如果用户返回到activity),并能恢复到用户离开时的样子。 

下面是Activity生命周期的一个简单图示,就像一个金字塔一样。这个图示反映出了那些使得activity状态向上的回调方法,也反映了那些使得activity状态向下的回调方法。activity也可以从暂停状态(Paused)或停止状态(Stopped)返回到Resumed状态。

根据根据需要创建的activity的复杂程度,你可能不需要实现所有生命周期的方法。然而,重要的是你了解每一个执行,以确保您的应用程序的行为方式符合用户的期望。适当地实现你的activity生命周期中的方法,可以确保你的应用程序在以下几个方面表现的好一些:

  • 当用户正在使用你的程序时,突然接听电话或者切换到其它的程序,它不至于会崩溃。
  • 当用户不再使用你的程序时,它不会继续消耗宝贵的系统资源。
  • 当用户暂时离开你的程序,再返回时不会丢失用户的进展。
  • 当手机屏幕横向纵向切换时,它不会崩溃或者丢失用户的进度。

activity在不同的状态之间进行转变时,存在几状况。然而,这些状态中只有三种是静态的(activity可以持续的状态)。换句话说,activity可以在这三种状态之一,存在一段比较长的时间。这三种状态分别是:

重返状态(Resumed

在这个状态,activity处于屏幕最前端,并且用户可以与之进行交互。(有时也被称为“运行”状态。

暂停状态(Paused)

在这个状态,activity被其它的activity部分地遮挡住了。这个其它的activity位于屏幕最前端,要么是半透明的,要么没有占据整个屏幕。被暂停的activity无法接受用户的输入,也不能执行任何代码。

停止状态(Stopped)

在这种状态下,activity是完全隐藏着的,并且用户不可见;这被认为是在背景下。在停止状态中,该activity的实例和它的所有状态信息,例如成员变量,都是保留的,但它不能执行任何代码。

Activity的其他状态(创建Created和开始Started)都是短暂的。系统会通过调用下一个生命周期的回调方法,来使得它们快速转换到下一个状态。换句话说,系统在调用onCreate()方法之后,立马就调用onStart()方法,紧接着就是调用onResume()方法。

这就是Activity最基本的生命周期。现在,你可以开始学习有关的一些具体生命周期行为了。

指定应用程序的启动Activity(Specify Your App's Launcher Activity)

当用户从手机主屏幕上选择你的应用程序图标时,Android系统就会调用一个Activity的onCreate()方法。这个Activity就是你为自己的应用程序指定的那个“launcher”(或“main”)activity。它是你的的应用程序对外用户界面的主要入口。

你可以在Android清单文件(AndroidManifest.xml)中指定哪个activity作为主要activity。这个文件在你项目的根目录下

你必须在清单文件中使用<intent-filter>来声明应用程序的主要activity,同时指定MAIN动作和LAUNCHER类别。例如:

注意,当你使用Android SDK工具创建一个新的Android工程时,默认的工作文件中已经包含了一个Activity类,并且把它声明在清单文件里了。

如果你的activity中有一个没有声明MAIN行为或者LAUNCHER类别,那么你的应用程序图标将不会出现在主屏幕的应用程序列表中

创建一个新的实例(Create a New Instance)

大多数应用程序包括几个不同的activity,允许用户执行不同的动作。是否有一个活动的主要活动的创造,当用户点击您的应用程序图标或不同的活动,您的应用程序启动响应用户操作,系统创建新的Activity实例通过调用onCreate()方法。

你必须实现oncreate()方法,它执行基本的应用程序启动逻辑,而这在activity的整个生命周期中应该只发生一次。例如,你的onCreate()方法实现应该定义用户界面,并可能实例化一些类范围的变量。

例如,下面例子中的onCreate()方法显示出一些执行activity基本安装的代码,如宣布用户界面(定义在一个布局文件中),定义成员变量,并配置一些用户界面。

TextView mTextView; // Member variable for text view in the layout@Overridepublic 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 file    setContentView(R.layout.main_activity);        // Initialize member TextView so we can manipulate it later    mTextView = (TextView) findViewById(R.id.text_message);        // Make sure we're running on Honeycomb or higher to use ActionBar APIs    if (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 button        ActionBar actionBar = getActionBar();        actionBar.setHomeButtonEnabled(false);    }}

一旦onCreate()执行完成,系统会接二联三地调用onStart()和onResume()方法。你的activity不会驻留在创建(Created)或开始(Started)状态。技术上,当onStart()方法被调用后,activity就对用户可见了,但紧接着onResume()方法就被调用,activity会保持在恢复(Resumed)状态,直到某个事件发生才引起状态改变,例如当接收到一个电话,或用户导航到其他的activity,或设备的屏幕关闭。

在接下来的其他课程中,你将会看到其他的启动方法,onStart()和onResume()。它们在你的acvitity的生命周期中,被用来从暂停(Paused)或停止(Stopped)状态中恢复activity。

注意:onCreate()方法包括一个参数,名为savedInstanceState。它将在后面有关重建Activity(Recreating an Activity)的课程中讨论。

图2是另一个示例,它强调了activity生命周期结构中的三个主要的回调。在创建一个activity的新实例时,系统会依次调用这三个回调函数:onCreate(),onStart(),和onResume()。一旦这一系列回调完成,activity就达到了恢复(Resumed)状态,用户可以与它交互,直到他们切换到一个不同的activity。

Activity的销毁(Destroy the Activity)

------------------------------------------------------------------------------------------------------------------------------------------

正如activity生命周期第一个回调是onCreate(),其最后一个回调是onDestroy()。系统调用这个方法作为最后的信号,你的activity实例将被从系统内存中完成删除。

大多数应用程序不需要实现这个方法,因为本地类引用已经随activity一起被销毁了,你的activity应该在onPause()和onStop()执行期间做一些清理活动。然而,如果你的activity在执行onCreate()方法时创建了后台运行的线程,或者是其他长期运行的资源(如果没有正确关闭则可能引发内存泄漏),那么你就应该在onDestroy()方法中杀了他们。

@Overridepublic void onDestroy() {    super.onDestroy();  // Always call the superclass        // Stop method tracing that the activity started during onCreate()    android.os.Debug.stopMethodTracing();}
 
注意:系统调用ondestroy()后它已经称为onpause()和onstop()在所有情况下只有一个:你打电话时finish()在oncreate()方法。在某些情况下,例如当你的活动可作为临时决定推出另一个活动,你可以称finish()内oncreate()破坏活动。在这种情况下,系统会立即要求ondestroy()没有要求任何其他生命周期的方法。

转载于:https://my.oschina.net/allenyao/blog/100701

你可能感兴趣的文章
也问腾讯:你把用户放在什么位置?
查看>>
CSS Sprites 样式生成工具(bg2css)
查看>>
[转]如何重构代码--重构计划
查看>>
类中如何对list泛型做访问器??
查看>>
C++解析XML--使用CMarkup类解析XML
查看>>
P2P应用层组播
查看>>
Sharepoint学习笔记—修改SharePoint的Timeouts (Execution Timeout)
查看>>
CSS引入的方式有哪些? link和@import的区别?
查看>>
Redis 介绍2——常见基本类型
查看>>
asp.net开发mysql注意事项
查看>>
(转)Cortex-M3 (NXP LPC1788)之EEPROM存储器
查看>>
ubuntu set defult jdk
查看>>
[译]ECMAScript.next:TC39 2012年9月会议总结
查看>>
【Xcode】编辑与调试
查看>>
用tar和split将文件分包压缩
查看>>
[BTS] Could not find stored procedure 'mp_sap_check_tid'
查看>>
PLSQL DBMS_DDL.ALTER_COMPILE
查看>>
Activity生命周期
查看>>
高仿UC浏览器弹出菜单效果
查看>>
Ubuntu忘记密码,进不了系统的解决方法
查看>>