package me.ele.amigo.utils.component;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.util.Log;
import java.util.ArrayList;
import java.util.List;
import me.ele.amigo.utils.ArrayUtil;
public class ReceiverFinder extends ComponentFinder {
private static final String TAG = ReceiverFinder.class.getSimpleName();
public static ActivityInfo[] getAppReceivers(Context context) {
try {
PackageManager pm = context.getPackageManager();
PackageInfo info = pm.getPackageInfo(context.getPackageName(), PackageManager
.GET_RECEIVERS);
return info.receivers;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return null;
}
public static void registerNewReceivers(Context context, ClassLoader classLoader) {
parsePackage(context);
ActivityInfo[] receiverInHost = getAppReceivers(context);
boolean findNew = false;
try {
for (int i = 0, size = sReceivers.size(); i < size; i++) {
Activity receiver = sReceivers.get(i);
List<IntentFilter> filters = receiver.filters;
if (filters == null
|| filters.isEmpty()
|| !isNewReceiver(receiverInHost, receiver)) {
continue;
}
registerOneReceiver(context, classLoader, receiver, filters);
findNew = true;
}
if (!findNew) {
Log.d(TAG, "registerNewReceivers: there is no any new receiver");
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
private static void registerOneReceiver(Context context, ClassLoader classLoader,
Activity receiver, List<IntentFilter> filters) throws
InstantiationException, IllegalAccessException, ClassNotFoundException {
BroadcastReceiver receiverInstance = (BroadcastReceiver) classLoader.loadClass
(receiver.activityInfo.name).newInstance();
for (IntentFilter filter : filters) {
context.registerReceiver(receiverInstance, filter);
registeredReceivers.add(receiverInstance);
}
Log.d(TAG, "registerOneReceiver: " + receiver.activityInfo);
}
private static boolean isNewReceiver(ActivityInfo[] receiverInHost, Activity patchReceiver) {
if (ArrayUtil.isNotEmpty(receiverInHost)) {
for (ActivityInfo activityInfo : receiverInHost) {
if (patchReceiver.activityInfo.name.equals(activityInfo.name)) {
return false;
}
}
}
return true;
}
private static final List<BroadcastReceiver> registeredReceivers = new ArrayList<>();
public static void unregisterNewReceivers(Context context) {
if (!registeredReceivers.isEmpty()) {
for (BroadcastReceiver registeredReceiver : registeredReceivers) {
context.unregisterReceiver(registeredReceiver);
}
registeredReceivers.clear();
}
}
}