Activity的类图结构
Activity作为Android的四大组件之一,Activity在Android系统中是以界面的形式进行体现。其中Activity实现了如Window.Callback, KeyEvent.Callback等接口用于与用户进行交互。
文档源码解释
1 一个界面是开发者可以操作的一个重点的独立事项。
2 几乎所有界面都可以与用户交互,所以Activity类负责为用户创建一个窗口,你可以在其中使用setContentView(View)放置UI。
3虽然界面通常以全屏窗口的形式呈现给用户,但它们也可以以其他方式使用:作为浮动窗口(通过具有windowIsFloating集合的主题)或嵌入另一个活动(使用ActivityGroup)内部。
4几乎所有的Activity子类都会实现两种方法:
onCreate(Bundle)是初始化界面的地方。最重要的是,在这里你通常会调用setContentView(int)和一个定义你的UI的布局资源,并且使用findViewById(int)来检索你需要以编程方式进行交互的那个UI中控件。
onPause()是你对于用户离开界面的处理。最重要的是,此时用户所做的任何更改都应该提交(通常发送给持有数据的ContentProvider。
5 要使用Context.startActivity(),所有界面类必须在其包下的AndroidManifest.xml中具有相应的声明。
如果想要让当前Activity作为启动Activity,则该Activity在清单文件中应该配置为:
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Activity的生命周期
1 oncreate() ----------------- activity被创建,在第一次创建活动时调用。
这是你应该完成所有常规静态设置的位置:创建视图,将数据绑定到列表等。此方法还会为你提供一个包含Activity先前保存页面状态的Bundle对象(如果有的话)。总是跟着onStart()方法。
2 ondestroy()----------------- activity被销毁的时候调用
3 onStart()--------------------- 当Activity界面变为可视的时候调用
4onStop() --------------------- 当Activity界面变为不可视的时候调用
5onResume()----------------- 当Activity获取焦点的时候调用
6onPause() ------------------ 当界面上按钮不可以被点击 失去焦点时调用。onPause()方法在系统即将开始显示之前的界面时调用。 这通常用于将未保存的更改进行保存,并保存为持久化数据,并且会执行例如停止动画和其他可能消耗CPU的内容等。此方法的实现必须非常快速,因为在此方法返回之前,下一个界面不会显示。
另外还要注意一个横竖屏切换的问题,在切换横竖屏时,如果没有固定方向,Activity就会执行onDestroy()方法。
可以通过在清单文件中声明屏幕方向的方式来固定屏幕方向
android:screenOrientation="portrait" //代表竖屏
android:screenOrientation="landscape" //代表横屏
Activity任务与任务管理栈
任务是指在执行特定作业时与用户交互的一系列 Activity。 这些 Activity 按照各自的打开顺序排列在堆栈(即任务栈)中。
1打开一个Activity叫进栈,关闭一个Activity叫出栈。
2我们操作的Activity永远是栈顶的Activity
3任务栈是用来维护用户操作体验的
4应用程序退出就是任务栈清空了
5一般情况下一个应用程序对应一个任务栈
设备主屏幕是大多数任务的起点。当用户触摸应用启动器中的图标(或主屏幕上的快捷方式)时,该应用的任务将出现在前台。 如果应用不存在任务(应用最近未曾使用),则会创建一个新任务,并且该应用的“主”Activity 将作为堆栈中的根 Activity 打开。
当前 Activity 启动另一个 Activity 时,该新 Activity 会被推送到堆栈顶部,成为焦点所在。 前一个 Activity 仍保留在堆栈中,但是处于停止状态。Activity 停止时,系统会保持其用户界面的当前状态。 用户按“返回”按钮时,当前 Activity 会从堆栈顶部弹出(Activity 被销毁),而前一个 Activity 恢复执行(恢复其 UI 的前一状态)。 堆栈中的 Activity 永远不会重新排列,仅推入和弹出堆栈:由当前 Activity 启动时推入堆栈;用户使用“返回”按钮退出时弹出堆栈。 因此,返回栈以“后进先出”对象结构运行。 下图 通过时间线显示 Activity 之间的进度以及每个时间点的当前返回栈,直观呈现了这种行为。
参考博文:https://blog.csdn.net/qq_40842611/article/details/79753126?utm_source=copy
Activity的启动模式
在AndroidManifest.xml文件中为Activity配置相应的launchMode属性可以设置Activity的启动模式,共如下四种模式:
standard
singleTask
singleTop
singleInstance
接下来对四种启动模式进行详细分析。
1、standard模式
标准启动模式:
该模式下每次启动Activity都会重新创建Activity实例,在这种模式下谁启动了这个Actvitiy,那么这个Activity与被启动的Activity位于启动它的Activity的栈中。
2.
打开新的Activity以及传值
打开新的Activity有两种方式
1startActivity();
2startActivityForResult();
第一种就是单纯打开一个Activity(可以携带数据过去),第二种就是需要从开启的Activity中返回值。
第一种方式
Intent intent=new Intent(this,TestActivity.class);
//intent.putExtra("name","张三");
startActivity(intent);
在TestActivity中接收携带的数据
Intent intent=getIntent();
String name=intent.getStringExtra("name");
第二种方式(返回数据)
Intent intent=new Intent(this, ContactAcitivity.class);
startActivityForResult(intent, 1);
ContactActivity
//[5.0]把数据返回给调用者
Intent intent=new Intent();
intent.putExtra("phone", phone);
//把结果返回给调用者
setResult(10, intent);
//[5.1]关闭当前页面 开启调用者ononActivityResult方法
finish();
在调用者中接收数据
//当我们开启的Activity 页面关闭的时候 这个方法就调用
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//用请求码
if(requestCode==1){
//代表请求联系人页面的数据
String phone=data.getStringExtra("phone");
et_number.setText(phone);
}else if(requestCode==2){
//代表请求短信模板页面的数据
String smsContent=data.getStringExtra("sms");
et_content.setText(smsContent);
}
//用结果码
/*if (resultCode==10) {
String phone=data.getStringExtra("phone");
et_number.setText(phone);
} else if(resultCode==20){
String smsContent=data.getStringExtra("sms");
et_content.setText(smsContent);
}*/
super.onActivityResult(requestCode, resultCode, data);
}
显示意图和隐式意图
以上开启Activity的方式全部都是显示意图。
显示意图通过指定具体的包名和类名来开启Activity
清单文件中只声明,不配置其他信息。
下面介绍隐式意图
隐式意图通过一组动作或数据指明要开启的Activity,该Activity在清单文件中声明时必须定义好这些动作和数据。
在开启其他应用(系统应用)时用隐式意图,例如电话拨号器,短信等
显示意图声明Activity更安全一些,只能由本应用调用该Activity。