android生命周期深入分析(二)

下面是关于“Android生命周期深入分析(二)”的完整攻略:

概述

这篇文章主要深入分析了Android四大组件(Activity、Service、BroadcastReceiver、ContentProvider)的生命周期。对于Android开发者而言,生命周期是非常重要的概念,深入理解生命周期可以更好的控制Android四大组件的运行,确保应用程序的稳定性和性能。

本文主要涉及以下内容:

  • Activity的生命周期
  • Service的生命周期
  • BroadcastReceiver的生命周期
  • ContentProvider的生命周期

Activity的生命周期

Activity是Android最核心的组件之一,每个Activity都有自己的生命周期。一个Activity的生命周期主要由以下方法组成:

  • onCreate()
  • onStart()
  • onResume()
  • onPause()
  • onStop()
  • onDestroy()

在不同的状态下,这些方法会被不同的调用次数和顺序所影响。下面结合示例对每个方法进行说明:

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(TAG, "onCreate");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "onStart");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "onResume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "onPause");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy");
    }
}
  • onCreate()方法:当Activity被创建时,该方法会被调用。这是Activity生命周期的第一个方法。主要用于初始化Activity的各种参数。在该方法中,可以通过findViewById()方法获取布局文件中的各个控件,或者是初始化一些全局变量等。
  • onStart()方法:当Activity进入屏幕前台并开始准备为用户提供交互服务时,该方法会被调用。此时,Activity已经准备好了,并且处于正在运行的状态。Android系统也会向Activity的视图层发出绘制请求。
  • onResume()方法:当使用者可以使用该Activity并在其界面与用户进行交互时,该方法会被调用。该方法意味着该Activity处于前台的位置,并正在与用户互动。
  • onPause()方法:当Activity被其他Activity覆盖或者从前台转向后台时,该方法会被调用。该方法中的代码不应该过多处理逻辑,并尽可能快地执行完毕,避免用户长时间等待。
  • onStop()方法:当Activity完全不可见并正确的暂停或终止时,该方法会被调用。此时,Activity不再受到用户输入,也不再将视图呈现给用户。
  • onDestroy()方法:当Activity销毁时,该方法会被调用。在此方法中,可以执行诸如释放资源、取消注册接收器、停止服务等相关操作。

上述生命周期方法均按照上述顺序被调用。下面通过示例讲解生命周期的各个阶段:

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(TAG, "onCreate");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "onStart");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "onResume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "onPause");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy");
    }
}

在上述示例中,当MainActivity首次创建时,各个生命周期方法的调用顺序如下:

onCreate
onStart
onResume

当按下home键回到桌面时,各个生命周期方法的调用顺序如下:

onPause
onStop

当重新回到MainActivity时,各个生命周期方法的调用顺序如下:

onRestart
onStart
onResume

当用户退出应用程序时(或者按下返回键),各个生命周期方法的调用顺序如下:

onPause
onStop
onDestroy

Service的生命周期

Service是在后台运行的一种组件,其生命周期与Activity有所不同,验证Service生命周期的方法与上述类似,包括:

  • onCreate()
  • onStartCommand()
  • onBind()
  • onUnbind()
  • onDestroy()

下面是一个基本的Service示例:

public class MyService extends Service {

    private static final String TAG = "MyService";

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "onCreate");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public IBinder onBind(Intent intent) {
        Log.d(TAG, "onBind");
        return null;
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Log.d(TAG, "onUnbind");
        return super.onUnbind(intent);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy");
    }
}

下面将各个生命周期方法进行说明:

  • onCreate()方法:当Service被创建时,该方法会被调用。与Activity的onCreate()方法类似,主要用于初始化一些变量数据。在该方法中开启线程池、数据库连接,以及初始化一些资源准备工作等。
  • onStartCommand()方法:当外部组件(如Activity)启动Service时,该方法会被调用。这是最常被使用的Service方法之一。在该方法中,可以获取由上层组件传递来的Intent,执行一些后台操作,或者开始从外部发送网络请求。
  • onBind()方法:当服务被绑定时,该方法会被调用。在该方法中,需要返回一个IBinder接口对象,通过该接口来与上层组件通信。例如,获取Service执行的进度状态。
  • onUnbind()方法:当服务与上层组件之间的连接被关闭时,该方法会被调用。在该方法中,需要释放资源、清除变量。同时也可以在方法中启动其他任务等。
  • onDestroy()方法:当Service销毁时,该方法会被调用。在该方法中,需要释放资源和停止正在执行的任务。例如,释放持有的资源文件或者是停止正在执行的计时器。

下面通过示例来展示Service组件的生命周期过程。

public class MyService extends Service {

    private static final String TAG = "MyService";

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "onCreate");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public IBinder onBind(Intent intent) {
        Log.d(TAG, "onBind");
        return null;
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Log.d(TAG, "onUnbind");
        return super.onUnbind(intent);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy");
    }
}

