#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);