android系统广播有哪些呢,本文做一个整理。
Intent类里面有系统广播的名称的定义,系统广播都会有下面这样的注释
* This is a protected intent that can only be sent by the system.
有这样注释的广播的定义一共有52个,如下面所示:
public static final String ACTION_INSTALL_EPHEMERAL_PACKAGE
= "android.intent.action.INSTALL_EPHEMERAL_PACKAGE";
public static final String ACTION_RESOLVE_EPHEMERAL_PACKAGE
= "android.intent.action.RESOLVE_EPHEMERAL_PACKAGE";
public static final String ACTION_SCREEN_OFF = "android.intent.action.SCREEN_OFF";
public static final String ACTION_SCREEN_ON = "android.intent.action.SCREEN_ON";
public static final String ACTION_DREAMING_STOPPED = "android.intent.action.DREAMING_STOPPED";
public static final String ACTION_DREAMING_STARTED = "android.intent.action.DREAMING_STARTED";
public static final String ACTION_USER_PRESENT = "android.intent.action.USER_PRESENT";
public static final String ACTION_TIME_TICK = "android.intent.action.TIME_TICK";
public static final String ACTION_TIMEZONE_CHANGED = "android.intent.action.TIMEZONE_CHANGED";
public static final String ACTION_LOCKED_BOOT_COMPLETED = "android.intent.action.LOCKED_BOOT_COMPLETED";
public static final String ACTION_BOOT_COMPLETED = "android.intent.action.BOOT_COMPLETED";
public static final String ACTION_PACKAGE_INSTALL = "android.intent.action.PACKAGE_INSTALL";
public static final String ACTION_PACKAGE_ADDED = "android.intent.action.PACKAGE_ADDED";
public static final String ACTION_PACKAGE_REPLACED = "android.intent.action.PACKAGE_REPLACED";
public static final String ACTION_MY_PACKAGE_REPLACED = "android.intent.action.MY_PACKAGE_REPLACED";
public static final String ACTION_PACKAGE_REMOVED = "android.intent.action.PACKAGE_REMOVED";
public static final String ACTION_PACKAGE_FULLY_REMOVED
= "android.intent.action.PACKAGE_FULLY_REMOVED";
public static final String ACTION_PACKAGE_CHANGED = "android.intent.action.PACKAGE_CHANGED";
public static final String ACTION_QUERY_PACKAGE_RESTART = "android.intent.action.QUERY_PACKAGE_RESTART";
public static final String ACTION_PACKAGE_RESTARTED = "android.intent.action.PACKAGE_RESTARTED";
public static final String ACTION_PACKAGE_DATA_CLEARED = "android.intent.action.PACKAGE_DATA_CLEARED";
public static final String ACTION_PACKAGES_SUSPENDED = "android.intent.action.PACKAGES_SUSPENDED";
public static final String ACTION_PACKAGES_UNSUSPENDED = "android.intent.action.PACKAGES_UNSUSPENDED";
public static final String ACTION_UID_REMOVED = "android.intent.action.UID_REMOVED";
public static final String ACTION_PACKAGE_FIRST_LAUNCH = "android.intent.action.PACKAGE_FIRST_LAUNCH";
public static final String ACTION_PACKAGE_NEEDS_VERIFICATION = "android.intent.action.PACKAGE_NEEDS_VERIFICATION";
public static final String ACTION_PACKAGE_VERIFIED = "android.intent.action.PACKAGE_VERIFIED";
public static final String ACTION_INTENT_FILTER_NEEDS_VERIFICATION = "android.intent.action.INTENT_FILTER_NEEDS_VERIFICATION";
public static final String ACTION_EXTERNAL_APPLICATIONS_AVAILABLE =
"android.intent.action.EXTERNAL_APPLICATIONS_AVAILABLE";
public static final String ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE =
"android.intent.action.EXTERNAL_APPLICATIONS_UNAVAILABLE";
public static final String ACTION_CONFIGURATION_CHANGED = "android.intent.action.CONFIGURATION_CHANGED";
public static final String ACTION_LOCALE_CHANGED = "android.intent.action.LOCALE_CHANGED";
public static final String ACTION_BATTERY_CHANGED = "android.intent.action.BATTERY_CHANGED";
public static final String ACTION_BATTERY_LOW = "android.intent.action.BATTERY_LOW";
public static final String ACTION_BATTERY_OKAY = "android.intent.action.BATTERY_OKAY";
public static final String ACTION_POWER_CONNECTED = "android.intent.action.ACTION_POWER_CONNECTED";
public static final String ACTION_POWER_DISCONNECTED =
"android.intent.action.ACTION_POWER_DISCONNECTED";
public static final String ACTION_SHUTDOWN = "android.intent.action.ACTION_SHUTDOWN";
public static final String ACTION_REQUEST_SHUTDOWN = "android.intent.action.ACTION_REQUEST_SHUTDOWN";
public static final String ACTION_DEVICE_STORAGE_LOW = "android.intent.action.DEVICE_STORAGE_LOW";
public static final String ACTION_DEVICE_STORAGE_OK = "android.intent.action.DEVICE_STORAGE_OK";
public static final String ACTION_DEVICE_STORAGE_FULL = "android.intent.action.DEVICE_STORAGE_FULL";
public static final String ACTION_DEVICE_STORAGE_NOT_FULL = "android.intent.action.DEVICE_STORAGE_NOT_FULL";
public static final String ACTION_AIRPLANE_MODE_CHANGED = "android.intent.action.AIRPLANE_MODE";
public static final String ACTION_ADVANCED_SETTINGS_CHANGED
= "android.intent.action.ADVANCED_SETTINGS";
public static final String ACTION_APPLICATION_RESTRICTIONS_CHANGED =
"android.intent.action.APPLICATION_RESTRICTIONS_CHANGED";
public static final String ACTION_NEW_OUTGOING_CALL =
"android.intent.action.NEW_OUTGOING_CALL";
public static final String ACTION_REBOOT =
"android.intent.action.REBOOT";
public static final String ACTION_IDLE_MAINTENANCE_START =
"android.intent.action.ACTION_IDLE_MAINTENANCE_START";
public static final String ACTION_IDLE_MAINTENANCE_END =
"android.intent.action.ACTION_IDLE_MAINTENANCE_END";
public static final String ACTION_MEDIA_RESOURCE_GRANTED =
"android.intent.action.MEDIA_RESOURCE_GRANTED";
public static final String ACTION_DYNAMIC_SENSOR_CHANGED =
"android.intent.action.DYNAMIC_SENSOR_CHANGED";
正如注释所描述的那样,这些系统广播只能由系统发出,第三方应用是无法发送系统广播的,第三方应用如果尝试发送系统广播,会报下面的错误:
java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.intent.action.BOOT_COMPLETED from pid=31204, uid=10076
at android.os.Parcel.readException(Parcel.java:1683)
at android.os.Parcel.readException(Parcel.java:1636)
at android.app.ActivityManagerProxy.broadcastIntent(ActivityManagerNative.java:3609)
at android.app.ContextImpl.sendBroadcast(ContextImpl.java:893)
at android.content.ContextWrapper.sendBroadcast(ContextWrapper.java:421)
该异常是由frameworks\base\services\core\java\com\android\server\am\ActivityManagerService.java的broadcastIntentLocked方法所发出的:
// First line security check before anything else: stop non-system apps from
// sending protected broadcasts.
if (!isCallerSystem) {
if (isProtectedBroadcast) {
String msg = "Permission Denial: not allowed to send broadcast "
+ action + " from pid="
+ callingPid + ", uid=" + callingUid;
Slog.w(TAG, msg);
throw new SecurityException(msg);
}
。。。。。。
}
其实Intent里面所列举的系统广播并不全,系统广播的声明其实是在AndroidManifest.xml里面,利用protected-broadcast标签来声明,如下面所示:
声明这些受保护的广播主要是下面这些AndroidManifest.xml文件:
framework\base\core\res\AndroidManifest.xml
packages\providers\telephonyprovider\AndroidManifest.xml
packages\services\telephony\AndroidManifest.xml
作为补充,下面五个系统广播是只能动态注册而不支持静态注册:
android.intent.action.SCREEN_ON
android.intent.action.SCREEN_OFF
android.intent.action.BATTERY_CHANGED
android.intent.action.CONFIGURATION_CHANGED
android.intent.action.TIME_TICK