当前位置:   article > 正文

Android开发第2-1课:启动一个Activity_android 启动一个activity

android 启动一个activity

本课将会教你

  1. 理解生命周期回调
  2. 指定你的app的启动Activity
  3. 创建一个新实例
  4. 销毁一个Activity

    一般编程规范中通常以 main()函数为起始,和一般编程规范不同的是, Android系统在Activity 实例中通过调用对应生命周期的特定函数来初始化代码。 有一系列的回调函数用于启动一个activity,也有一系列的回调函数用于关闭一个activity。

本课概述了大多数重要的生命周期函数,并且向你展示了如何使用第一个生命周期回调函数去创建一个新的activity实例。

理解生命周期回调函数


在一个activity的生命周期中,系统会调用一组核心的生命周期函数,其顺序结构类似于金字塔。 也就是说, activity生命周期的每一个阶段都是金字塔中的一个独立的步骤。当系统创建一个新的activity实例时,各个回调函数将activity的状态向金字塔的顶部移动一步。金字塔的顶端就是前台程序,用户可以和前台程序交互。

当用户离开activity时,系统将会调用其它函数来将activity的状态向金字塔的底部移动一步,从而逐步消除activity。在某些情况下,activity只会向金字塔低部移动几步,然后在那里等待。 (例如当用户跳转到其它app时),这些activity的状态还可以继续移动到顶端(如果用户返回到当前的activity) 并会恢复用户之前离开的地方。

图1 一个用金字塔的来表示的简单的Activity生命周期说明

    上图现实了每个回调函数将activity一步步推向金字塔的顶部——Resumed状态。同样,有相应的函数使得activity从金字塔的顶端一步步推向底部。activity也可以从Paused和Stopped状态返回到顶部。

根据你的activity的复杂度,你可能不需要实现所有的生命周期函数。然而,知道知道每一步及其实现,可以确保你的app的表现和用户所期盼的一致。 实现你的activity生命周期函数,可能会确保你的app通过以下的几种途径来运行得更好:

  • 当用户正在使用你的app时,如果用户接到一个电话或者跳转到其他app,并不会相冲突。
  • 当用户不使用它的时候,并不会消耗有用的系统资源。
  • 如果用户返回你的app,可以保持原来的进度。
  • 当屏幕旋转的时候,也不会相冲突或者关闭程序。

在下面的课程中你将会学到, figure 1所示的不同的状态的之间的转换。情况有多种,然而,只有3种可以是静态的。activity只能从这3种状态之一退出以增加额外的周期时间:

Resumed

在这种状态中,activity在前台,用户可以和它交互(有时也称为运行状态)

Paused

在这种状态中,activity部分地被其它activity遮掩了——前台的其它activity是半透明的或者没有覆盖整个屏幕。paused状态下的activity不可以接受用户输入,也不可以执行任何代码。

Stopped

在这种状态中,activity被完全的隐藏了,也就是退到了后台。当停止时, activity的实例和他的所有状态信息都被保留,例如成员变量,但是不能执行任何代码。

其它状态(Created和Started) 都是短暂的,系统会通过调用下一个生命周期函数来快速将它们移动到下一个状态。也就是说,当系统调用onCreate() 之后,他快速的调用onStart(),然之后就是onResume()。

这就是基本的activity生命周期。现在你将会开始学习一些特定的生命周期行为。

指定你的App的启动Activity

当用于在主界面选择你的app图标时,系统将会为你的app中的Activity调用onCreate() 函数,这个Activity就是你声明为 "launcher" (或者"main")的 activity。 这个 activity作为你的app的入口。

你可以在Android的菜单文件AndroidManifest.xml中指定哪一个activity来作为主activity。这个文件在你的工程的根目录下。

你的app 的主activity必须在主菜单中使用 <intent-filter> 来声明,它包含了MAIN和LAUNCHER分类。例如:

  1. <activity android:name=".MainActivity" android:label="@string/app_name">
  2.     <intent-filter>
  3.         <action android:name="android.intent.action.MAIN" />
  4.         <category android:name="android.intent.category.LAUNCHER" />
  5.     </intent-filter>
  6. </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>

