深入分析 Android Activity (十三)(完)

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 ActivityFragment 的生命周期、状态管理、权限管理、性能优化和测试方法,可以构建出高效、稳定且用户体验良好的应用程序。掌握这些关键技术和设计模式,不仅可以提高开发效率,还能显著提升应用的整体质量。在实际开发中,灵活应用这些技术,结合实际需求进行优化和调整,是构建优秀 Android 应用的基础。

作者:我说HelloWorld
链接:https://juejin.cn/post/7384629198131052583
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值