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

yizhihongxing

下面是关于“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日

相关文章

  • 分享全球十款超强HTML5开发工具

    分享全球十款超强HTML5开发工具攻略 HTML5是一种用于构建现代网页和应用程序的标准技术。在HTML5开发过程中,使用一些强大的工具可以提高效率和质量。本攻略将介绍全球十款超强的HTML5开发工具,并提供两个示例说明。 1. Visual Studio Code Visual Studio Code是一款轻量级的代码编辑器,具有强大的HTML5开发功能。…

    other 2023年7月27日
    00
  • thinkphp中rbac权限带菜单栏显示和详细权限操作

    ThinkPHP中RBAC权限带菜单栏显示和详细权限操作 在Web应用程序开发中,RBAC (Role-Based Access Control) 权限控制是一种广泛采用的访问控制方式。采用RBAC可以为不同的用户角色分配不同的权限,以保证应用程序的安全性。在ThinkPHP框架中,我们可以使用RBAC权限控制组件来进行RBAC权限管理,实现菜单栏显示和详细…

    其他 2023年3月28日
    00
  • JavaScript之BOM+DOM

    JavaScript之BOM+DOM 什么是BOM? BOM(Browser Object Model),即浏览器对象模型,它提供了一组与浏览器交互的对象和方法,可以用来实现浏览器的基本操作。BOM的核心是window对象,window对象是全局对象,它包含了许多属性和方法,如setTimeout和setInterval等。 BOM的常用属性和方法 1. 弹…

    其他 2023年3月28日
    00
  • fastDFS文件服务器迁移

    FastDFS是一个开源的轻量级分布式文件系统,它具有高性能、高可靠性、易部署等特点。在实际应用中,可能需要将FastDFS文件服务器迁移到新的服务器上。本文将提供一个完整的攻略,包括备份数据、安装配置新服务器、迁移数据等步骤,并提供两个示例说明。 备份数据 在迁移FastDFS文件服务器之前,需要备份数据以防止数据丢失。可以使用FastDFS提供的工具进行…

    other 2023年5月5日
    00
  • 7-Zip(64位)如何设置层叠右键菜单?7-Zip设置层叠右键菜单教程

    下面是详细的”7-Zip设置层叠右键菜单教程”攻略: 1. 下载7-Zip(64位)程序并安装 首先我们需要在官网下载7-Zip(64位)程序并安装:https://www.7-zip.org/ 2. 打开7-Zip程序并设置 打开7-Zip程序,选择“选项”菜单。 在选项窗口中选择“7-Zip”选项卡。 在“7-Zip文件管理器”部分中,勾选“在上下文菜单…

    other 2023年6月27日
    00
  • win10怎么进入命令提示符安全模式?win10启用带命令提示符的安全模式方法

    Win10进入命令提示符安全模式的方法有以下两种: 方法一:在登录界面下进入安全模式 按下电脑电源键启动电脑,在加载Windows文件的过程中,按下计算机前面板上的电源键,让计算机强行关机。这个动作需要重复三次,直到进入Windows高级启动选项界面。 在高级启动选项中,选择“疑难解答”。 在疑难解答中选择“高级选项”。 选择“启动设置”,然后点击“重新启动…

    other 2023年6月26日
    00
  • Android自定义流式布局/自动换行布局实例

    Android自定义流式布局/自动换行布局实例攻略 在Android开发中,有时我们需要实现一种自定义的布局,能够自动换行并适应不同的屏幕尺寸。这种布局被称为流式布局或自动换行布局。下面是一个详细的攻略,包含两个示例说明。 步骤1:创建自定义布局类 首先,我们需要创建一个自定义的布局类,继承自ViewGroup。这个类将负责管理子视图的位置和大小。 publ…

    other 2023年9月5日
    00
  • 多签钱包怎么转账?多签钱包转账教程及注意事项详解

    多签钱包怎么转账?多签钱包转账教程及注意事项详解 多签钱包是一种安全性更高的钱包类型,需要多个私钥的授权才能进行转账操作。下面是多签钱包转账的详细攻略,包括教程和注意事项。 教程 步骤一:创建多签钱包 打开多签钱包应用或网站,并选择创建新钱包。 输入所需的信息,如钱包名称、密码等。 选择多签选项,并设置所需的签名数量和参与者列表。 生成并保存钱包的助记词或私…

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