程序员

Activity学习

2019-03-20  本文已影响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
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状态改变的场景

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的启动模式

进程优先级

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

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

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

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

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

上一篇 下一篇

猜你喜欢

热点阅读