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生命周期的流程图。
![](https://img.haomeiwen.com/i15096710/938dcb44b8235679.png)
- 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的启动方式
-
无返回结果
/** * 通过Intent进行跳转 * startActivity()方法在Context下 */ Intent intent = new Intent(MainActivity.this,MyActivity.class); startActivity(intent);
-
有返回结果
/**
* 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系统中有一个低内存杀死机制。也就是在应用内存不足的时候会杀死一些进程,释放内存。而至于杀死哪些进程则是根据这个进程中组件的状态来决定的。以下是优先级的排序,由高向低。
-
前台进程:指用户正在做的事。只有很少的一些进程会维持这个状态,这这种状态下的进程最不容易被杀死。
- 进程有一个activity正在获得焦点
- 有一个BroadcastReceiver正在执行它的onReceive方法
- Service正在执行它的回调接口
-
可见进程:指正在做的事可以明显被用户感知,杀死进程会直接影响用户体验。
- 进程中正在运行的Activity处于可见状态,但是没有获得焦点,比如处于onPause()状态。
- Service通过Service.startForeground()运行前台进程
- 这个进程正在管理着一个用户会有感知的特征,比如壁纸,输入法等。
-
服务进程:指进程中拥有一个通过startService()方法开启的Service。虽然这个进程不可见,但是依然在执行着用户所关心的事(比如上传或者下载数据等)。当服务执行时间过长的时候,进程等级可能会被下降。
-
缓存进程:指那些现在不再需要的进程,这些进程通常会有一个或者多个Activity的实例处于不可见的状态(onStop()状态),当内存不足时,系统按照一定顺序杀死这些进程以释放内存。
网友评论