Android 四大组件

本文深入解析了Android开发中的四大核心组件:Activity、Service、BroadcastReceiver和ContentProvider的功能、生命周期及使用场景。涵盖Activity的四种启动模式,Service的启动与生命周期管理,BroadcastReceiver的注册与广播发送,以及ContentProvider的数据共享机制。

参考: Android 四大组件.

1、Activity(View)

注:向用户展示界面,并且和用户进行交互的界面,用户进行触摸,点击等操作

(一)生命周期:

(1)Activity启动时生命周期
在这里插入图片描述
(2)Activity进行切换的生命周期
在这里插入图片描述
(3)点击Back键返回的生命周期
在这里插入图片描述

(二)启动模式:

注:activity有四种启动模式如下:

(1)standard(标准模式)
注:遵循后进先出,先进后出的模式,最后进栈的先出栈,系统不会进行判断这个Activity是否存在于栈中,每次启动都会先创建一个实例,并处于栈顶位置。

在这里插入图片描述
(2)singleTop(栈顶复用模式)
注:当启动的Activity位于栈顶时,则不用创建新的实例;如果要启动的activity没有位于栈顶时,则重新创建一个新的实例。
在这里插入图片描述
(3)singleTask(栈内复用模式)
注:在应用程序中有且只有一个实例,每次启动时都会检查栈中是否存在该Activity实例,如果已经存在则直接使用实例,并将当前activity之上的所有Activity出栈,如果没有发现则创建一个新的实例。
在这里插入图片描述
(4)singleInstance(启动新的任务栈)
注:如果一个应用系统中都只有一个实例,会启动一个新的任务站不管从哪个任务栈中启动,只会创建一个Activity实例,并且会使用一个全新的的任务栈来装载该Activity。

两种情况如下:
1、如果要启动的activity不存在,系统会创建一个新的任务栈,再创建该Activity实例,并把它加入到栈顶:如下图:
在这里插入图片描述
2、如果要启动的activity已经存在,无论位于哪个应用程序或者哪个任务栈中,系统都会把该activity所在的任务栈转到前台,从而显示该activity。

2、Service(服务)

(一)生命周期:

(1)直接开启startService()开启,使用stopService()关闭
在这里插入图片描述
注:start启动的服务,调用者退出后service仍然存在,start和stop只能开启和关闭服务,无法操作service

(2)绑定开启bindService(),使用unbindService()解绑,绑定开启,解绑结束
在这里插入图片描述
注:bind开启的服务,bind和unbind可以操作service,调用者退出后随调用者销毁。

(二)启动服务:

注:若一个startService()启动多次,则oncreat()只调用一次

(1)四个手动调用方法
在这里插入图片描述
(2)五个自动调用方法
在这里插入图片描述
注:整个生命周器内,只有startCommand()能被多次调用,其他方法只能调用一次(只能绑定和解绑一次)

绑定后没有解绑,无法使用stopService()停止

若已onCreate(),则startService()只调用startCommand()*若bindService()开启,则调用unbindService()时就会自动调用onDestory()销毁。

3、Broadcast Receiver(广播)

注:是一个全局的监听器,作用就是监听app并作出响应

(一)广播的概念:

系统在产生某个事件时发送广播,应用程序使用广播接收者接受这个广播,就知道系统产生了什么事件。

系统在运行中,会产生很多事件:开机,关机,打电话,发短信,电量改变等。

(二)广播的两种类型

(1)有序广播:
所有跟广播intent匹配的广播接收者都可以接收到广播,但是会按照广播接收者的优先级来决定接受者的先后顺序,优先级定义:-1000~1000

(2)无序广播:
所有跟广播intent匹配的广播接收者都可以接收到广播,没有先后顺序(同时收到)

(三)两种注册方式

(1)动态注册
注:需要在代码中动态指定广播地址并注册,通常在Activity和service中注册广播。但是在activity和service进行销毁的时候一定要进行解除注册,否则系统会报一个异常,故在onDestory()中进行解绑

封装广播类

public class BootBroadcastReceiver {
   private static BootBroadcastReceiver receiver=new BootBroadcastReceiver();
   public static BootBroadcastReceiver getInstance(){
        return receiver;
    }

    /** * 注册广播接收者
    * @param activity
    * @param broadcastReceiver
     * @param filter
     */
   	public void regiesterReceiver(Context activity, BroadcastReceiver broadcastReceiver, IntentFilter filter){
        if (broadcastReceiver!=null) {
            activity.registerReceiver(broadcastReceiver, filter);
        } 
    }
    
     /** * 注销广播接收者 */
   public void unregisterReceiver(Context activity,BroadcastReceiver broadcastReceiver){
       if (broadcastReceiver!=null) {
            activity.unregisterReceiver(broadcastReceiver);
        } 
 	}

    /** * 发送广播 **/
    public void sendBroadCast(Context activity,Intent intent){
          activity.sendBroadcast(intent);     
     }
}

发送广播

/**发送广播*/
Intent intent = new Intent();
intent.putExtra("msg",content);
intent.setAction("webscoket_service");
BootBroadcastReceiver.getInstance().sendBroadCast(getActivity(),intent);
MyBroadCastReceiver.class(接收广播)
public class MyBroadCastReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
       String msg=intent.getStringExtra("msg");
       ToastUtils.show(msg);
    }
 }

Activity.class中:

/*** * 接收接收广播 */
MyBroadCastReceiver localReceiver;
private void broadcast(){
    try { localReceiver=new MyBroadCastReceiver();
       IntentFilter filter=new IntentFilter();
       filter.addAction("webscoket_service");
       BootBroadcastReceiver.getInstance().regiesterReceiver(getActivity(),localReceiver,filter);
   } catch (Exception e) { 
   		e.printStackTrace();
   }
}

@Override
protected void onDestroy() {
	//解除注册
   BootBroadcastReceiver.getInstance().unregisterReceiver(getActivity(), localReceiver) ;
	//注销广播接收者
    super.onDestroy();
}

(2)静态注册
注:在清单文件AndroidManifest.xml中进行配置,这种方式的注册时常驻的,当应用关闭后,只要有广播发出,就可以接收到。

AndroidManifest.xml
在这里插入图片描述
Activity.class中:

Intent intent=new Intent("android.intent.action.MY_STATIC_BROADCAST");
intent.putExtra("msg","hello sttaic receiver");
sendBroadcast(intent);

MyBroadCastReceiver.class

// 接受广播
public class MyBroadCastReceiver extends BroadcastReceiver{
   @Override
    public void onReceive(Context context, Intent intent) {
       	String msg=intent.getStringExtra("msg");
       	ToastUtils.show(msg);
   }
}

(四)生命周期(动态注册)

方法描述registerReceiver(broadcastReceiver)注册广播unregisterReceiver(broadcastReceiver)解绑广播sendBroadcast(intent)发送广播。
在这里插入图片描述

4、Content Provider(内容提供者)

注:封装数据的跨进程传输,使用getContentResolver()拿到ContentResolver进行增删改查contentProvider以一个或多个表(与在关系型数据库中的表类似)的形式将数据呈现给外部应用。行表示提供程序收集的某种数据类型的实例,行中的每个列表示为实例收集的每个数据。

(一)实现方法

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值