关于Android四大组件的生命周期和使用方法
Activity的生命周期
Activity作为在应用程序中与用户交互最多的组件,他的生命周期至关重要。
我们实践一下 打开一个Activity的生命周期
要说activity 就难免不提及Fragment 我们在Activity中使用了Fragment,来看一下随着Activity的启动,Activity和 Fragment的生命周期是怎么样的。
当手机屏幕关闭的时候
当手机屏幕再次点亮的时候的生命周期
这几种情况比较简单,但是一般我们的额MainActivity 都会使用好几个Fragment来管理,那么,当每个Fragment来回切换的时候他们的生命周期又是怎么样的呢,让我们来看一下
刚才我们只是展示了MainActivity中只有一个Fragment的情况下他们的生命周期
现在我要从HomeFragment中切换到到VedioFragment中,他的生命周期回事怎么样的呢
可以看到他的生命周期和HomeFragment的生命周期是一样的的但是让我们再次回到HomeFragment中取看看会有什么变化
这个方法是干什么用的呢,其实是我们在代码中设置了Fragment的切换方式,我们用了Hindden和show方法来管理Fragment才会在每次切换Fragment的时候回调这个方法,以方便我们处理数据。当然如果你用Replace方法来管理Fragment的话它是不会回调这里的。不信你可以尝试一下。
附两张图
Service的生命周期
要说service 就必须先说一下它的几种启动方式
- 先来一张官方生命周期的图
- 第一种通过startService()方法开启的Service
不管开启他的Activity的实例是否存在,这个Service都会运行在后台,也就是说从StartService()方法调用之后起,这个Activity与Service就不存在关系了,除非,你在Activity中调用StopService()方法或者Service自身StopSelf。
- 第二种是通过bindService()方法,这里会调用Service的onCreate()方法,不管调用 bindService 调用几次,onCreate方法都只会调用一次,同时onStart方法始终不会被调用。只有调用unbindService()方法断开连接或者调用bindService()方法的Activity不存在了,系统将会自动停止Service。
- 第三种如果一个Service又被启动又被绑定,则该Service将会一直在后台运行。并且不管如何调用,onCreate始终只会调用一次,对应startService调用多少次,Service的onStart便会调用多少次。调用unbindService将不会停止Service,而必须调用 stopService 或 Service的 stopSelf 来停止服务。
BrocastCastReceiver的生命周期
receiver的注册方式有两种,一种是静态注册,一种是动态注册
静态注册的程序,无论该程序是否启动,当广播到来时都会接收,并处理。而动态注册的程序只有在程序运行时才会收到广播消息,程序不运行了,它就收不到了。
静态注册
<receiver android:name=".TestReceiver">
<intent-filter>
<action android:name="android.intent.action.TEST_RECEIVER"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
静态注册的Receiver是通过标签里的定义的name值来进行匹配的。
发广播的方式就是
Intent intent = new Intent("android.intent.action.TEST_RECEIVER");
intent.putExtra("msg", "hello receiver.");
sendBroadcast(intent);
来发送广播的动态注册
TestReceiver receiver = new TestReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.TEST_RECEIVER");
registerReceiver(receiver, filter);
ContentProvider 的使用
ContentProvider 在开发中使用的频率是最少的,一般很少接触到,但还是需要了解一下的。它是为了给不同应用提供内容访问,也就是多进程通信中会使用到
ContentProvider 封装了数据的跨进程传输,我们可以使用 getContentResolver() 拿到 ContentResolver 进行增删改查。