和Activity一样,Service组件中各个生命周期方法的调用顺序也是按照如下方式进行的:

当Service组件首次创建时,生命周期方法的调用顺序为:

onCreate
onStartCommand

当该Service组件上游的Activity调用unbindService()方法解绑服务时,生命周期方法的调用顺序为:

onUnbind
onDestroy

当Service被再次启动时,生命周期方法的调用顺序为:

onCreate
onStartCommand

举个栗子,在一些音乐应用中,我们可以启动一个服务播放音乐,这个服务在应用退出时依然会继续播放音乐,例如像QQ音乐这类。对于这类应用就可以通过Service来实现。

BroadcastReceiver的生命周期

BroadcastReceiver也是一种特殊的组件,它通常用于响应系统广播(如电话、短信等)或是自定义广播。BroadcastReceiver包含两个基本方法:

  • onReceive()
  • 各种register()和unregister()方法

其中,onReceive()方法是BroadcastReceiver的核心方法,当接收到广播时,该方法会被调用。register()方法用于注册BroadcastReceiver,而unregister()方法用于解除注册。

下面是一个基本的BroadcastReceiver示例:

public class MyBroadcastReceiver extends BroadcastReceiver {

    private static final String TAG = "MyBroadcastReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG, "onReceive: " + intent.getAction());
    }
}

下面是各个生命周期方法的解释:

  • onReceive()方法:当BroadcastReceiver接收到广播时,该方法会被调用。在该方法中,可以获取传递的Intent对象,并根据各种Action执行操作。例如,我们可以在该方法中对短信进行自动回复。
  • register()方法:该方法用于注册BroadcastReceiver,指定接收哪些系统广播或自定义广播。通常于Activity、Service或Manifest文件中实现注册。通过调用该方法注册BroadcastReceiver之后,就可以接收到对应广播了。
  • unregister()方法:该方法用于解除注册BroadcastReceiver,当不再接收某个广播时,需要调用该方法来停止对广播的监听。

下面通过示例展示BroadcastReceiver的生命周期过程。

public class MyBroadcastReceiver extends BroadcastReceiver {

    private static final String TAG = "MyBroadcastReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG, "onReceive: " + intent.getAction());
    }
}

在BroadcastReceiver中,不存在onCreate()、onDestroy()这类具体生命周期方法,它需要通过register()方法来注册,通过unregister()方法来解除注册。下面是BroadcastReceiver的生命周期示例:

当BroadcastReceiver首次注册时,生命周期过程如下:

当BroadcastReceiver接收到一个系统广播时,生命周期过程如下:

onReceive

当BroadcastReceiver再次接收到同一个系统广播时,生命周期过程同上。

当BroadcastReceiver解除注册时,生命周期过程如下:

ContentProvider的生命周期

ContentProvider是Android平台中的一种数据管理方式,通常用于共享存储空间中的数据。应用程序可以通过ContentProvider向其他应用程序提供自己的数据,也可以访问其他应用程序提供的数据。

ContentProvider生命周期方法主要有以下几种:

  • onCreate()
  • query()
  • insert()
  • update()
  • delete()

下面是一个基本的ContentProvider示例:

public class MyContentProvider extends ContentProvider {

    private static final String TAG = "MyContentProvider";

    @Override
    public boolean onCreate() {
        Log.d(TAG, "onCreate");
        return true;
    }

    @Nullable
    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        Log.d(TAG, "query");
        return null;
    }

    @Nullable
    @Override
    public String getType(Uri uri) {
        Log.d(TAG, "getType");
        return null;
    }

    @Nullable
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        Log.d(TAG, "insert");
        return null;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        Log.d(TAG, "delete");
        return 0;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        Log.d(TAG, "update");
        return 0;
    }
}

下面是各个生命周期方法的解释:

  • onCreate()方法:该方法在ContentProvider创建时会被调用。在该方法中,需要进行数据库的初始化工作(例如创建表、配置索引)等。
  • query()方法:在使用者访问ContentProvider时,如果选择了查询操作,该方法会被回调。该方法的主要任务就是从数据库中读取数据,然后存入Cursor对象并返回。
  • getType()方法:在使用者访问ContentProvider时,如果需要获取ContentProvider中某个数据的MIME类型,该方法会被调用。在该方法中,需要根据URI中的具体数据类型,返回相应的MIME类型信息。
  • insert()方法:在使用者访问ContentProvider时,如果选择了添加操作,该方法会被回调。该方法的主要任务就是将用户添加的数据保存在数据库中,然后将保存成功的URI返回。
  • delete()方法:在使用者访问ContentProvider时,如果选择了删除操作,该方法会被回调。该方法的主要任务是删除符合条件的数据,并返回删除的行数。
  • update()方法:在使用者访问ContentProvider时,如果选择了更新操作,该方法会被回调。该方法的主要任务是重新设置符合条件的数据。

