Android 四大组件基本理论讲解

1. Activity

1. Activity是什么?

Activity是一个Android应用程序组件(也称为Android四大组件之一),它提供了一个屏幕,用户可以通过该屏幕进行交互以执行某些操作,例如拨打电话,拍照,发送电子邮件或查看地图。每个活动都有一个窗口,用于绘制其用户界面。窗口通常填满屏幕,但可能比屏幕小,并漂浮在其他窗口的顶部.

2. Activity是生命周期方法

正常情况下,Activity的常用生命周期就只有如下7个:

  • onCreate():表示Activity正在被创建,常用来初始化工作,比如调用setContentView加载界面布局资源,初始化Activity所需数据等;
  • onRestart():表示Activity正在重新启动,一般情况下,当前Acitivty从不可见重新变为可见时,OnRestart就会被调用;
  • onStart():表示Activity正在被启动,此时Activity可见但不在前台,还处于后台,无法与用户交互;
  • onResume():表示Activity获得焦点,此时Activity可见且在前台并开始活动,这是与onStart的区别所在;
  • onPause():表示Activity正在停止,此时可做一些存储数据、停止动画等工作,但是不能太耗时,因为这会影响到新Activity的显示,onPause必须先执行完,新Activity的onResume才会执行;
  • onStop():表示Activity即将停止,可以做一些稍微重量级的回收工作,比如注销广播接收器、关闭网络连接等,同样不能太耗时;
  • onDestroy():表示Activity即将被销毁,这是Activity生命周期中的最后一个回调,常做回收工作、资源释放;
public class MyActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);
        Log.e("MyActivity", "MyActivity_onCreate");
    }
    @Override
    protected void onRestart() {
        super.onRestart();
        Log.e("MyActivity", "MyActivity_onRestart");
    }
    @Override
    protected void onStart() {
        super.onStart();
        Log.e("MyActivity", "MyActivity_onStart");
    }
    @Override
    protected void onPause() {
        super.onPause();
        Log.e("MyActivity", "MyActivity_onPause");
    }
    @Override
    protected void onStop() {
        super.onStop();
        Log.e("MyActivity", "MyActivity_onStop");
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.e("MyActivity", "MyActivity_onDestroy");
    }
}

3. Activity的四种启动模式、应用场景

此处可查看我上篇博客:Activity的四种启动模式及应用场景



2. Service

       服务是一个后台运行的组件,执行连续运行且不需要用户交互的任务。甚至应用被销毁也依然可以工作。


1. Service的生命周期

  1. onCreate():如果service没被创建过,调用startService()后会执行onCreate()回调;如果service已处于运行中,调用startService()不会执行onCreate()方法。也就是说,onCreate()只会在第一次创建service时候调用,多次执行startService()不会重复调用onCreate(),此方法适合完成一些初始化工作;
  2. onStartComand():服务启动时调用,此方法适合完成一些数据加载工作,比如会在此处创建一个线程用于下载数据或播放音乐;
  3. onBind():服务被绑定时调用;
  4. onUnBind():服务被解绑时调用;
  5. onDestroy():服务停止时调用;

2. Service的两种启动方式?区别在哪?

  1. startService():通过这种方式调用startService,onCreate()只会被调用一次,多次调用startSercie会多次执行onStartCommand()和onStart()方法。如果外部没有调用stopService()或stopSelf()方法,service会一直运行。

  2. bindService():如果该服务之前还没创建,系统回调顺序为onCreate()→onBind()。如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法不会多次创建服务及绑定。如果调用者希望与正在绑定的服务解除绑定,可以调用unbindService()方法,回调顺序为onUnbind()→onDestroy();

20200827100221886.png


3. 如何保证Service不被杀死 ?

从三个层面入手:
A:提供进程优先级,降低进程被杀死的概率

  • 方法一:监控手机锁屏解锁事件,在屏幕锁屏时启动1个像素的 Activity,在用户解锁时将 Activity 销毁掉。
  • 方法二:启动前台service。
  • 方法三:提升service优先级:在AndroidManifest.xml文件中对于intent-filter可以通过
    android:priority = "1000"//这个属性设置最高优先级,1000是最高值,如果数字越小则优先级越低,同时适用于广播。

