Activity详解 | 青训营笔记

125 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的第4天

Activity生命周期简介

Activity继承关系

 java.lang.Object
    ↳    android.content.Context
        ↳    android.content.ContextWrapper
            ↳    android.view.ContextThemeWrapper
                ↳    android.app.Activity

完整的APP页面创建需要三个步骤

  1. 在layou 目录下创建.XML文件
  2. 创建与XML对应的java代码
  3. 在AndroidManifest.xml中注册页面配置

Activity生命周期

Activity 生命周期图

 onCreate():
 创建时回调,一般在此处创建视图和绑定数据
 onStart():已启动,即将进入前台
 onResume():与用户开始交互,位于Activity栈顶
 onPause():Actvity失去焦点或已暂停,Activity界面部分可见,下一个生命周期是onResume()或onStop()
 onStop():Activity不再可见,下一个回调是onRestart()或onDestory()
 onRestart():重启已停止的Activity,下一个回调是onStart()
 onDestory():销毁Actvity,释放该Activity的所有资源
 onSaveInstanceState():在非正常关闭时回调,用于保存数据,不支持持久化数据
 onRestoreInstanceState()/onCreate():用于恢复数据

image-20220803205556413

image-20220803205817561

在代码中Activity生命周期回调方法

     // Activity 创建方法
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         Log.i(TAG, "----onCreate----");
         setContentView(R.layout.activity_methods);
     }
 ​
     // Activity 在最新任务列表中打开时候会走此方法
     @Override
     protected void onRestart() {
         super.onRestart();
         Log.i(TAG, "----onRestart----");
     }
 ​
     // Activity 在onCreate 或者 onRestart之后执行
     @Override
     protected void onStart() {
         super.onStart();
         Log.i(TAG, "----onStart----");
     }
 ​
     // 正在与用户交互的界面
     @Override
     protected void onResume() {
         super.onResume();
         Log.i(TAG, "----onResume----");
     }
 ​
     // 被其他与用户交互的Activity 部分覆盖
     @Override
     protected void onPause() {
         super.onPause();
         Log.i(TAG, "----onPause----");
     }
 ​
     // 被其它与用户交互的Activity 全部覆盖
     @Override
     protected void onStop() {
         super.onStop();
         Log.i(TAG, "----onStop----");
     }
 ​
     // Activity 销毁时候调用此方法
     @Override
     protected void onDestroy() {
         super.onDestroy();
         Log.i(TAG, "----onDestroy----");
     }
 ​

Activity 4种生命周期状态

  1. Active 运行状态
  2. Pause 暂停状态
  3. Stop 停止状态
  4. Killed 消亡状态

Activity必须在AndroidMainfest.xml中注册

Activity是四大组件之一,Android规定四大组件必须在AndroidMainfest.xml 中注册,Activity如果不注册,则会引起 App Crash 报错。

ActivityNotFoundException

如Activity不在AndroidMainfest.xml中注册,则app将会报错,报错主要异常信息如下 : ActivityNotFoundException 例如以下报错信息:

 ​
 //提示未在 AndroidMainfest.xml 中找到Activity类的声明
 android.content.ActivityNotFoundException:Unable to find explicit activity class 
                            //具体类名,包名如下:
                           {com.wj.utils/com.wj.utils.basewidget.BaseButtonMethods};
                           //需要在AndroidManifest 中声明
                           have you declared this activity in your AndroidManifest.xml?

Activity 注册方法如下:

 <manifest ... >
   <application ... >
       <activity android:name=".BaseButtonMethods" />
       ...
   </application ... >
   ...
 </manifest >

常用Action 标签

android.action.MAIN: 表示是当前App的入口 main 方法类。

android.intent.category.LAUNCHER: 表示 此Action 会被Launcher扫描到,可以显示在Launcher的Icon列表上,如果去掉此Action,则无法在Launcher种查看到此app的Icon。

启动Activity的方法

  1. 显式启动
  2. 隐式启动

启动带返回值的Activity方法

         Intent intent = new Intent();
         intent.setClass(ActivityMethods.this, OtherActivity.class);
         startActivityForResult(intent, mRequestCode);
 ​

处理返回值的回调方法

  //    获取 Activity 返回结果的方法
     @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
         super.onActivityResult(requestCode, resultCode, data);
         if (requestCode == mRequestCode && resultCode == mResultCode) {
             String result = data.getStringExtra("str_set_result");
             Toast.makeText(this, "result :" + result, Toast.LENGTH_SHORT).show();
         }
 ​
     }

被启动Activity设置返回值的方法

       int resultCode = 101;
       Intent intent = new Intent();
                 intent.putExtra("str_set_result", "带返回结果的Activity");
       setResult(resultCode, intent);

Activity结束 方法

如果想结束掉当前Activity ,可以调用一下方法

finish();或者finishActivity(int requestCode);

Activity状态保存,恢复的方法

当Activity异常退出的时候,Activity会自动保存一些数据,但是如果是app重要数据,最好还是在代码中手动保存Bundle类型的数据,防止自动保存的数据不理想

Activity 状态保存与恢复

Activity 状态保存与恢复的周期图(没太看懂,但是先记下来,咋都是英文。。。)Activity 状态保存生命周期图

Activity 状态保存与恢复的回调方法

     // Activity 恢复数据的方法,经常在 oncreate 方法中恢复数据
     @Override
     protected void onRestoreInstanceState(Bundle savedInstanceState) {
         super.onRestoreInstanceState(savedInstanceState);
         Log.i(TAG, "----onRestoreInstanceState----");
     }
 ​
     // Activity 保存数据的方法,经常在 onPause 方法中保存数据
     @Override
     public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
         super.onSaveInstanceState(outState, outPersistentState);
         Log.i(TAG, "----onSaveInstanceState----");
     }

Activity A启动 Activity B, 简述一下其生命周期? 大致流程如下图: