南宁网站建设q.479185700強,做网站系统的过程,江苏建筑信息平台,装饰公司网站模板下载#x1f3c6;作者简介#xff1a;|康有为| #xff0c;大四在读#xff0c;目前在小米安卓实习#xff0c;毕业入职 #x1f3c6;本文收录于 安卓学习大全#xff0c;欢迎关注 #x1f3c6;安卓学习资料推荐#xff1a; 视频#xff1a;b站搜动脑学院 视频链接 作者简介|康有为| 大四在读目前在小米安卓实习毕业入职 本文收录于 安卓学习大全欢迎关注 安卓学习资料推荐 视频b站搜动脑学院 视频链接 他们的视频后面一部分没再更新看看前面也挺好的 书籍《第一行代码》(第3版) by 郭霖 (z-lib.org) 思维导图 https://www.processon.com/view/link/62427cb2e0b34d0730e20e00来自动脑学院 目录
一、Activity入门
Activity的创建
1. 在layout目录下创建XML文件
2. 创建与XML文件对应的Java代码
3. 在AndroidManifest.xml中注册页面配置
Activity的跳转
Activity快捷创建
二、Activity的基本用法
在Activity中使用Toast
三、Activity的启动和结束
四、Activity的生命周期
分析Activity生命周期
将上文的细节提炼
状态之间的切换过程
Activity A 启动一个透明的 Activity B
异常情况下的生命周期
常见异常情况
1.资源相关的系统配置发生改变导致Activity被杀死并重新创建
2.系统内存不足导致低优先级的Activity被杀死 一、Activity入门 Activity可以理解为程序的一个界面或一个屏幕。
在Android中Activity 是一个用于展示用户界面和处理用户交互的基本组件。它代表了用户与应用程序之间的单一屏幕用户在应用程序中进行的每个操作通常都与一个 Activity 相关联。在Android应用程序中通常会包含多个活动每个活动都代表应用程序的一个界面或一个屏幕
先用Androidstudio创建一个Empty Views Activity 的 HelloWorld程序java语言的
Activity的创建
完整的页面创建过程包括三个步骤也就是创建下面的三个文件 1. 在layout目录下创建XML文件 创建成功后添加下面代码 并在res/values/strings.xml文件 中添加文字
resourcesstring nameapp_nameHelloWorld-Java/stringstring nametext2文字2222222/string
/resources2. 创建与XML文件对应的Java代码 写代码
1.继承AppCompatActivity
2.重写onCreate方法写onCreate会有提示自动补全
重写时选择这个protect修饰的这个onCreate方法 3.写上setContentView(R.layout.activity_main2); package com.example.helloworld_java;import android.os.Bundle;import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;public class MainActivity2 extends AppCompatActivity {Overrideprotected void onCreate(Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main2);}
}3. 在AndroidManifest.xml中注册页面配置
在这里加入一行代码将这个activity注册到清单文件
activity android:name.MainActivity2/ 因为MainActivity2 不是主activity所以不用再修改 intent-filter的代码。
至此就创建好了 Activity2
Activity的跳转
我们想显示Activity2就需要从主Activity中跳转到2所以写一个按钮加上点击跳转的事件跳转到2。
在主Activity中加上按钮 Buttonandroid:idid/buttonandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text跳转 /编写跳转事件要写到主Activity中的onCreate方法里面从主Activity 跳转到 其他Activity Button button findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {Intent intent new Intent();intent.setClass(MainActivity.this,MainActivity2.class);startActivity(intent);}
});效果 Activity快捷创建
直接在java文件包那里快捷创建 这样layout里面也会自动帮我们创建好文件 清单文件中也会自动帮我们注册好 快捷创建的layout中的xml文件根是androidx.constraintlayout.widget.ConstraintLayout 我们可以换成LinearLayout 。 androidx.constraintlayout.widget.ConstraintLayout 和 LinearLayout 是 Android 开发中常用的两种布局管理器它们在布局设计和子视图排列方面有一些不同之处。
二、Activity的基本用法
在Activity中使用Toast
Toast是Android系统提供的一种非常好的提醒方式在程序中可以使用它将一些短小的信息通 知给用户这些信息会在一段时间后自动消失并且不会占用任何屏幕空间。 在Android中Toast 是一种简单的通知方式可以在屏幕底部显示一小段时间的消息。以下是在 Activity 中使用 Toast 的基本步骤
创建 Toast 对象 使用 Toast.makeText() 方法创建一个 Toast 对象。设置显示文本 使用 setText() 方法设置要显示的文本内容。设置时长 使用 setDuration() 方法设置 Toast 的显示时长可以选择 Toast.LENGTH_SHORT短时大约2秒或 Toast.LENGTH_LONG长时大约3.5秒。显示 Toast 调用 show() 方法显示 Toast。
以下是一个简单的示例 import android.os.Bundle;
import android.view.Gravity;
import android.widget.Toast;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 创建一个Toast对象Toast toast Toast.makeText(this, Hello, this is a Toast!, Toast.LENGTH_SHORT);// 设置Toast的显示位置可选toast.setGravity(Gravity.CENTER, 0, 0);// 显示Toasttoast.show();}
}效果 三、Activity的启动和结束
从当前页面跳到新页面跳转代码如下:
startActivity(new Intent(源页面.this,目标页面.class));
从A -- 》 B 那么B就是启动了 从当前页面回到上一个页面相当于关闭当前页面返回代码如下:
finish();//结束当前的活动页面
B结束之后就返回到了A 示例
从A跳到B的java代码xml里面写个按钮就行。 从B跳回A也就是直接执行 finish 就行 四、Activity的生命周期
分析Activity生命周期
什么是 生命周期就是从生到死的过程。 正常情况下新建一个Activity A会顺序经历如下几个生命周期 onCreateA正在被创建这个方法中我们可以做一些Activity的初始化操作。例如布局文件的加载与事件的绑定setContentViewfindViewByIdsetOnClickListener等。onStart: A 正在被启动A 由不可见变为可见时调用此时 A 还无法与用户交互。此时可以做一些数据的初始化操作开启线程去拉本地数据库数据或从后台拉数据。onResume: A 已经可见并出现在前台该Activity位于返回栈栈顶可以响应用户的操作即可以与用户交互了。
如果此时用户拉起另一个Activity B, Activity A会顺序经历如下几个生命周期 4. onPause: 表示 A 正在停止准备从前台返回至后台此时可以做一些停止动画数据存储等工作。值得注意的是在onPause生命周期进行的工作不能太耗时不然会影响 B 的显示。Activity A的onPause执行完后Activity B的onResume才会执行。 5. onStop: 在 A 完全不可见时调用紧随着onPause执行表 A 即将停止此时 A 已经不在前台可以做一些稍微重量级的回收工作但同样不能太耗时如果此时新打开的Activity B是对话框式的Activity背景存在一定区域是透明的则Activity A的onStop不会调用。 6. onDestroy表示 A 即将被销毁在这里可以进行资源的回收、释放工作。一般是经过用户按下back键或者系统资源紧张时将Activity A释放掉以获得更多的内存时调用。 Activity B经历了onResume生命周期后已经显示在前台如果此时按下back返回键从 B 页面返回而 A 还停留在onStop没有经过onDestroy生命周期的话A 会经历如下几个生命周期后重新显示 7. onRestart: A 由onStop停止状态转为运行状态时调用表 A 正在被重新启动。
8. onStart
9. onResume
可以看到排除Activity退到后台的情况Activity从创建到销毁总共会经过6个生命周期分别是onCreateonStartonResumeonPauseonStoponDestroy。 通过上面的文字描述看这个图应该已经很清楚了不过未提到的是上图中onPause()还有个箭头指向了onResume()这是一种极端情况。即考虑当Activity A 跳转到Activity B 的情况此时 A 还在执行onPause() B 还未显示出来。快速地从B回到A此时会直接执行 A 的onResume()而不会走onRestart()。不过一般很难复现这种操作大家留个心眼就行。
将上文的细节提炼 onStart、onResume、onPause、onStop看起来回调调用的时机差不多它们俩区别在哪呢
onStart和onStop是从Activity是否可见的角度来回调的而onResume和onPause则是从Activity是否位于前台、是否可以与用户交互的角度来回调的除了这方面的差别在时机使用过程中它们没有其他明显区别。 从Activity A 跳转到Activity B是先执行 A 的onPause()还是先执行 B 的onResume()呢
这部分设计Activity跳转的源码源码逻辑太深、太复杂就不先在基础篇讨论了大家目前 先记住结论就好A 的onPause()会先执行然后才执行 B 的onResume()这个细节也是面试中可能会问到的点。 在onPause中不能进行耗时的操作否则会影响新Activity的显示稍微重一点的操作可以放在onStop中但依然不能太耗时。
状态之间的切换过程 打开新页面的方法调用顺序为:
onCreate→onStart→onResume
关闭旧页面的方法调用顺序为:
onPause→onStop→onDestroy Activity A 启动一个透明的 Activity B
如果 Activity A 启动一个透明的 Activity B会经历哪些生命周期呢
这是面试容易遇到的一个问题因为 B 页面透明 所以跳转到 B 页面后A 页面依然可见因此就不会调用 Activity A 的 onStop 方法。 一般情况A/B 均不是透明页面
A 跳转 B 页面会经历的生命周期A.onPause() - B.onCreate() - B.onStart() - B.onResume() - A.onStop。
从 B 页面返回 A 页面经历的生命周期B.onPause() - A.onRestart() - A.onStart() - A.onResume() - B.onStop()。
B是透明页面的情况
如果 B 是透明的A 跳转到 BA.onPause() - B.onCreate() - B.onStart() - B.onResume()。
从 B 返回 AB.onPause() - A.onResume() - B.onStop()
异常情况下的生命周期 考虑一种异常情况Activity C 打开了Actvity D后C进入了停止状态调用了onStop()此时系统内存不足需要回收 C调用C的onDestroy() 当用户从 D 返回到 CC 会被重新创建调用onCreate()。如果原来 C 里边有临时状态存储着比如TextView中的文字。那么从 D 返回 C 时C因为重新创建如果TextView未指定ID那它原来的文字就会消失这一定程度影响了用户的体验。 因此为了优化用户体验Activity提供了一个onSaveInstanceState()回调方法这个方法可以保证异常情况下在Activity被回收之前一定会被调用。 onSaveInstanceState()方法会携带一个bundle参数我们可以通过bundle对象存储一些简单的状态信息。 Activity重新创建后系统会调用onRestoreInstanceState()并把Activity销毁时onSaveInstanceState()方法所保存的Bundle对象作为参数同时传递给onRestoreInstanceState()和onCreate()。 你可以选择这两个方法中任意一个来恢复数据二者的区别是onRestoreInstanceState一旦被调用其bundle对象一定是有值的而onCreate在正常启动Activity的情况下bundle对象是无值的。 调用时机
onSaveInstanceState()在onStop()之前调用onRestoreInstanceState()会在onStart()之后调用。 异常情况下Activity数据的存储和恢复的生命过程都是一样的。
常见异常情况
常见的异常情况主要有以下两种
1.资源相关的系统配置发生改变导致Activity被杀死并重新创建
首先说说什么是系统配置信息。
不同手机设备的分辨率不同要将图片适配不同大小的手机屏幕我们通常会在drawable-xhdpidrawable-xxhdpidrawable-xxxhdpi等目录中存放对应大小的图片Resource文件。
当App启动时系统就会根据当前设备的屏幕情况去加载合适的Resource资源。同一台设备的横屏和竖屏时的屏幕大小也是不一样的如果当前Activity处于竖屏状态突然旋转至横屏那么此时系统的屏幕配置发生了改变。
默认情况下Activity会被销毁并重建。因为这种销毁是一种非用户主导的、异常的情况Activity会调用onSaveInstanceState()方法后销毁重建时会再调用onRestoreInstanceState()方法即走一遍异常情况的生命周期。 如何避免这种因为系统配置更改而导致Activity重建的异常情况
如果app在应用配置变更期间无需更新资源我们可以在AndroidManifest.xml文件中相应的Activity声明自行处理相关配置的变更从而阻止系统重建Activity。
只需指定相关的configChanges属性。比如下面的例子就阻止了当屏幕发生旋转时Activity的系统自动重建。 activity android:name.MainActivityandroid:configChangesorientation|screenSize /
当configChanges中指定的配置发生变化时系统会调用Activity的onConfigurationChanged()方法如果有需要处理配置变更的话可以在这个方法手动处理。一般我们在屏幕旋转时希望Activity能保持原样不重建就好了所以空实现该方法即可。
当然需要自行处理时比如检查当前设备的方向你可以这么写 override fun onConfigurationChanged(newConfig: Configuration) {super.onConfigurationChanged(newConfig)// Checks the orientation of the screenif (newConfig.orientation Configuration.ORIENTATION_LANDSCAPE) {Toast.makeText(this, landscape, Toast.LENGTH_SHORT).show()} else if (newConfig.orientation Configuration.ORIENTATION_PORTRAIT) {Toast.makeText(this, portrait, Toast.LENGTH_SHORT).show()}
}
configChanges属性可以指定很多属性如果你还想指定更多配置不同配置间用|分隔比如上面那样。 部分常用的configChanges配置项目如下 2.系统内存不足导致低优先级的Activity被杀死
这种情况就是我们分析异常情况下的生命周期时举的例子。Activity C 跳转至Activity DC 处于后台当系统内存资源不足时C的优先级较低会被系统销毁以获得更多的内存然后再从 D 回到 C C 会被重建走一遍异常时的数据存储和恢复的生命过程。 Activity按照优先级从高到低可以分为如下三中情况
前台Activity正在与用户交互的Activity其优先级最高。
可见但非前台Activity比如Activity中弹出了一个对话框导致Activity可见但出于后台无法与用户直接交互。
后台Activity已经被暂停的Activity比如执行了onStop用户看不见优先级最低。
当系统内存不足时系统会按照上述优先级的顺序去杀死Activity所在的进程。并在后续通过onSaveInstanceState()和onRestoreInstanceState()去存储和恢复数据。
如果一个进程中没有四大组件在执行那么这个进程将会很快被系统杀死因此一些后台工作不适合脱离四大组件而单独运行在后台中。比较好的方法是将后台的工作放到Service服务中从而保证进程有一定的优先级就不会容易被系统杀死了。