Receiver.java 2.63 KB
package com.polysoft.nafmii.broadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;

import androidx.localbroadcastmanager.content.LocalBroadcastManager;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public abstract class Receiver<T> extends BroadcastReceiver {

    private static final Map<String, Receiver> registerMap = new HashMap<>();

    protected final Context context;
    protected final Map<String, ReceiverListener<T>> listenerMap = new HashMap<>();
    private final String KEY_DEFAULT_LISTENER = "DEFAULT_LISTENER";


    protected Receiver(Context context) {
        this.context = context;
    }

    protected static <T> Receiver<T> getReceiver(Class<? extends Receiver> receiver) {
        return registerMap.get(receiver.getName());
    }

    protected static void onSendBroadcast(Context context, Intent intent) {
        LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
    }

    protected abstract String[] getActions();

    protected abstract T onReceiverData(String action, Intent intent);

    public void register() {
        if (null != getReceiver(this.getClass())) {
            return;
        }
        IntentFilter filter = new IntentFilter();
        String[] actions = this.getActions();
        for (int i = 0; i < actions.length; i++) {
            filter.addAction(actions[i]);
        }
        LocalBroadcastManager.getInstance(this.context).registerReceiver(this, filter);

        registerMap.put(this.getClass().getName(), this);
    }

    public void unregister() {
        this.listenerMap.clear();
        if (null == getReceiver(this.getClass())) {
            return;
        }
        registerMap.remove(this.getClass().getName());
        LocalBroadcastManager.getInstance(this.context).unregisterReceiver(this);
    }

    public void addDefaultListener(ReceiverListener<T> listener) {
        this.addListener(KEY_DEFAULT_LISTENER, listener);
    }

    public void addListener(String key, ReceiverListener<T> listener) {
        this.listenerMap.put(key, listener);
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        T data = this.onReceiverData(action, intent);
        Iterator<String> iterator = this.listenerMap.keySet().iterator();
        while (iterator.hasNext()) {
            ReceiverListener<T> listener = this.listenerMap.get(iterator.next());
            // 同步判断
            if (null != listener) {
                listener.onReceiverResult(action, data);
            }
        }
    }
}