【Android】四大组件归纳总结

随着学习持续更新

四大组件均可使用 android:process="name" 在Manifest中声明成独立进程

Activity

生命周期

4种启动模式

Android使用回退栈来管理Activity实例。当前显示的Activity在栈顶,当点击后退或返回时,栈顶的Activity出栈。

可以指定Activity的启动模式来避免重复创建同一Activity

在AndroidManifest.xml中声明Activity的启动模式


  • standard

    默认的启动模式,允许Activity被多次 实例化 ,一个任务栈中会有多个Activity实例

  • singleTop

    处于栈顶的Activity会被重用,若不在栈顶则会被重新创建。重用时会调用原来实例的 onNewIntent() 函数

  • singleTask(常用)

    一个任务栈只允许存在一个Activity实例,当 startActivity() 时,若该Activity在栈内,则会将该Activity上的所有Activity销毁,使该Activity处于栈顶,并调用 onNewIntent() 方法

  • singleInstance

    一个Activity在独立的任务中开启,保证在系统中只有一个实例,所有的 startActivity() 都会重用该实例,并回调 onNewIntent() 方法

两个Activity互相切换时的生命周期

A:onCreate->onStart->onResume

这是在A中启动B活动,生命周期如下:

A: onPause

B: onCreate->onStart->onResume

A: onStop

从B中返回A活动时

B: onPause

A: onRestart->onStart->onResume

B: onStop->onDestroy

Service

https://blog.csdn.net/javazejian/article/details/52709857

当程序进入后台运行时,所需要做的操作可以通过Service实现。

在任何位置调用 startService() 启动服务。

每个服务只存在一个实例,每次调用 startService() 时会回调 onStartCommand() ;只需要 调用一次 stopService()stopSelf() 函数,服务会被停止。

普通Service运行在UI线程,若需要执行耗时操作需要新开线程。

生命周期

  • onCreate()

  • onStartCommand(intent, flags, startId)

    有三种返回值

    onStartCommand()
    onStartCommand()
    
  • onDestroy()

    调用 stopService()stopSelf()

IntentService

重写 onHandleIntent() 函数,在函数中完成耗时操作。IntentService会自动将操作执行在子线程中,并在完成时调用 stopSelf() 自我销毁

public class MyIntentService extends IntentService {
    @Override
    protected void onHandleIntent(Intent intent) {
        ...
    }
}

Binder(与服务连接)

当服务仅限本地应用使用,不需要跨进程工作,则可以实现自有的Binder类,让客户端通过该类直接访问服务中的公共方法。

首先需要创建ServiceConnection对象,代表与服务的连接,有两个方法

  • onServiceConnected(name, serivce)

    系统会调用该方法传递服务的 onBind() 方法返回的IBinder, 通过该对象可以调用获取到Service的实例对象,进而调用服务端的公共方法。

  • onServiceDisconnected(name)

    系统与服务意外中断时调用,unBind不会调用该方法

调用 bindService(intent, ServiceConnection, flag) 绑定相关服务,flag指绑定时是否自动创建Service,0表示不创建;BIND_AUTO_CREATE表示自动创建。

调用 unbindService(ServiceConnection)

当最后一个客户端与服务取消绑定时,系统会将服务销毁

前台服务

  • startForeground(int id, Notification notification)

    将当前服务设成前台服务,id参数为唯一标识通知的整型数,不得为0

  • stopForeground(boolean removeNotification)

Android8.0后需要开启前台服务要在Activity中 startForegroundService(i) ,且之后Service要在5s内调用 startForeground() 才能成功创建前台服务

如何保证Service不被杀死

  • 内存资源不足

    onStartCommand()
    
  • 用户手动干预

    如果不是force stop则会调用生命周期中的 onDestroy() 方法,可以在方法中发送广播重启服务。完备一些的话就启动两个服务,相互监听,相互重启。

Broadcast

https://www.jianshu.com/p/ca3d87a4cdf3

组成:发送广播的Broadcast,接受广播的BroadcastReceiver和传递消息的Intent。

类型:普通广播、有序广播、本地广播(LocalBroadcast)、Sticky广播

静态广播与动态广播

广播可分为静态注册和动态注册两种形式

  • 静态注册

    在Manifest.xml中声明静态广播

        
            <action android:name="com.broadcast"
        
    
  • 动态注册

    可以在 onCreate 的时候注册

    MyBroadcastReceiver receiver = new MyBroadcastReceiver();
    IntentFilter filter = new IntentFilter("my.action");
    context.registerReceiver(receiver, filter);

    onDestroy 的时候注销

    unregisterReceiver(receiver);
  • 静态广播与动态广播的区别

    1. 静态广播在activity注销的时候也能够继续接收;动态广播在APP退出后就无法接收了
    2. 动态广播在相同Priority下优先级比静态广播高

普通广播

异步广播,调用 sendBroadcast(new Intent(ACTION)) 来发出广播

定义广播接收器

public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        ...
    }
}

在AndroidManifest.xml中注册:

    
        
    

动态注册接收器:

registerReceiver(new MyBroadcastReceiver(), new IntentFilter(MY_ACTION));

有序广播

发送出去的广播被广播的接收者按照先后顺序接收

接收的顺序排序

  • 按照Priority属性值从大到小
  • Priority相同则动态注册广播优先

本地广播

只限于应用的广播

使用 LocalBroadcastManager.getInstance(context) 来使用关于广播的操作函数:

registerReceiver(receiver, intentFilter)
unregisterReceiver(receiver)
sendBroadcast(new Intent(INTENT_NAME))
sendBroadcastSync(new Intent())

注册本地广播

mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);
mReceiver = new MyBroadcastReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(ACTION_MY_TYPE);
mLocalBroadcastManager.registerReceiver(mReceiver,filter);

需要在 onDestory() 的中进行注销:

mLocalBroadcastManager.unregisterReceiver(mReceiver)

ContentProvider

ContentProvider可以将应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider对应用中的数据进行增删改查。

也可以进行进程间数据的交互和共享,跨进程通信。