前言
小伙伴们,在之前的系列文章我们分别介绍了Android视图组件及布局相关的内容,从本文开始我们继续盘点介绍Android开发中另一个比较重要的内容,Android四大组件,第一个 Activity。
一 Activity基本介绍
Activity是Android应用程序的一个核心组件,用于提供用户界面和交互。每个Activity都对应着一个屏幕上的窗口,用户在不同的Activity之间进行切换来完成不同的功能。
以下是关于Activity的一些重要信息:
- 生命周期:Activity有丰富的生命周期方法,可以响应系统事件和应用程序状态的变化。常见的生命周期方法包括onCreate()、onStart()、onResume()、onPause()、onStop()、onDestroy()等。开发者可以重写这些方法来执行初始化、资源释放、数据保存等操作。
- 布局和界面:通过XML布局文件或代码方式定义Activity的界面布局,使用各种UI组件(如Button、TextView、EditText等)构建用户界面。可以使用不同的布局管理器(如LinearLayout、RelativeLayout等)来实现灵活的界面设计。
- 生命周期回调和状态保存:在Activity的生命周期中,可以进行一些相关操作,例如在onPause()时保存数据,在onCreate()或onRestoreInstanceState()时恢复数据等。这样可以确保在应用程序发生配置更改或内存不足时保持数据的完整性。
- 启动和关闭Activity:在程序中启动Activity可以通过Intent来实现,可以通过显式意图(指定目标Activity的类名)或隐式意图(指定匹配的Intent过滤条件)的方式进行启动。关闭Activity可以通过调用finish()方法来完成。
- Activity的通信和数据传递:通过Intent可以实现Activity之间的通信和数据传递。可以在Intent中携带数据,启动目标Activity后可以通过获取Intent中的数据进行处理。
- 生命周期管理和任务栈:Android系统会根据需要管理Activity的生命周期,并将其按照任务栈(Task)的形式组织起来。可以通过设置启动模式、清单文件中的配置等方式来控制Activity的行为和任务栈的管理。
- Fragment:Fragment是用于构建灵活且可重用的用户界面模块的一种抽象。它可以在Activity中嵌入多个Fragment,使得界面布局更加灵活和模块化。
二 Activity使用方法
- 创建Activity类:创建一个继承自android.app.Activity的Java类,作为你的Activity。可以在该类中重写生命周期方法和其他必要的方法。
- 定义布局文件:在res目录下的layout文件夹中创建XML布局文件,定义Activity的界面布局。可以使用各种UI组件和布局管理器来构建界面。
- 在Activity中加载布局:在Activity的onCreate()方法中调用setContentView()方法,传入布局文件的资源ID,将布局文件与Activity关联起来。
- 处理界面交互:可以在Activity中通过findViewById()方法获取布局中的UI组件,并进行事件监听和处理。例如设置按钮的点击事件、文本框的输入监听等。
- 启动Activity:可以使用Intent来启动另一个Activity。根据需要,可以设置Intent中的数据和启动标志。使用startActivity()方法或startActivityForResult()方法启动目标Activity。
- 数据传递和返回:通过Intent可以在不同的Activity之间传递数据。在源Activity中创建Intent对象,通过putExtra()方法设置数据,在目标Activity中通过getXXXExtra()方法获取数据。在目标Activity中可以通过setResult()方法设置返回结果,在源Activity中通过onActivityResult()方法接收返回结果。
- 生命周期管理:根据需要,可以重写Activity的生命周期方法来执行初始化、资源释放、数据保存等操作。确保在合适的时机处理相关逻辑。
- 注册清单文件:在AndroidManifest.xml文件中注册Activity,以便系统可以正确识别和启动Activity。在<application>标签下使用<activity>标签定义Activity的属性和配置。
- 资源管理:可以在res目录下的其他文件夹中管理Activity需要用到的资源,如图片、字符串等。可以使用R类来引用这些资源。
三 Activity常见属性及方法
Activity常见属性和方法如下:
属性:
-
IntentFilter
:定义在清单文件中的Intent过滤器,用于指定Activity可以响应的Intent类型。 -
Intent
:Activity接收到的意图对象,包含了启动Activity的相关信息,如数据、标志位等。 -
Window
:代表Activity的窗口,可以用来设置标题栏、背景色等窗口属性。 -
FragmentManager
:管理Activity中的Fragment,用于添加、替换和移除Fragment。 -
ActionBar
:操作栏,可以在Activity中显示应用程序的标题、导航按钮等。 -
LayoutInflater
:用于动态加载布局文件。可以通过getLayoutInflater()方法获取当前Activity的LayoutInflater对象。 -
Resources
:提供访问资源文件的方法,如字符串、图片等。可以通过getResources()方法获取当前Activity的Resources对象。
方法:
-
onCreate()
:生命周期方法,在Activity创建时调用,可以进行初始化操作。 -
onStart()
:生命周期方法,在Activity变得可见但还无法与用户交互之前调用。 -
onResume()
:生命周期方法,在Activity变得可见且可以与用户交互之前调用。 -
onPause()
:生命周期方法,在Activity失去焦点但仍可见时调用,用于保存轻量级的UI状态或停止一些不必要的资源消耗。 -
onStop()
:生命周期方法,在Activity完全不可见时调用,用于释放占用的资源。 -
onDestroy()
:生命周期方法,在Activity销毁之前调用,用于释放所有的资源和执行最终的清理操作。 -
onActivityResult()
:用于接收其他Activity返回的结果,通过Intent对象获取返回的数据。 -
startActivity()
:启动另一个Activity,参数为目标Activity的Intent对象。 -
finish()
:关闭当前Activity,返回到上一个Activity。 -
setResult()
:设置当前Activity的返回结果,通过Intent对象传递数据给上一个Activity。 -
getSupportFragmentManager()
:获取Activity中的FragmentManager对象,用于管理Fragment。 -
setTitle()
:设置Activity的标题。 -
findViewById()
:通过ID查找布局文件中的UI组件。 -
setContentView()
:设置Activity的布局文件。
四 Activity简单案例
以下是一个简单的Activity案例:
代码语言:javascript复制public class MainActivity extends AppCompatActivity {
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 在布局文件中定义了一个按钮,通过findViewById获取对应的Button对象
button = findViewById(R.id.button);
// 设置按钮的点击事件监听器
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 创建一个意图对象,用于启动另一个Activity
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
});
}
}
五 activity生命周期
Activity的生命周期是指从Activity创建到销毁的整个过程,可以分为以下几个阶段:
- 创建阶段:
onCreate()
:在Activity首次创建时调用,进行一些初始化操作,如设置布局、获取资源等。
- 可见性阶段:
onStart()
:当Activity变得可见但还无法与用户交互时调用。此时Activity仍然位于前台,但未获得焦点。onResume()
:在Activity变得可见并能够与用户交互之前调用,此时Activity位于前台并获得了焦点。在这个阶段,Activity处于活动状态,可以响应用户的输入事件。
- 暂停阶段:
onPause()
:当Activity失去焦点但仍然可见时调用,通常是因为有其他Activity被部分遮挡或者弹出对话框等情况。在此方法内可以执行一些轻量级的释放资源的操作,但不应该做耗时操作。onStop()
:当Activity完全不可见时调用,比如另一个Activity覆盖在其上面,或者按下了返回键回到了上一个Activity。在此方法内可以执行一些释放资源的操作。
- 销毁阶段:
onDestroy()
:在Activity即将销毁时调用,可以进行最后的资源释放和清理工作。
- 重启阶段(可选):
onRestart()
:当已停止的Activity再次启动时调用,此方法在Activity从后台重新回到前台时调用。
在Activity生命周期中,一般情况下,一个Activity在onCreate()
、onStart()
和 onResume()
方法之间转换表示进入前台运行状态,而在onPause()
、onStop()
和 onDestroy()
方法之间转换表示退出前台运行状态。
需要注意的是,当系统资源不足或内存紧张时,可能会触发Activity的销毁和重建,这时会调用相应的生命周期方法。因此,开发者应该在适当的生命周期方法中保存和恢复Activity的状态,以保证数据的一致性。
另外,可以通过重写对应的生命周期方法来执行自定义操作,如注册/注销广播接收器、开始/停止定时任务等,以便在不同生命周期状态下执行相应的逻辑。
六 activity启动方式
Activity可以通过多种方式进行启动,其中常见的包括:
显式启动: 通过指定目标Activity的类名启动,使用startActivity()
方法或者更加灵活的Intent
对象来实现。例如:
Intent intent = new Intent(CurrentActivity.this, TargetActivity.class);
startActivity(intent);
隐式启动: 通过指定Action、Category和Data等属性,将启动请求发送给系统让其自行匹配合适的Activity进行启动。一般与IntentFilter
结合使用。例如:
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.example.com"));
startActivity(intent);
startActivityForResult()启动: 当需要获取目标Activity返回的结果时,可以使用startActivityForResult()
方法启动,并在目标Activity中调用setResult()
方法设置返回结果。例如:
Intent intent = new Intent(CurrentActivity.this, TargetActivity.class);
startActivityForResult(intent, requestCode);
在目标Activity中设置返回结果:
代码语言:javascript复制Intent resultIntent = new Intent();
resultIntent.putExtra("result_data", data);
setResult(Activity.RESULT_OK, resultIntent);
finish();
SingleTop模式: 当要启动的Activity已经位于任务栈栈顶时,会复用该Activity实例,调用其onNewIntent()
方法传递新的启动意图。
SingleTask模式: Activity设置为SingleTask模式后,系统会为其创建一个新的任务栈,并且同一任务栈中只会存在一个该Activity实例。如果该Activity已经存在于其他任务栈中,则会切换到该任务栈并调用其onNewIntent()
方法。
SingleInstance模式: Activity设置为SingleInstance模式后,系统会为其创建一个独立的任务栈,并且整个系统中只会存在一个该Activity实例。
七 总结
总之,Activity是Android应用程序开发的重要组件,它处理用户界面和交互,并提供了生命周期管理、布局和视图管理、意图启动等核心功能,帮助开发者构建丰富、交互性强的应用程序。