截图如下:

图2

注意: 当你使用Android SDK工具创建一个新的Android工程时,默认系统文件包括一个Activity类,它在主菜单中使用这个过滤器来声明。

如果MAIN动作和LAUNCHER分类都没有声明,你的app标志将不会在主屏上列出来。

创建一个新实例


大多数的app都具有几个不同的activities供用户执行不同的动作。不管是主activity还是一般的activity,系统创建每一个Activity实例都调用onCreate()函数。

你必须实现onCreate() 函数来执行基本的应用启动,这个函数是会在启动的时候被调用一次。例如,你的onCreate() 应该定义用户接口,或者一些实例化的类域变量。

例如,下面的onCreate()函数的例子中,现实了一些执行activity启动的基本代码,例如声明用户接口(在一个XML文件中定义),定义成员变量,还有一些UI配置。

  1. TextView mTextView; // Member variable for text view in the layout
  2. @Override
  3. public void onCreate(Bundle savedInstanceState) {
  4.     super.onCreate(savedInstanceState);
  5.     // Set the user interface layout for this Activity
  6.     // The layout file is defined in the project res/layout/main_activity.xml file
  7.     setContentView(R.layout.main_activity);
  8.    
  9.     // Initialize member TextView so we can manipulate it later
  10.     mTextView = (TextView) findViewById(R.id.text_message);
  11.    
  12.     // Make sure we're running on Honeycomb or higher to use ActionBar APIs
  13.     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
  14.         // For the main activity, make sure the app icon in the action bar
  15.         // does not behave as a button
  16.         ActionBar actionBar = getActionBar();
  17.         actionBar.setHomeButtonEnabled(false);
  18.     }
  19. }
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 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);     } }

一个实际例子的截图:

图3

小心: 使用SDK_INT 来避免老系统的按照Android 2.0 (API level5)或者更高版本的来执行本app。老版本系统会遇到运行时异常。

一旦onCreate() 执行完毕,系统就调用onStart() 和onResume() 函数。你的activity永远不会停留在Created 或者 Started 状态。 技术上,当onStart() 被调用时用户便可以带到activity, 但是onResume() 根着快速的被调用使得activity保持在Resumed 状态,直到发生一些可以令它改变的事情,例如当接到一个电话时,用户跳转到另外一个activity,又或设备屏幕关闭了。

在后面的课程中,你将会看到其他启动函数,onStart() 和 onResume(),在就将你的activity从Paused和Stopped返回时是如何的有用了。

注意: onCreate()函数包含一个叫做savedInstanceState的函数,在下一课中将会说到。

图4 另外一个说明activity生命周期的结构图

    重点说明3个主要的回调函数:onCreate(),onStart(), andonResume()。一旦这些回调函数被按循序执行完毕,activity就到达了Resumed状态,用户就可以和它交互了,直到跳转到其他 activity为止。

销毁Activity


activity的第一个生命周期函数是onCreate(),而最后一个则是onDestroy()。系统调用这个函数,则意味着你的activity将会被完全从系统内存中删除。

多数app都不需要实现这个函数,因为本类内的引用会随着activity销毁,并且你应该在onPause() 和onStop()中做清理工作。然后,如果你的activity包括后台线程,必须合理关闭,否这会泄露内存。这时候你应该在onDestroy()中将其关闭。

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

一个实际例子的截图:

图5

注意: 系统一般都是先调用了onPause() 和onStop() 之后才调用 onDestroy(),只有一种情况除外:当你调用在onCreate()内调用了finish() 。在某些情况下,例如当你的activity作为一个临时的决定,用于过度到其他activity,你可能在onCreate() 中调用finish()来销 activity。这种情况下,系统立即调用onDestroy()而不再调用其他的生命周期函数。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/685769
推荐阅读
相关标签
  

闽ICP备14008679号