美文网首页
Android四大组件和启动模式

Android四大组件和启动模式

作者: isLJli | 来源:发表于2024-12-12 17:17 被阅读0次

Android四大组件的生命周期、使用方法、ANR时间及四大启动模式的生命周期与使用场景


一、Android四大组件的生命周期、使用方法及ANR

1. Activity

Activity 是应用中最重要的组件之一,通常负责显示用户界面。每个Activity都对应着一个生命周期,开发者可以在生命周期的不同阶段执行相关操作,如初始化、释放资源等。

Activity的生命周期:

  • onCreate():Activity第一次创建时调用。在此方法中通常进行UI布局的初始化、数据的设置等。
  • onStart():当Activity对用户可见时调用,但此时它并没有获得焦点。
  • onResume():Activity获得焦点并开始与用户交互时调用,此时Activity处于前台。
  • onPause():当系统正在启动或恢复另一个Activity时,当前Activity失去焦点时调用。此时可以保存临时数据、释放资源等。
  • onStop():当Activity不再对用户可见时调用。此时Activity完全处于后台,可以进行资源的释放工作。
  • onRestart():当Activity从停止状态恢复时调用。通常用于恢复UI等。
  • onDestroy():当Activity销毁时调用。此时应释放资源,清理工作。

使用方法:

  • 启动Activity:可以通过startActivity()启动另一个Activity,通常还会携带数据:
    Intent intent = new Intent(this, TargetActivity.class);
    intent.putExtra("key", "value");
    startActivity(intent);
    
  • 返回数据:可以通过setResult()向调用的Activity返回结果,并通过onActivityResult()接收返回的数据。

ANR时间限制:

  • ANR(Application Not Responding) 是当应用在主线程上执行耗时操作(如网络请求、数据库操作、界面更新等)超过一定时间,Android系统会判定应用无响应,并弹出ANR对话框。通常,ANR的时间限制为 5秒(针对输入事件)和 10秒(针对广播接收器)。
  • 避免ANR:长时间的操作应该放到子线程中,避免阻塞主线程。可以使用AsyncTaskHandlerThreadIntentService等来进行后台操作。

2. Service

Service 是用于执行长时间运行的后台任务的组件,它没有用户界面,通常用于后台处理任务,如播放音乐、下载文件等。

Service的生命周期:

  • onCreate():Service第一次创建时调用,通常在此方法中初始化资源。
  • onStartCommand():每次调用startService()时,都会调用此方法。在此方法中执行后台任务。返回值决定Service如何重新启动:
    • START_STICKY:Service会在被杀死后重新启动。
    • START_NOT_STICKY:Service被杀死后不会重新启动。
    • START_REDELIVER_INTENT:Service被杀死后会重新启动,并传递最新的Intent。
  • onBind():当bindService()被调用时,执行此方法。返回一个IBinder对象,允许组件与Service进行通信。
  • onUnbind():当所有客户端都解绑时调用。
  • onDestroy():Service销毁时调用,用于清理资源和停止后台任务。

使用方法:

  • 启动Service
    Intent intent = new Intent(this, MyService.class);
    startService(intent);
    
  • 绑定Service
    Intent intent = new Intent(this, MyService.class);
    bindService(intent, connection, Context.BIND_AUTO_CREATE);
    

ANR时间限制:

  • ANR:在Service中进行网络请求、数据库操作等耗时操作时,如果没有在子线程中执行超过20S,就可能导致ANR。
  • 避免ANR:确保长时间运行的任务不会阻塞主线程,可以通过使用AsyncTaskExecutorService等将任务放到子线程中。

3. BroadcastReceiver

BroadcastReceiver 用于接收广播并响应它。广播可以是系统广播(例如电池电量变化、网络状态变化)或应用自定义广播。

BroadcastReceiver的生命周期:

  • onReceive():每当广播被接收时,onReceive()方法被调用。该方法在调用完成后立即结束,BroadcastReceiver会被销毁。因此,onReceive()中不应执行耗时操作。

使用方法:

  • 静态注册:通过在AndroidManifest.xml中声明广播接收器。
    <receiver android:name=".MyReceiver">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>
    
  • 动态注册:通过registerReceiver()方法注册,在不需要时应调用unregisterReceiver()注销。
    IntentFilter filter = new IntentFilter("android.intent.action.BOOT_COMPLETED");
    registerReceiver(new MyReceiver(), filter);
    