B:在进程被杀死后,进行拉活。

  • 方法一:注册高频率广播接收器,唤起进程。如网络变化,解锁屏幕,开机等
  • 方法二:双进程相互唤起。
  • 方法三:依靠系统唤起。
  • 方法四:onDestroy方法里重启service:service +broadcast 方式,就是当service走ondestory的时候,发送一个自定义的广播,当收到广播的时候,重新启动service;

C. 依靠第三方根据终端不同。

在小米手机(包括 MIUI)接入小米推送、华为手机接入华为推送;
其他手机可以考虑接入腾讯信鸽或极光推送与小米推送做 A/B Test。



3. Broadcast Receiver

在 Android 系统中,广播(Broadcast)是在组件之间传播数据的一种机制,这些组件可以位于不同的进程中,起到进程间通信的作用
BroadcastReceiver 是对发送出来的 Broadcast 进行过滤、接受和响应的组件。首先将要发送的消息和用于过滤的信息(Action,Category)装入一个 Intent 对象,然后通过调用 Context.sendBroadcast() 、 sendOrderBroadcast() 方法把 Intent 对象以广播形式发送出去。 广播发送出去后,所以已注册的 BroadcastReceiver 会检查注册时的 IntentFilter 是否与发送的 Intent 相匹配,若匹配则会调用 BroadcastReceiver 的 onReceiver() 方法






1. 广播有几种形式 ? 都有什么特点 ?

  1. 普通广播:开发者自身定义 intent的广播(最常用),所有的广播接收器几乎会在同一时刻接受到此广播信息,接受的先后顺序随机;

  2. 有序广播:发送出去的广播被广播接收者按照先后顺序接收,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递,且优先级(priority)高的广播接收器会先收到广播消息。有序广播可以被接收器截断使得后面的接收器无法收到它;

  3. 本地广播:仅在自己的应用内发送接收广播,也就是只有自己的应用能收到,数据更加安全,效率更高,但只能采用动态注册的方式;

  4. 粘性广播:这种广播会一直滞留,当有匹配该广播的接收器被注册后,该接收器就会收到此条广播;

2. 广播的两种注册方式 ?

2020082710300683.png




4. ContentProvider

ContentProvider是Android中提供的专门用于不同应用间数据交互和共享的组件。ContentProvider实际上是对SQLiteOpenHelper的进一步封装,以一个或多个表的形式将数据呈现给外部应用,通过Uri映射来选择需要操作数据库中的哪个表,并对表中的数据进行增删改查处理。
ContentProvider其底层使用了Binder来完成APP进程之间的通信,同时使用匿名共享内存来作为共享数据的载体。ContentProvider支持访问权限管理机制,以控制数据的访问者及访问方式,保证数据访问的安全性。

1. ContentProvider了解多少?

ContentProvider作为四大组件之一,其主要负责存储和共享数据。与文件存储、SharedPreferences存储、SQLite数据库存储这几种数据存储方法不同的是,后者保存下的数据只能被该应用程序使用,而前者可以让不同应用程序之间进行数据共享,它还可以选择只对哪一部分数据进行共享,从而保证程序中的隐私数据不会有泄漏风险。

2. 说说ContentProvider、ContentResolver、ContentObserver 之间的关系?

  • ContentProvider:管理数据,提供数据的增删改查操作,数据源可以是数据库、文件、XML、网络等,ContentProvider为这些数据的访问提供了统一的接口,可以用来做进程间数据共享。
  • ContentResolver:ContentResolver可以为不同URI操作不同的ContentProvider中的数据,外部进程可以通过ContentResolver与ContentProvider进行交互。
  • ContentObserver:观察ContentProvider中的数据变化,并将变化通知给外界。

你可能感兴趣的:(Android 四大组件基本理论讲解)