Activity学习

作者: 九叶轻尘 | 来源:发表于2019-03-20 16:30 被阅读0次

Activity是Android中最重要的组件之一。它为应用提供了窗口与用户进行交互,我们设计的界面也是通过Activity进行呈现。界面的跳转实际上就是Activity的跳转。我们不但能够跳转自己App的界面,也能跳转其它App的界面。使用Activity之前必须要在manifest文件中注册。

主界面MainActivity在AndroidManifest.xml文件中注册代码

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.example.zhangchao.test">

  <application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

    <activity android:name=".MainActivity">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
      </activity>

  </application>

  <!--申请获得访问网络的权限-->
  <uses-permission android:name="android.permission.INTERNET"/>
</manifest>

Activity的生命周期

Activity在应用运行期间会经历一系列的生命周期。我们实现功能代码实际上就是写在这些声明周期的回掉方法中。下面是Activity生命周期的流程图。

image
  • onCreate():这个方法是必须要被重写的方法。它是Activity被系统加载过程中第一个回调的方法。在这个方法中需要通过setContentView()方法来加载写好的xml的布局文件,同时也会通过网络去请求数据再去填充布局,也会做一些初始化操作。
  • onStart():在onCreate()之后调用,此时界面即将变得可见,在这个方法中一般会为即将进入前台做一些准备性的处理。
  • onResume():在Activity完全获取屏幕焦点时被调用。App的大多数核心功能都是在这个方法中被调用。
  • onPause():这个方法会在Activity失去焦点进入暂停状态时被调用。此时activity依然是可见的。例如弹出一个dialog等情景。
  • onStop():这个方法会在Activity完全不可见时被调用。可能是一个新的Activity被创建并且来到了前台,也可能是Activity即将被销毁。
  • onRestart():这个方法会在Activity从stop状态重新来到前台的时候会执行。
  • onDestroy():这个方法会在Activity被销毁之前调用。
import android.app.Activity;
import android.os.Bundle;

/**
 * 创建时间:2019/3/11
 * 作者:zhangchao
 * 描述:
 */
public class MyActivity extends Activity {

  /**
   * saveInstanceSatate包含了Activity之前的参数,如果之前不存在,则这个对象为空
   * 对于屏幕旋转,Activity会先被销毁再次创建
   * @param savedInstanceState
   */
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    /**
     * 在此方法中通过setContentView()加载布局文件
     * 不但可以通过ID加载布局文件,也可以通过生成一个ViewGroup作为参数传递进去
     */
    setContentView(R.layout.my_activity);
  }

  @Override
  protected void onStart() {
    super.onStart();
    /**
     * 做一些准备工作
     */
  }

  @Override
  protected void onResume() {
    super.onResume();
    /**
     * 在这个方法执行之后,activity会来到前台
     * 失去焦点之后再次获得焦点也会执行这个方法
     */
  }

  @Override
  protected void onPause() {
    super.onPause();
    /**
     * 失去焦点之后,会执行这个方法。
     * 比如弹出一个dialog,或者在多窗口模式下,即使全部显示,但是仍然会失去焦点
     * 不应该在这个方法中执行保存数据等耗时操作
     */
  }

  @Override
  protected void onStop() {
    super.onStop();
    /**
     * activity变得不可见的时候
     * 可能因为新的activity被加载,或者被Destory之前
     * 在这个方法中应该需要释放一些不再需要的资源
     */
  }

  @Override
  protected void onRestart() {
    /**
     * 从stop状态直接恢复到可见的状态时调用
     */
    super.onRestart();
  }

  @Override
  protected void onDestroy() {
    /**
     * 销毁时调用,比如调用了finish()方法
     */
    super.onDestroy();
  }

  @Override
  protected void onSaveInstanceState(Bundle outState) {
    /**
     * 当activity被暂时销毁的时候调用
     * 一般用来保存Activity的一些状态
     * @param outState
     */
    super.onSaveInstanceState(outState);
  }

  @Override
  protected void onRestoreInstanceState(Bundle savedInstanceState) {
    /**
     * 这个方法只在之前onSaveInstanceState()被调用过保存了状态之后才会调用
     * 一般用来恢复Activity之前的状态
     * savedInstanceState和onCreate()的参数是一样的
     * 都是onSaveInstanceState()中的outState
     * 会在onStart()之后被调用
     */

    super.onRestoreInstanceState(savedInstanceState);
  }

}

Activity状态改变的场景

  • 配置发生改变:例如横竖屏发生了改变,语言,输入设备等发生了改变等情况。这个时候会先销毁已有的实例,再创建一个新的实例。
  • 多窗口模式:在Android 7.0(API 24)之上,系统支持多窗口模式。在多窗口模式下,虽然两个Activity都是处于可见状态,但是只有一个Activity获得焦点。也就是说一个处于onResume()状态,另一个处于onPause()状态。
  • 新的Activity或者Dialog来到前台:新的Activity或者Dialog来到前台获得了焦点。
  • 点击返回键:Activity依次经历onPause(),onStop(),onDestroy()。之后被销毁。这个时候onSaveInstanceState()方法不会被触发。
  • 系统杀死进程:当系统内存不足时,会根据一定的规则杀死一些进程,这时也会引起Activity状态的改变。