ANR时间限制:

  • ANR:广播接收器的onReceive()方法如果执行时间超过 10秒,会导致ANR。因此,广播接收器中的代码应尽量避免耗时操作。
  • 避免ANR:对于耗时操作,应该通过HandlerAsyncTask等异步方式在后台执行,避免阻塞onReceive()

4. ContentProvider

ContentProvider 是用于不同应用之间共享数据的组件。通过ContentResolver,其他应用可以访问提供的数据。

ContentProvider的生命周期:

  • ContentProvider的生命周期由系统管理,通常在第一次访问时创建,并在不再使用时销毁。

使用方法:

  • 查询数据
    Uri uri = Uri.parse("content://com.example.provider/data");
    Cursor cursor = getContentResolver().query(uri, null, null, null, null);
    
  • 插入数据
    ContentValues values = new ContentValues();
    values.put("name", "John");
    Uri uri = getContentResolver().insert(uri, values);
    

ANR时间限制:

  • ANR:ContentProvider的查询、插入、更新等操作如果执行过慢,可能会导致ANR。特别是在进行数据库操作时,如果查询操作没有加速,就可能导致ANR。
  • 避免ANR:对于复杂的数据库查询或大规模数据的操作,建议使用异步查询或分批操作。

二、四大启动模式的生命周期与使用场景

Android提供了四种启动模式(StandardSingleTopSingleTaskSingleInstance),每种模式都会影响Activity的生命周期、任务栈以及启动时的行为。合理选择启动模式,可以帮助开发者避免冗余实例,提高内存利用效率和用户体验。

1. Standard(标准模式)

在标准模式下,每次调用startActivity()都会创建新的Activity实例,新的实例会被添加到任务栈的顶部。

生命周期:

  • 每次调用startActivity()都会触发onCreate()onStart()onResume()等方法。
  • 每个Activity都会创建一个新的实例,并且在任务栈中有独立的生命周期。

使用场景:

适用于每次需要创建一个新的Activity实例的场景,如新闻页面、列表页等。

注意点:

  • 可能导致内存占用过高,特别是在频繁切换界面时。
  • 如果没有合理管理Activity的堆栈,可能会导致栈中堆积大量实例。

2. SingleTop(单例模式)

当目标Activity已经位于栈顶时,系统不会创建新的实例,而是复用栈顶的Activity。如果目标Activity不在栈顶,则会创建新的实例。

生命周期:

  • 如果目标Activity在栈顶,onNewIntent()方法会被调用,而不是onCreate()
  • 如果目标Activity不在栈顶,创建新的实例。

使用场景:

适用于避免栈顶重复创建实例的场景,例如聊天界面、通知界面等。

注意点:

  • 如果目标Activity已经在栈顶,onCreate()不会被调用,只有onNewIntent()会被调用。
  • onNewIntent()方法中应该处理新的Intent数据。

3. SingleTask(单任务模式)

当启动一个SingleTask模式的Activity时,系统会查找该Activity是否已存在于任务栈中。如果存在,则会将

该Activity及其上面的Activity从栈中移除,并将目标Activity置于栈顶。

生命周期:

  • 如果目标Activity已存在,会调用onNewIntent(),并将目标Activity带到前台。
  • 如果目标Activity不存在,系统会创建新的实例。

使用场景:

适用于那些只需要一个实例的Activity,如登录页面、主页面等。

注意点:

  • 由于每次启动都会清除栈中上面的Activity,使用时需要谨慎处理栈内的状态。

4. SingleInstance(单实例模式)

SingleInstance模式下,Activity被放置在一个独立的任务栈中,且该栈中只会有一个实例。其他任何启动该Activity的请求都会复用该实例。

生命周期:

  • 只有一个实例,所有启动请求都会复用该实例。

使用场景:

适用于只有一个实例的全局Activity,例如某些全局控制界面。

注意点:

  • SingleInstance模式的Activity被放置在独立的任务栈中,和其他任务栈的Activity不会在同一栈中。使用时要注意栈之间的跳转与状态管理。

总结

理解Android四大组件的生命周期、使用方法以及ANR的时间限制,可以帮助开发者避免常见的性能问题和内存泄漏。合理选择四大启动模式,不仅能够优化内存管理,还能提升用户体验。在应用设计中,开发者需要根据实际需求来选择合适的启动模式和组件使用方式,以实现高效的任务管理和流畅的用户交互。

相关文章

网友评论

      本文标题:Android四大组件和启动模式

      本文链接:https://www.haomeiwen.com/subject/lmuxejtx.html