极力推荐文章:欢迎收藏

Android 干货分享

阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android

本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:

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

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

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 创建方法
@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 种 生命周期状态

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};
//需要在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 扫描到,可以显示在LauncherIcon列表上,如果去掉此Action,则无法在Launcher 种查看到此appIcon

<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 ,可以调用一下方法

        //1.直接调用finish方法 ,结束当前Activity
finish();
//2.根据请求码结束Activity
finishActivity(int requestCode);

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

Activity 异常退出时候,Activity 会自动保存一些数据,但是,如果是app重要数据,还请在代码中手动保存Bundle类型的数据,防止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----

总结:

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

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

Activity 使用详解的更多相关文章

  1. Activity知识点详解

    Activity知识点详解 一.什么是Activity 官方解释: The Activity class is a crucial component of an Android app, and t ...

  2. Android application 和 activity 标签详解

    extends:http://blog.csdn.net/self_study/article/details/54020909 Application 标签 android:allowTaskRep ...

  3. Android组件系列----Activity组件详解

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...

  4. Android基础之Activity launchMode详解

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! Activity的lauchmode,是基础的属性,但也是App优化必须掌握的知识,它约束了Acti ...

  5. Android之路-------Activity的详解

    前言 由于接近放假,公司在赶项目所以前段LP比较忙,没什么时间总结和写博客,只是准备睡觉的时候看看书,每天看的不算多,大概10多页左右吧,不过每天坚持如此的话那也是一个庞大的数字. 今天LP的任务完成 ...

  6. Android Fragment与Activity通讯详解

    与activity通讯 尽管fragment的实现是独立于activity的,可以被用于多个activity,但是每个activity所包含的是同一个fragment的不同的实例. Fragment可 ...

  7. 转 Android Activity之间动画完整版详解

    标签:Android Activity动画详解 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://mzh3344258.blog.5 ...

  8. Android中Intent组件详解

    Intent是不同组件之间相互通讯的纽带,封装了不同组件之间通讯的条件.Intent本身是定义为一个类别(Class),一个Intent对象表达一个目的(Goal)或期望(Expectation),叙 ...

  9. Android中Activity运行时屏幕方向与显示方式详解

    现在我们的手机一般都内置有方向感应器,手机屏幕会根据所处位置自动进行横竖屏切换(前提是未锁定屏幕方向).但有时我们的应用程序仅限在横屏或者竖屏状态下才可以运行,此时我们需要锁定该程序Activity运 ...

随机推荐

  1. git常用总结

    git 基本配置 安装git yum -y install git git全局配置 git config --global user.name "lsc" #配置git使用用户 g ...

  2. Python开发【第四篇】: 三大器和内置函数

    内容概要 函数名 闭包 迭代器 生成器 推导式与表达式 内置函数 装饰器 初识递归 1.函数名 函数名的运用: 函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数的变量. 01. 函数名的 ...

  3. python多线程爬取图片二

    上一篇的多线程是使用类创建的,这一次使用函数创建多线程,还是同一个网站https://www.quanjing.com/category/1286521/1.html, 代码如下: # 多线程,自动创 ...

  4. HDU 1398:Just a Hook(线段树区间更新)

    http://acm.hdu.edu.cn/showproblem.php?pid=1698 Just a Hook Problem Description   In the game of DotA ...

  5. HDU 5773:The All-purpose Zero(贪心+LIS)

    http://acm.hdu.edu.cn/showproblem.php?pid=5773 The All-purpose Zero Problem Description   ?? gets an ...

  6. Windows使用Python统一设置解析器路径

    碰到的问题: .py文件放在cgi-bin文件夹下面,这个.py文件都要设置"#!python.exe路径"来告诉CGI如何找解析器解析这个.py的文件,我是想知道这个路径可否统一 ...

  7. python 实现一个计算器功能

    #s = '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )' #第 ...

  8. python中的 == 和 is 的区别

    == 比较的是两边的值 is 比较的是两边的内存地址  通过 id()获取内存地址 小数据池:我们使用过的值存储在小数据池中,供其他数据使用. 小数据池仅限于 数字 和 字符串: 数字的小数池范围  ...

  9. 为什么说是时候拥抱.NET CORE了?

    微软和社区已经做了大量艰苦的工作,使.Net Core成为市场上具有竞争力的框架,帮助开发人员快速开发具有最佳性能和可扩展性的强大应用程序.做的最棒的事情是.Net Framework开发人员不需要任 ...

  10. c++小游戏——2048

    #include <stdio.h> #include <time.h> #include <conio.h> #include <windows.h> ...