1. Activity 生命周期中的任务和回调方法
Activity 生命周期涉及一系列回调方法,用于管理 Activity 的创建、启动、暂停、恢复、停止和销毁等过程。了解这些回调方法对于正确管理资源、数据保存和恢复等非常重要。
1.1 onCreate(Bundle savedInstanceState)
onCreate
是 Activity 的入口方法,当 Activity 被创建时调用。在这个方法中可以初始化 Activity,例如设置布局和初始化组件。
java
代码解读
复制代码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化组件
}
1.2 onStart()
onStart
方法在 Activity 变得可见时调用。此时,Activity 已经创建了视图层次结构,但还没有与用户交互。
java
代码解读
复制代码
@Override
protected void onStart() {
super.onStart();
// Activity 可见时的操作
}
1.3 onResume()
onResume
方法在 Activity 准备和用户交互时调用。此时,Activity 位于前台,用户可以与之交互。
java
代码解读
复制代码
@Override
protected void onResume() {
super.onResume();
// Activity 准备好与用户交互时的操作
}
1.4 onPause()
onPause
方法在系统准备启动或恢复另一个 Activity 时调用。此时,Activity 仍然可见,但不在前台,不能与用户交互。
java
代码解读
复制代码
@Override
protected void onPause() {
super.onPause();
// Activity 不再与用户交互时的操作
}
1.5 onStop()
onStop
方法在 Activity 不再可见时调用。此时,Activity 可能会被系统回收,以释放内存资源。
java
代码解读
复制代码
@Override
protected void onStop() {
super.onStop();
// Activity 不再可见时的操作
}
1.6 onDestroy()
onDestroy
方法在 Activity 被销毁之前调用。此时,可以在此方法中进行清理工作,例如释放资源。
java
代码解读
复制代码
@Override
protected void onDestroy() {
super.onDestroy();
// Activity 销毁前的清理工作
}
1.7 onRestart()
onRestart
方法在 Activity 从停止状态重新启动时调用。此时,可以重新初始化在 onStop
中释放的资源。
java
代码解读
复制代码
@Override
protected void onRestart() {
super.onRestart();
// Activity 从停止状态重新启动时的操作
}
2. Activity 的状态保存和恢复
在 Activity 的生命周期中,需要保存和恢复状态,以便在配置变更或内存紧张时正确恢复界面。
2.1 onSaveInstanceState(Bundle outState)
在 Activity 即将被销毁之前调用,可以在此方法中保存必要的数据。
java
代码解读
复制代码
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("key", "value");
}
2.2 onRestoreInstanceState(Bundle savedInstanceState)
在 Activity 被重新创建时调用,可以在此方法中恢复之前保存的数据。
java
代码解读
复制代码
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
if (savedInstanceState != null) {
String value = savedInstanceState.getString("key");
// 恢复数据
}
}
2.3 onCreate(Bundle savedInstanceState)
中恢复状态
在 onCreate
方法中同样可以恢复之前保存的数据。
java
代码解读
复制代码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState != null) {
String value = savedInstanceState.getString("key");
// 恢复数据
}
}
3. Activity 的启动模式
Android 提供了多种启动模式,以管理 Activity 的创建和返回栈行为。这些启动模式通过 AndroidManifest.xml
文件中的 launchMode
属性或通过 Intent
标志来配置。
3.1 standard
启动模式
standard
是默认的启动模式,每次启动都会创建新的实例。
xml
代码解读
复制代码
<activity android:name=".MyActivity"
android:launchMode="standard"/>
3.2 singleTop
启动模式
如果栈顶已经有该 Activity 的实例,则复用该实例并调用 onNewIntent
,否则创建新的实例。
xml
代码解读
复制代码
<activity android:name=".MyActivity"
android:launchMode="singleTop"/>
java
代码解读
复制代码
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
// 处理新的 Intent
}
3.3 singleTask
启动模式
该模式会在一个新的任务栈中创建 Activity,如果该任务栈中已经有该 Activity 的实例,则复用该实例并清除其上的所有其他 Activity。
xml
代码解读
复制代码
<activity android:name=".MyActivity"
android:launchMode="singleTask"/>
3.4 singleInstance
启动模式
该模式类似于 singleTask
,但该 Activity 的任务栈中只允许存在该 Activity 的一个实例,任何新的 Activity 启动都会在另一个任务栈中创建。
xml
代码解读
复制代码
<activity android:name=".MyActivity"
android:launchMode="singleInstance"/>
4. Activity 的权限管理
在 Android 中,权限管理是确保应用安全和隐私的重要部分。需要在 AndroidManifest.xml 文件中声明权限,并在运行时请求敏感权限。
4.1 在 AndroidManifest.xml 中声明权限
xml
代码解读
复制代码
<uses-permission android:name="android.permission.CAMERA"/>
4.2 在运行时请求权限
对于敏感权限,如摄像头、位置等,需要在运行时请求。
java
代码解读
复制代码
private static final int REQUEST_CAMERA_PERMISSION = 1;
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CAMERA},
REQUEST_CAMERA_PERMISSION);
}
4.3 处理权限请求结果
java
代码解读
复制代码
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CAMERA_PERMISSION) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 权限被授予
} else {
// 权限被拒绝
}
}
}
5. Activity 的性能优化
为了确保应用的流畅性和响应性,需要对 Activity 进行性能优化。
5.1 视图层次结构优化
避免过深的视图层次结构,尽量减少布局嵌套。
xml
代码解读
复制代码
<!-- 使用 ConstraintLayout 代替嵌套的 LinearLayout -->
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
5.2 避免内存泄漏
及时释放不再需要的资源,避免静态引用 Activity。
java
代码解读
复制代码
@Override
protected void onDestroy() {
super.onDestroy();
// 释放资源
}
5.3 使用异步任务
避免在主线程中执行耗时操作,使用 AsyncTask
或其他异步任务处理。
java
代码解读
复制代码
private class MyAsyncTask extends AsyncTask<Void, Void, String> {
@Override
protected String doInBackground(Void... voids) {
// 执行耗时操作
return "Result";
}
@Override
protected void onPostExecute(String result) {
// 更新 UI
}
}
6. Activity 的测试
测试是确保应用质量的重要步骤,包括单元测试和 UI 测试。
6.1 单元测试
可以使用 JUnit 进行单元测试。
java
代码解读
复制代码
// 使用 JUnit 测试 Activity 中的方法
@RunWith(AndroidJUnit4.class)
public class MyActivityTest {
@Test
public void testActivityMethod() {
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
assertEquals("com.example.myapp", appContext.getPackageName());
}
}
6.2 UI 测试
可以使用
Espresso 进行 UI 测试。
java
代码解读
复制代码
// 使用 Espresso 测试 Activity 的 UI
@RunWith(AndroidJUnit4.class)
public class MyActivityTest {
@Rule
public ActivityTestRule<MyActivity> mActivityRule = new ActivityTestRule<>(MyActivity.class);
@Test
public void testButtonClick() {
onView(withId(R.id.button)).perform(click());
onView(withId(R.id.textView)).check(matches(withText("Clicked")));
}
}
7. Fragment 与 Activity 的交互
Fragment 是 Android 中的一种轻量级的可重用组件,用于构建动态和灵活的用户界面。Fragment 通常与 Activity 一起使用,提供更多的可用性和灵活性。
7.1 添加 Fragment 到 Activity
可以通过 FragmentTransaction
将 Fragment 添加到 Activity。
java
代码解读
复制代码
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
MyFragment fragment = new MyFragment();
fragmentTransaction.add(R.id.fragment_container, fragment);
fragmentTransaction.commit();
7.2 Fragment 与 Activity 之间的通信
可以通过接口实现 Fragment 与 Activity 之间的通信。
java
代码解读
复制代码
// 在 Fragment 中定义接口
public class MyFragment extends Fragment {
public interface OnFragmentInteractionListener {
void onFragmentInteraction(String data);
}
private OnFragmentInteractionListener mListener;
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnFragmentInteractionListener) {
mListener = (OnFragmentInteractionListener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement OnFragmentInteractionListener");
}
}
private void someMethod() {
if (mListener != null) {
mListener.onFragmentInteraction("Some data");
}
}
}
// 在 Activity 中实现接口
public class MyActivity extends AppCompatActivity implements MyFragment.OnFragmentInteractionListener {
@Override
public void onFragmentInteraction(String data) {
// 处理来自 Fragment 的数据
}
}
8. Fragment 的生命周期
Fragment 的生命周期与 Activity 类似,但有一些额外的回调方法。
8.1 onAttach(Context context)
在 Fragment 被附加到 Activity 时调用。
java
代码解读
复制代码
@Override
public void onAttach(Context context) {
super.onAttach(context);
// Fragment 被附加到 Activity 时的操作
}
8.2 onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
在创建 Fragment 的视图时调用。
java
代码解读
复制代码
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_my, container, false);
}
8.3 onActivityCreated(Bundle savedInstanceState)
在 Activity 的 onCreate
方法返回后调用。
java
代码解读
复制代码
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// Activity 的 onCreate 方法返回后调用的操作
}
8.4 onDestroyView()
在 Fragment 的视图被销毁时调用。
java
代码解读
复制代码
@Override
public void onDestroyView() {
super.onDestroyView();
// Fragment 的视图被销毁时的操作
}
8.5 onDetach()
在 Fragment 被解除附加到 Activity 时调用。
java
代码解读
复制代码
@Override
public void onDetach() {
super.onDetach();
// Fragment 被解除附加到 Activity 时的操作
}
总结
通过深入理解和合理使用 Android Activity
和 Fragment
的生命周期、状态管理、权限管理、性能优化和测试方法,可以构建出高效、稳定且用户体验良好的应用程序。掌握这些关键技术和设计模式,不仅可以提高开发效率,还能显著提升应用的整体质量。在实际开发中,灵活应用这些技术,结合实际需求进行优化和调整,是构建优秀 Android 应用的基础。
作者:我说HelloWorld
链接:juejin.cn/post/738462…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。