下面是关于“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技术站