Android和java启动的区别

不同于使用 main() 方法启动应用的其他编程范例,Android 系统会通过调用对应于其生命周期中特定阶段的特定回调方法在 Activity 实例中启动代码。有一系列可启动 Activity 的回调方法,以及一系列可分解 Activity 的回调方法。

了解生命周期回调

在 Activity 的生命周期中,系统会按类似于阶梯金字塔的顺序调用一组核心的生命周期方法。 也就是说,Activity 生命周期的每个阶段就是金字塔上的一阶。 当系统创建新 Activity 实例时,每个回调方法会将 Activity 状态向顶端移动一阶。 金字塔的顶端是 Activity 在前台运行并且用户可以与其交互的时间点。

当用户开始离开 Activity 时,系统会调用其他方法在金字塔中将 Activity 状态下移,从而销毁 Activity。 在有些情况下,Activity 将只在金字塔中部分下移并等待(比如,当用户切换到其他应用时),Activity 可从该点开始移回顶端(如果用户返回到该 Activity),并在用户停止的位置继续。



图 简化的 Activity 生命周期图示,以阶梯金字塔表示。此图示显示,对于用于将 Activity 朝顶端的“继续”状态移动一阶的每个回调,有一种将 Activity 下移一阶的回调方法。 Activity 还可以从“暂停”和“停止”状态回到继续状态。

根据 Activity 的复杂程度,您可能不需要实现所有生命周期方法。 但是,了解每个方法并实现确保您的应用按照用户期望的方式运行的方法非常重要。

正确实现您的 Activity 生命周期方法可确保您的应用按照以下几种方式良好运行,包括:

如果用户在使用您的应用时接听来电或切换到另一个应用,它不会崩溃。

在用户未主动使用它时不会消耗宝贵的系统资源。

如果用户离开您的应用并稍后返回,不会丢失用户的进度。

当屏幕在横向和纵向之间旋转时,不会崩溃或丢失用户的进度。

Activity 只能在三种状态之一下存在很长时间。

继续

在这种状态下,Activity 处于前台,且用户可以与其交互。(有时也称为“运行”状态。)

暂停

在这种状态下,Activity 被在前台中处于半透明状态或者未覆盖整个屏幕的另一个 Activity—部分阻挡。 暂停的 Activity 不会接收用户输入并且无法执行任何代码。

停止

在这种状态下,Activity 被完全隐藏并且对用户不可见;它被视为处于后台。 停止时,Activity 实例及其诸如成员变量等所有状态信息将保留,但它无法执行任何代码。

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

指定您的应用的启动器 Activity

当用户从主屏幕选择您的应用图标时,系统会为您已声明为“启动器”(或“主要”)Activity 的应用中的 Activity 调用 onCreate() 方法。这是作为 您的应用的用户界面主入口的 Activity。

您可以在 Android 清单文件 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>

注:当您使用 Android SDK工具创建新 Android 项目时,默认的项目文件包括使用过滤器在宣示说明中声明的 Activity 类。

如果未对您的 Activity 之一声明 MAIN 操作或 LAUNCHER 类别,那么您的应用图标将不会出现在应用的主屏幕列表中。

创建一个新实例

大多数应用包含若干个不同的 Activity,用户可通过这些 Activity 执行不同的操作。无论 Activity 是用户单击您的应用图标时创建的主 Activity 还是您的应用在响应用户操作时开始的其他 Activity,系统都会通过调用其 onCreate() 方法创建 Activity 的每个新实例。

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

例如,onCreate() 方法的以下示例显示执行 Activity 某些基本设置的一些代码,比如声明用户界面(在 XML 布局文件中定义)、定义成员变量,以及配置某些 UI。

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 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);
    }
}

注意:使用 SDK_INT 可防止旧版系统以这种方式仅在 Android 2.0 (API 级别5)和更高级别执行新 API 工作。 较旧版本会遇到运行时异常。

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

注:onCreate() 方法包括一个称为 savedInstanceState 的参数,将在有关重新创建 Activity的后续课程中讨论该参数。

Activity 生命周期结构的另一个图示,其重点放在创建 Activity 的新实例时系统依次调用的三大回调上:onCreate()、onStart() 和 onResume()。 一旦这一系列回调完成,Activity 就进入“继续”状态,此时用户可与 Activity 进行交互,直至用户切换到其他 Activity。

销毁 Activity

当 Activity 的第一个生命周期回调是 onCreate() 时,它最近的回调是 onDestroy()。系统会对您的 Activity 调用此方法,作为您的 Activity 实例完全从系统内存移除的最终信号。

大多数应用不需要实现此方法,因为局部类引用与 Activity 一同销毁,并且您的 Activity 应在 onPause() 和 onStop() 期间执行大多数清理操作。但是,如果您的 Activity 包含您在 onCreate() 期间创建的后台线程或其他如若未正确关闭可能导致内存泄露的长期运行资源,您应在 onDestroy() 期间终止它们。

