Добавление неявного широковещательного исключения?

#android #android-intent #android-source #android-broadcast

#Android #android-намерение #android-исходный код #android-трансляция

Вопрос:

Я копался в коде AOSP и пытаюсь найти, где определены неявные широковещательные исключения. В конечном счете, я хотел бы понять, как разрешены определенные трансляции, и добавить дополнительную.

Я попытался выполнить grep-обработку некоторых исключенных трансляций в надежде найти их список, чтобы понять, как они исключены, но мне не повезло. Кто-нибудь может указать мне правильное направление? Спасибо.

Ответ №1:

Как показывает мой опыт работы с AOSP 9.0.0_r35, в исходном коде AOSP нет определения списка неявных широковещательных исключений.

По умолчанию трансляции не передаются в остановленные приложения. (пожалуйста, обратитесь к ActivityManagerService.java, функции file broadcastIntentLocked )

 final int broadcastIntentLocked(ProcessRecord callerApp,
            String callerPackage, Intent intent, String resolvedType,
            IIntentReceiver resultTo, int resultCode, String resultData,
            Bundle resultExtras, String[] requiredPermissions, int appOp, Bundle bOptions,
            boolean ordered, boolean sticky, int callingPid, int callingUid, int userId) {
        intent = new Intent(intent);
        
    ...
    // By default broadcasts do not go to stopped apps.
    intent.addFlags(Intent.FLAG_EXCLUDE_STOPPED_PACKAGES);
    ...
}
  

Для неявных широковещательных исключений AOSP вручную добавляет флаг Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND или Intent.FLAG_INCLUDE_STOPPED_PACKAGES везде, где отправляется широковещательное намерение. Эти флаги определены в Intent.java как показано ниже

 /**
 * If set, this intent will always match any components in packages that
 * are currently stopped.  This is the default behavior when
 * {@link #FLAG_EXCLUDE_STOPPED_PACKAGES} is not set.  If both of these
 * flags are set, this one wins (it allows overriding of exclude for
 * places where the framework may automatically set the exclude flag).
 */
public static final int FLAG_INCLUDE_STOPPED_PACKAGES = 0x00000020;

  /**
 * If set, the broadcast will always go to manifest receivers in background (cached
 * or not running) apps, regardless of whether that would be done by default.  By
 * default they will only receive broadcasts if the broadcast has specified an
 * explicit component or package name.
 *
 * NOTE: dumpstate uses this flag numerically, so when its value is changed
 * the broadcast code there must also be changed to match.
 *
 * @hide
 */
public static final int FLAG_RECEIVER_INCLUDE_BACKGROUND = 0x01000000;
  

Например ACTION_TIMEZONE_CHANGED , оно отправляется в AlarmManagerService.java

 Intent intent = new Intent(Intent.ACTION_TIMEZONE_CHANGED);
intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING
        | Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND
        | Intent.FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS);
intent.putExtra("time-zone", zone.getID());
getContext().sendBroadcastAsUser(intent, UserHandle.ALL);