private Object proceed(final Object proxy, final Method method, final Object[] args) throws Throwable {
			final String method_name = method.getName(); final Intent intent; final int result;
			switch (method_name) {
			case "broadcastIntent":	// int broadcastIntent(IApplicationThread caller, Intent intent, String resolvedType, IIntentReceiver resultTo, int resultCode, String resultData, Bundle map, String/[23+] String[] requiredPermissions, [18+ int appOp], [23+ Bundle options], boolean serialized, boolean sticky, [16+ int userId]);
				result = mCondom.proceed(OutboundType.BROADCAST, (Intent) args[1], Integer.MIN_VALUE,
						() -> (Integer) CondomProcessActivityManager.super.invoke(proxy, method, args));
				final Object result_receiver = args[3];
				if (result != Integer.MIN_VALUE) return result;
				if (result_receiver == null) return 0/* ActivityManager.BROADCAST_SUCCESS */;
				// Invoke the result receiver as if the ordered broadcast has been sent to no one, if the broadcast is blocked by condom.
				final Method IIntentReceiver_performReceive = result_receiver.getClass().getMethod("performReceive", SDK_INT >= JELLY_BEAN_MR1
				// void performReceive(Intent intent, int resultCode, String data, Bundle extras, boolean ordered, boolean sticky, [17+ int sendingUser])
						? new Class[] { Intent.class, int.class, String.class, Bundle.class, boolean.class, boolean.class, int.class}
						: new Class[] { Intent.class, int.class, String.class, Bundle.class, boolean.class, boolean.class });
				IIntentReceiver_performReceive.invoke(result_receiver, SDK_INT >= JELLY_BEAN_MR1
						? new Object[] { args[1], args[4], args[5], args[6], args[args.length - 3], args[args.length - 2], args[args.length - 1] }
						: new Object[] { args[1], args[4], args[5], args[6], args[8], args[9] });
				return 0/* ActivityManager.BROADCAST_SUCCESS */;
			case "bindService":				// Android P-
			case "bindIsolatedService":		// Android Q+
				intent = (Intent) args[2];
				result = mCondom.proceed(OutboundType.BIND_SERVICE, intent, 0,
						() -> (Integer) CondomProcessActivityManager.super.invoke(proxy, method, args));	// Result: 0 - no match, >0 - succeed, <0 - SecurityException.
				if (result > 0) mCondom.logIfOutboundPass(FULL_TAG, intent, CondomCore.getTargetPackage(intent), CondomCore.CondomEvent.BIND_PASS);
				return result;
			case "startService":
				intent = (Intent) args[1];
				final ComponentName component = mCondom.proceed(OutboundType.START_SERVICE, intent, null,
						() -> (ComponentName) CondomProcessActivityManager.super.invoke(proxy, method, args));
				if (component != null) mCondom.logIfOutboundPass(FULL_TAG, intent, component.getPackageName(), CondomCore.CondomEvent.START_PASS);
				return component;
			case "getContentProvider":		// (ApplicationThread, [Q+ String opPackageName], String authority, int userId, boolean stable)
				final String name = (String) args[SDK_INT >= Q ? 2 : 1];
				if (! mCondom.shouldAllowProvider(mCondom.mBase, name, PackageManager.MATCH_ALL))	// MATCH_ALL as special hint to ask the hooked IPackageManager.resolveContentProvider() to bypass.
					return null;	// Actually blocked by IPackageManager.resolveContentProvider() which is called in shouldAllowProvider() above.
				break;
			}
			return super.invoke(proxy, method, args);
		}
Install the condom protection for current process. This method should generally never be called in the main process of app.

<p>It is suggested to use {@link android.content.ContentProvider ContentProvider} with "android:process", to install it in specified process.
library/src/main/java/com/oasisfeng/condom/CondomProcess.java