@Override
public void onDestroy() {
    super.onDestroy();  // Always call the superclass

    // Stop method tracing that the activity started during onCreate()
    android.os.Debug.stopMethodTracing();
}

注:在所有情况下,系统在调用 onPause() 和 onStop() 之后都会调用 onDestroy(),只有一个例外:

当您从 onCreate() 方法内调用 finish() 时。在某些情况下,比如当您的 Activity 作为临时决策工具运行以启动另一个 Activity 时,您可从 onCreate() 内调用 finish() 来销毁 Activity。在这种情况下,系统会立刻调用 onDestroy(),而不调用任何其他 生命周期方法。

我的微信二维码如下,欢迎交流讨论

欢迎关注《IT面试题汇总》微信订阅号。每天推送经典面试题和面试心得技巧

微信订阅号二维码如下:

Android启动Activity的更多相关文章

  1. Android启动activity的4种模式(standard、singleTop、singleTask、singleINstance)

    在AndroidManifest.xml中配置activity时,android:launchMode属性会指定启动activity的模式,有四种: standard singleTop single ...

  2. Android 启动Activity的方式

    Activity的启动分为两种方式,显示方式和隐式方式,显示方式就是在通过intent启动Activity时指定了Activity的包名和类名. 而隐式方式则在初始化Intent时仅仅指定action ...

  3. Android启动Activity的标准Action和标准Category

    Android内部提供了大量标准的Action和Category常量. 其中用于启动Activity的标准Aciton及对应的字符串如下表所示: 启动Activity的标准Aciton Action常 ...

  4. Android启动Activity的两种方式与四种启动模式

    1.在一个Activity中调用startActivity()方法 2.在一个Activity中调用startActivityRequest()方法. 重写onActivityResult方法,用来接 ...

  5. android启动activity文本框不获得焦点

    在开发中,常常会碰到这种情况,打开一个activity后,第一个文本框自动获得焦点,同时会弹出软键盘输入框,这样很影响用户体验,现在来看解决方法. 我们先来看看为什么会出现上述情况,原因很简单,文本框 ...

  6. Android中Activity的启动模式

    简介 Android中的活动启动方式分为4种:standard, singleTop, singleTask, singleInstance.可以在AndroidManifest.xml中通过给< ...

  7. Android开机启动Activity或者Service方法

    本文出自 “Bill_Hoo专栏” 博客,请务必保留此出处http://billhoo.blog.51cto.com/2337751/761230 这段时间在做Android的基础开发,现在有一需求是 ...

  8. Android四大组件之Activity详解——创建和启动Activity

    前面我们已经对Activity有过简单的介绍: Android开发——初始Activity Android开发——响应用户事件 Android开发——Activity生命周期 先来看一下最终结果 项目 ...

  9. Android Intent (可通过URL启动 Activity)

    Intent分为两大类: (1)显性的(Explicit) (2)隐性的(Implicit) 对于隐性意图,在某些时候, 应用程序只是想启动具有某种特征的组件, 并不想和某个特定的组件耦合. 使用In ...

随机推荐

  1. 做了两年多salesforce平台开发,转Java的经历

    2015年毕业,转眼已经三年多了.三年对于现在的我,真的很快,一开始对软件开发的执着一直没有变.我是一个很普通很普通长沙的一个专科毕业.刚进大学,对于软件开发真的是小白,仅仅只是存在对于游戏,和桌面软 ...

  2. Fetching data with Ajax小例子

    ajax获取数据示例: 示例1 通过ajax获取txt文件里面的内容示例: <html> <head> <title>Ajax at work</title& ...

  3. [WC 2013]糖果公园

    Description 题库链接 给你一棵 \(n\) 个节点,有 \(m\) 种颜色的树.每个节点上有一个颜色.定义一条树上路径的价值为 \[\sum_c V_c(\sum_{i=1}^{tim_c ...

  4. [UVa 1326]Jurassic Remains

    题解 在一个字符串中,每个字符出现的次数本身是无关紧要的,重要的只是这些次数的奇偶性,因此想到用一个二进制的位表示一个字母($1$表示出现奇数次,$0$表示出现偶数次).比如样例的$6$个数,写成二进 ...

  5. [HNOI2012]排队

    题目描述 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不同的) 输入输 ...

  6. NOIP 2015

    Prob.1 2015 神奇的幻方 模拟就好了.(这不是noip2017的初赛题么.)代码: #include<cstdio> #include<cstring> #inclu ...

  7. 【转载】 HTTP 中 GET 与 POST 的区别

    HTTP 中 GET 与 POST 的区别   GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通 ...

  8. A neural chatbot using sequence to sequence model with attentional decoder. This is a fully functional chatbot.

    原项目链接:https://github.com/chiphuyen/stanford-tensorflow-tutorials/tree/master/assignments/chatbot 一个使 ...

  9. HTTP Status Codes 查询表

    Web项目中经常会出现各种状态码,今天看到一个博客,挺不错,记录下来.

  10. drools 手动创建kmoudle.xml文件

    @Test public void test() { KieServices kieServices = KieServices.Factory.get(); KieResources resourc ...