下面通过示例展示ContentProvider的生命周期过程。

public class MyContentProvider extends ContentProvider {

    private static final String TAG = "MyContentProvider";

    @Override
    public boolean onCreate() {
        Log.d(TAG, "onCreate");
        return true;
    }

    @Nullable
    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        Log.d(TAG, "query");
        return null;
    }

    @Nullable
    @Override
    public String getType(Uri uri) {
        Log.d(TAG, "getType");
        return null;
    }

    @Nullable
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        Log.d(TAG, "insert");
        return null;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        Log.d(TAG, "delete");
        return 0;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        Log.d(TAG, "update");
        return 0;
    }
}

ContentProvider的生命周期过程如下:

当ContentProvider首次被创建时,生命周期过程如下:

onCreate

当访问ContentProvider时,生命周期过程如下:

getType
query

当用户使用CURD方式操作数据时,生命周期过程如下:

insert/delete/update

这就是关于“Android生命周期深入分析(二)”的完整攻略,希望能对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:android生命周期深入分析(二) - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • js生成word中图片处理

    js生成word中图片处理 在使用js生成word文档时,有时需要在文档中插入图片,但是插入图片需要对图片进行处理,使之适应word文档。下面介绍一些js处理word中图片的方法。 1. 压缩图片 插入到word文档中的图片应该尽可能地压缩,以减小文件大小。可以使用canvas将图片压缩后再插入到word文档中。示例代码如下: function compre…

    其他 2023年3月28日
    00
  • 深入了解Synthetix V3:功能、优势和未来计划

    深入了解Synthetix V3:功能、优势和未来计划 Introduction Synthetix 是一个去中心化的合成资产协议,它在区块链上提供对各种资产(如 BTC、ETH、黄金和美元)的合成替代品。Synthetix V3 也称为 L2,这是 Synthetix 协议的最新版本,它通过在 Optimism 等 Layer 2 解决方案上部署 Synt…

    other 2023年6月26日
    00
  • Angular中ng-template和ng-container的应用小结

    当然!下面是关于\”Angular中ng-template和ng-container的应用小结\”的完整攻略,包含两个示例说明。 … … … … 示例1:使用ng-template进行条件渲染 <ng-template [ngIf]=\"showMessage\"> <p>显示的消息</p&g…

    other 2023年8月20日
    00
  • Python 中的嵌套字典推导的使用及优势

    Python 中的嵌套字典推导的使用及优势 在Python中,嵌套字典推导是一种强大的工具,可以快速创建和转换嵌套字典。嵌套字典推导的语法类似于列表推导,但是可以在字典中嵌套使用。 基本语法 嵌套字典推导的基本语法如下: {key_expression: value_expression for outer_loop for inner_loop} 其中,k…

    other 2023年7月27日
    00
  • 服务器远程连接提示由于协议错误,客户端无法连接到远程计算机

    这个问题实际上是与“协议”不兼容的错误。在客户端连接服务器时,连接所使用的协议必须与服务器所使用的协议相同。如果不同,则会导致连接失败,客户端会提示“由于协议错误,客户端无法连接到远程计算机”。 以下是可能导致此问题的一些常见原因以及应对措施。 原因一:使用的协议不匹配 由于常见的远程连接协议有多种,可能是在尝试连接时,客户端和服务器使用的协议不匹配。例如,…

    other 2023年6月27日
    00
  • java 深入理解内存映射文件原理

    Java 深入理解内存映射文件原理攻略 什么是内存映射文件 内存映射文件是一种将磁盘上的文件映射到内存中的技术。通过内存映射文件,可以将文件的内容直接映射到内存中的字节数组,从而实现对文件的高效读写操作。在Java中,可以使用java.nio包中的MappedByteBuffer类来实现内存映射文件。 内存映射文件的原理 内存映射文件的原理是将文件的一部分或…

    other 2023年8月1日
    00
  • ul里不能直接嵌套div(在ie7以前版本)

    在IE7以前的版本中,<ul>元素不能直接嵌套<div>元素。这是因为在早期的IE浏览器中,<ul>元素被视为一个块级元素,而<div>元素也是一个块级元素,两者不能直接嵌套。 为了解决这个问题,我们可以使用以下两种方法来避免在<ul>中直接嵌套<div>: 方法一:使用<li&g…

    other 2023年7月27日
    00
  • 干货:快速提高效率的9种WPS排版方法

    当然!下面是关于\”干货:快速提高效率的9种WPS排版方法\”的完整攻略: … 2. 使用样式和标题 WPS提供了丰富的样式和标题功能,可以帮助你快速排版文档。以下是两个示例: 样式设置:选择一段文本,然后在\”样式\”选项卡中选择合适的样式,如标题、副标题、正文等。这样可以快速应用一致的格式和样式。 标题设置:使用标题功能可以快速创建目录和导航。选择一…

    other 2023年8月19日
    00
合作推广
合作推广
分享本页
返回顶部