美文网首页Android开发Android技术知识Android开发经验谈
Activity都掌握了?来看看你还有多少漏洞!

Activity都掌握了?来看看你还有多少漏洞!

作者: 迷途小码农h | 来源:发表于2019-04-25 09:23 被阅读26次

    1.前言

    作为Android最基本的四大组件之一(Activity活动,Service服务,ContentProvider内容提供者,BroadcastReceiver广播),Activity主要负责与用户进行交互,是每位Android开发必须掌握的知识点。

    本篇文章主要介绍 Android开发中的部分知识点,包含内容如下:

    1. Activity 生命周期 简介
    2. Activity 必须在AndroidMainfest.xml 中注册
    3. 启动Activity 的方法
    4. 启动带返回值的Activity
    5. Activity结束 方法
    6. Activity状态保存,恢复的方法
    7. 面试中经常问到的例子

    2.正文

    1. Activity 生命周期 简介

    首先我们需要了解一下Activity的继承关系。

    Activity 继承关系

    Activity 继承关系如下:

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

    理解完Activity的继承关系后,我们开始了解Activity的声明周期,Activity的生命周期直接影响到与用户的交互,此声明周期很重要。

    Activity 生命周期

    Activity生命周期图如下:

    Activity 生命周期图

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

    Activity生命周期回调方法如下:

    Activity 生命周期代码回调方法

    Activity 4 种 生命周期状态

    Activity 常见的四种生命周期状态如下:

    1. Active 运行状态

    2. Pause 暂停状态

    3. Stop 停止状态

    4. Killed 消亡状态

    2. 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}; have you declared this activity in your AndroidManifest.xml?                                                   
    
    

    ActivityNotFoundException 异常Log 分析

    #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 android:name=".MainActivity">
           <intent-filter>
             <action android:name="android.intent.action.MAIN" />
             <category android:name="android.intent.category.LAUNCHER" />
           </intent-filter></activity>
    

    3. 启动Activity 的方法

    显示启动

    Intent intent = new Intent(ActivityMethods.this, OtherActivity.class)
    startActivity(intent);
    

    隐式启动

    Intent intent = new Intent("string_action");// intent.setAction("string_action");startActivity(intent);
    

    4. 启动带返回值的Activity

    启动带返回值的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);
    

    5. Activity结束 方法

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

            finish();        //或者根据请求码结束Activity
            finishActivity(int requestCode);
    

    6. Activity状态保存,恢复的方法

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

    Activity 状态保存与恢复

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

    7. 面试中经常问到的例子

    Activity A 启动 Activity B, 然后再返回A,简述一下其生命周期?

    1. 首先 A 启动的声明周期如下:
    01-02 21:25:22.357 21225-21225/com.android.program.programandroid I/ActivityMethods wjwj:: ----onCreate----01-02 21:25:22.396 21225-21225/com.android.program.programandroid I/ActivityMethods wjwj:: ----onStart----01-02 21:25:22.402 21225-21225/com.android.program.programandroid I/ActivityMethods wjwj:: ----onResume----
    
    1. 点击A中的Button ,跳转到B,此时声明周期关系如下:
    01-02 21:28:30.617 23845-23845/com.android.program.programandroid I/ActivityMethods wjwj:: ----onPause----01-02 21:28:30.723 23845-23845/com.android.program.programandroid I/OtherActivity wjwj:: ----onCreate----01-02 21:28:30.729 23845-23845/com.android.program.programandroid I/OtherActivity wjwj:: ----onStart----01-02 21:28:30.738 23845-23845/com.android.program.programandroid I/OtherActivity wjwj:: ----onResume----01-02 21:28:31.320 23845-23845/com.android.program.programandroid I/ActivityMethods wjwj:: ----onStop----
    
    1. 结束 B,返回 A ,生命周期如下:
    01-02 21:29:38.646 23845-23845/com.android.program.programandroid I/OtherActivity wjwj:: ----onPause----01-02 21:29:38.668 23845-23845/com.android.program.programandroid I/ActivityMethods wjwj:: ----onRestart----01-02 21:29:38.672 23845-23845/com.android.program.programandroid I/ActivityMethods wjwj:: ----onStart----01-02 21:29:38.674 23845-23845/com.android.program.programandroid I/ActivityMethods wjwj:: ----onResume----01-02 21:29:39.058 23845-23845/com.android.program.programandroid I/OtherActivity wjwj:: ----onStop----01-02 21:29:39.059 23845-23845/com.android.program.programandroid I/OtherActivity wjwj:: ----onDestroy----
    

    3.总结:

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

    Activity A 启动 Activity B, 然后再返回A生命周期大致图

    4.读者福利

    加群免费领取安卓进阶学习视频,源码,面试资料,群内有大牛一起交流讨论技术;【1005956838】。 (包括跨平台开发(Flutter,Weex)、java基础与原理,自定义控件、NDK、架构设计、性能优化、完整商业项目开发等)

    阿里P7系列视频教程.png
    面试各大专题整理

    5.最后

    至此,本篇已结束,如有不对的地方,欢迎建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

    相关文章

      网友评论

        本文标题:Activity都掌握了?来看看你还有多少漏洞!

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