Activity的启动方式

  1. 无返回结果

    /**
     * 通过Intent进行跳转
     * startActivity()方法在Context下
     */
    Intent intent = new Intent(MainActivity.this,MyActivity.class);
    startActivity(intent);
    
  2. 有返回结果

    /**
     * startActivityForResult()在Activity下
     */
    Intent intent = new Intent(MainActivity.this,MyActivity.class);
    startActivityForResult(intent,requestCode);

    /**
     * 通过Intent设置返回值
     * setResult()方法在Activity下
     * RESULT_OK:返回码
     */
    Intent intent = new Intent(MyActivity.this,MainActivity.class);
    setResult(RESULT_OK,intent);

    /**
   * Activity中处理返回的回掉方法
   * @param requestCode 请求码
   * @param resultCode 确认码
   * @param data Intent类型携带的数据
   */
  @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
      super.onActivityResult(requestCode, resultCode, data);
  }

任务和返回栈

任务(Task)是指一系列Activity的集合。返回栈是指管理activity的一个栈。在同一个任务中,每次实例化一个Activity则讲这个实例压入栈顶,每一次点击返回键则将栈顶的activity pop出栈,并销毁。

对于每一个App可以看作有单独的任务(可以是一个,也可以是多个),进入App相当于这个任务进入前台,而这个返回栈栈顶的activity就是我们见到的activity。(如果返回栈不存在,则创建一个新的)。

Activity的启动模式

  • standard:标准模式,也是默认模式。每次都会新建一个实例。无论是在一个还是多个任务中。可以存在多个实例,实例也可以在不同的栈中。
  • singleTop:如果在当前栈的栈顶已经有这个实例了,则不会创建新的实例,系统会触发这个Activity实例的onNewIntent()方法。否则会创建新的实例。
  • singleTask:如果目前的这个Task的栈中有这个Activity实例,则会返回这个实例,触发onNewIntent()方法,在返回实例的时候这个栈中在目标实例上面的实例都会被销毁。否则创建一个实例。
  • singleInstance:这个实例永远只会在第一次实例化它的栈中维持一个实例。

进程优先级

Android系统中有一个低内存杀死机制。也就是在应用内存不足的时候会杀死一些进程,释放内存。而至于杀死哪些进程则是根据这个进程中组件的状态来决定的。以下是优先级的排序,由高向低。

  1. 前台进程:指用户正在做的事。只有很少的一些进程会维持这个状态,这这种状态下的进程最不容易被杀死。

    • 进程有一个activity正在获得焦点
    • 有一个BroadcastReceiver正在执行它的onReceive方法
    • Service正在执行它的回调接口
  2. 可见进程:指正在做的事可以明显被用户感知,杀死进程会直接影响用户体验。

    • 进程中正在运行的Activity处于可见状态,但是没有获得焦点,比如处于onPause()状态。
    • Service通过Service.startForeground()运行前台进程
    • 这个进程正在管理着一个用户会有感知的特征,比如壁纸,输入法等。
  3. 服务进程:指进程中拥有一个通过startService()方法开启的Service。虽然这个进程不可见,但是依然在执行着用户所关心的事(比如上传或者下载数据等)。当服务执行时间过长的时候,进程等级可能会被下降。

  4. 缓存进程:指那些现在不再需要的进程,这些进程通常会有一个或者多个Activity的实例处于不可见的状态(onStop()状态),当内存不足时,系统按照一定顺序杀死这些进程以释放内存。

相关文章

  • Activity学习

    简介: Activity是一个应用组件,用户可与其提供的屏幕进行交互,以执行拨打电话、拍摄照片、发送电子邮件等操作...

  • Activity学习

    Activity是Android中最重要的组件之一。它为应用提供了窗口与用户进行交互,我们设计的界面也是通过Act...

  • Activity相关学习-finish activity

    前言 前面大致整理了startActivity的相关流程,下面整理下Activity finish相关的流程 Ac...

  • 无标题文章

    #插件化学习使用代理activity的方式,宿主内有个activity壳,宿主内启动壳activity,实际加载外...

  • Android零基础入门第78节:四大组件的纽带——Intent

    前面学习Activity时己经多次使用了 Intent,当一个Activity需要启动另一个Activity时, ...

  • activity

    纯粹是个人学习总结,如有不对的地方请吐槽。 Activity的简单介绍 什么是Activity?activity是...

  • Activity学习笔记

    Activity在正常情况下的生命周期需要注意的问题 onStart和onResume,onPause和onSto...

  • Activity的学习

    偶然翻到一片文章,用两张图告诉你,为什么你的App会卡顿?,写得很好,跟着这篇文章学习后准备自己做个笔记,用作备忘...

  • 【Android】学习 Activity

    1. 什么是 Activity 它叫活动,是Android 组件中最基本也是最为常见用的四大组件之一。Androi...

  • Activity与Service交互(使用广播方式)

    近期学习到了Activity与Service进行交互的过程,在此记录。本次使用的Activity和Service交...

网友评论

    本文标题:Activity学习

    本文链接:https://www.haomeiwen.com/subject/xlltvqtx.html