- android/ 167个模块 (app/content/os/view/widget/graphics/media/hardware/net/telephony/provider等) - java/ 35个模块 (lang/io/util/net/nio/security/crypto/sql/beans/rmi/awt等) - javax/ 4个模块 (net/crypto/security/sql) - org/ 5个模块 (json/w3c_dom/xml_sax/xml_pull/apache_http) - dalvik/ 1个模块 (system) - ~3053个类/接口,方法签名完全对齐Android SDK - 桌面跨平台运行 (Windows/macOS/Linux) - 修复所有导入错误和Python关键字冲突
2064 lines
86 KiB
Python
2064 lines
86 KiB
Python
"""
|
|
Android content Intent 完整扩展组件 — Intent (完整版), PendingIntent,
|
|
IntentSender, IntentFilter (扩展), ShortcutInfo, ShortcutManager 等
|
|
包含所有标准 ACTION_*, CATEGORY_*, EXTRA_*, FLAG_*, URI_*, SCHEME_*, MIME_* 常量
|
|
方法签名完全对齐 Android SDK
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
import time
|
|
from typing import Any, Dict, List, Optional, Set, Tuple, Union
|
|
|
|
from .._core import Stub, AndroidOnlyError
|
|
from ..java.lang import RuntimeException
|
|
|
|
IllegalArgumentException = type("IllegalArgumentException", (RuntimeException,), {})
|
|
|
|
__all__ = [
|
|
"Intent", "PendingIntent", "IntentSender",
|
|
"IntentService",
|
|
"IntentFilter", "MatchingFlags", "ShortcutInfo",
|
|
"ShortcutManager",
|
|
]
|
|
|
|
|
|
# ═══════════════════════════════════════════════════════════════
|
|
# ACTION_* — 标准 Android Intent Action 常量
|
|
# ═══════════════════════════════════════════════════════════════
|
|
|
|
ACTION_MAIN = "android.intent.action.MAIN"
|
|
ACTION_VIEW = "android.intent.action.VIEW"
|
|
ACTION_ATTACH_DATA = "android.intent.action.ATTACH_DATA"
|
|
ACTION_EDIT = "android.intent.action.EDIT"
|
|
ACTION_PICK = "android.intent.action.PICK"
|
|
ACTION_CHOOSER = "android.intent.action.CHOOSER"
|
|
ACTION_GET_CONTENT = "android.intent.action.GET_CONTENT"
|
|
ACTION_DIAL = "android.intent.action.DIAL"
|
|
ACTION_CALL = "android.intent.action.CALL"
|
|
ACTION_CALL_BUTTON = "android.intent.action.CALL_BUTTON"
|
|
ACTION_SEND = "android.intent.action.SEND"
|
|
ACTION_SENDTO = "android.intent.action.SENDTO"
|
|
ACTION_SEND_MULTIPLE = "android.intent.action.SEND_MULTIPLE"
|
|
ACTION_ANSWER = "android.intent.action.ANSWER"
|
|
ACTION_INSERT = "android.intent.action.INSERT"
|
|
ACTION_DELETE = "android.intent.action.DELETE"
|
|
ACTION_RUN = "android.intent.action.RUN"
|
|
ACTION_SYNC = "android.intent.action.SYNC"
|
|
ACTION_PICK_ACTIVITY = "android.intent.action.PICK_ACTIVITY"
|
|
ACTION_SEARCH = "android.intent.action.SEARCH"
|
|
ACTION_WEB_SEARCH = "android.intent.action.WEB_SEARCH"
|
|
ACTION_FACTORY_TEST = "android.intent.action.FACTORY_TEST"
|
|
ACTION_TIME_TICK = "android.intent.action.TIME_TICK"
|
|
ACTION_TIME_CHANGED = "android.intent.action.TIME_SET"
|
|
ACTION_TIMEZONE_CHANGED = "android.intent.action.TIMEZONE_CHANGED"
|
|
ACTION_BOOT_COMPLETED = "android.intent.action.BOOT_COMPLETED"
|
|
ACTION_PACKAGE_ADDED = "android.intent.action.PACKAGE_ADDED"
|
|
ACTION_PACKAGE_REMOVED = "android.intent.action.PACKAGE_REMOVED"
|
|
ACTION_PACKAGE_REPLACED = "android.intent.action.PACKAGE_REPLACED"
|
|
ACTION_PACKAGE_CHANGED = "android.intent.action.PACKAGE_CHANGED"
|
|
ACTION_PACKAGE_RESTARTED = "android.intent.action.PACKAGE_RESTARTED"
|
|
ACTION_PACKAGE_DATA_CLEARED = "android.intent.action.PACKAGE_DATA_CLEARED"
|
|
ACTION_PACKAGE_FULLY_REMOVED = "android.intent.action.PACKAGE_FULLY_REMOVED"
|
|
ACTION_PACKAGE_FIRST_LAUNCH = "android.intent.action.PACKAGE_FIRST_LAUNCH"
|
|
ACTION_PACKAGE_NEEDS_VERIFICATION = "android.intent.action.PACKAGE_NEEDS_VERIFICATION"
|
|
ACTION_PACKAGE_VERIFIED = "android.intent.action.PACKAGE_VERIFIED"
|
|
ACTION_EXTERNAL_APPLICATIONS_AVAILABLE = "android.intent.action.EXTERNAL_APPLICATIONS_AVAILABLE"
|
|
ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE = "android.intent.action.EXTERNAL_APPLICATIONS_UNAVAILABLE"
|
|
ACTION_APPLICATION_PREFERENCES = "android.intent.action.APPLICATION_PREFERENCES"
|
|
ACTION_APPLICATION_LOCALE_CHANGED = "android.intent.action.APPLICATION_LOCALE_CHANGED"
|
|
ACTION_APPLICATION_GRANT_URI_PERMISSION = "android.intent.action.APPLICATION_GRANT_URI_PERMISSION"
|
|
ACTION_CONFIGURATION_CHANGED = "android.intent.action.CONFIGURATION_CHANGED"
|
|
ACTION_CAMERA_BUTTON = "android.intent.action.CAMERA_BUTTON"
|
|
ACTION_DATE_CHANGED = "android.intent.action.DATE_CHANGED"
|
|
ACTION_DOCK_EVENT = "android.intent.action.DOCK_EVENT"
|
|
ACTION_DREAMING_STARTED = "android.intent.action.DREAMING_STARTED"
|
|
ACTION_DREAMING_STOPPED = "android.intent.action.DREAMING_STOPPED"
|
|
ACTION_HEADSET_PLUG = "android.intent.action.HEADSET_PLUG"
|
|
ACTION_INPUT_METHOD_CHANGED = "android.intent.action.INPUT_METHOD_CHANGED"
|
|
ACTION_LOCALE_CHANGED = "android.intent.action.LOCALE_CHANGED"
|
|
ACTION_MANAGED_PROFILE_ADDED = "android.intent.action.MANAGED_PROFILE_ADDED"
|
|
ACTION_MANAGED_PROFILE_REMOVED = "android.intent.action.MANAGED_PROFILE_REMOVED"
|
|
ACTION_MANAGED_PROFILE_AVAILABLE = "android.intent.action.MANAGED_PROFILE_AVAILABLE"
|
|
ACTION_MANAGED_PROFILE_UNAVAILABLE = "android.intent.action.MANAGED_PROFILE_UNAVAILABLE"
|
|
ACTION_MANAGED_PROFILE_UNLOCKED = "android.intent.action.MANAGED_PROFILE_UNLOCKED"
|
|
ACTION_MEDIA_BUTTON = "android.intent.action.MEDIA_BUTTON"
|
|
ACTION_MEDIA_CHECKING = "android.intent.action.MEDIA_CHECKING"
|
|
ACTION_MEDIA_EJECT = "android.intent.action.MEDIA_EJECT"
|
|
ACTION_MEDIA_MOUNTED = "android.intent.action.MEDIA_MOUNTED"
|
|
ACTION_MEDIA_NOFS = "android.intent.action.MEDIA_NOFS"
|
|
ACTION_MEDIA_REMOVED = "android.intent.action.MEDIA_REMOVED"
|
|
ACTION_MEDIA_SCANNER_FINISHED = "android.intent.action.MEDIA_SCANNER_FINISHED"
|
|
ACTION_MEDIA_SCANNER_SCAN_FILE = "android.intent.action.MEDIA_SCANNER_SCAN_FILE"
|
|
ACTION_MEDIA_SCANNER_STARTED = "android.intent.action.MEDIA_SCANNER_STARTED"
|
|
ACTION_MEDIA_SHARED = "android.intent.action.MEDIA_SHARED"
|
|
ACTION_MEDIA_UNMOUNTABLE = "android.intent.action.MEDIA_UNMOUNTABLE"
|
|
ACTION_MEDIA_UNMOUNTED = "android.intent.action.MEDIA_UNMOUNTED"
|
|
ACTION_MEDIA_BAD_REMOVAL = "android.intent.action.MEDIA_BAD_REMOVAL"
|
|
ACTION_NEW_OUTGOING_CALL = "android.intent.action.NEW_OUTGOING_CALL"
|
|
ACTION_SCREEN_OFF = "android.intent.action.SCREEN_OFF"
|
|
ACTION_SCREEN_ON = "android.intent.action.SCREEN_ON"
|
|
ACTION_USER_PRESENT = "android.intent.action.USER_PRESENT"
|
|
ACTION_PROVIDER_CHANGED = "android.intent.action.PROVIDER_CHANGED"
|
|
ACTION_GTALK_SERVICE_CONNECTED = "android.intent.action.GTALK_CONNECTED"
|
|
ACTION_GTALK_SERVICE_DISCONNECTED = "android.intent.action.GTALK_DISCONNECTED"
|
|
ACTION_MY_PACKAGE_REPLACED = "android.intent.action.MY_PACKAGE_REPLACED"
|
|
ACTION_MY_PACKAGE_SUSPENDED = "android.intent.action.MY_PACKAGE_SUSPENDED"
|
|
ACTION_MY_PACKAGE_UNSUSPENDED = "android.intent.action.MY_PACKAGE_UNSUSPENDED"
|
|
ACTION_UMS_CONNECTED = "android.intent.action.UMS_CONNECTED"
|
|
ACTION_UMS_DISCONNECTED = "android.intent.action.UMS_DISCONNECTED"
|
|
ACTION_WALLPAPER_CHANGED = "android.intent.action.WALLPAPER_CHANGED"
|
|
ACTION_WIFI_SCAN_AVAILABLE = "android.intent.action.WIFI_SCAN_AVAILABLE"
|
|
ACTION_DEVICE_STORAGE_LOW = "android.intent.action.DEVICE_STORAGE_LOW"
|
|
ACTION_DEVICE_STORAGE_OK = "android.intent.action.DEVICE_STORAGE_OK"
|
|
ACTION_BATTERY_CHANGED = "android.intent.action.BATTERY_CHANGED"
|
|
ACTION_BATTERY_LOW = "android.intent.action.BATTERY_LOW"
|
|
ACTION_BATTERY_OKAY = "android.intent.action.BATTERY_OKAY"
|
|
ACTION_POWER_CONNECTED = "android.intent.action.ACTION_POWER_CONNECTED"
|
|
ACTION_POWER_DISCONNECTED = "android.intent.action.ACTION_POWER_DISCONNECTED"
|
|
ACTION_SHUTDOWN = "android.intent.action.ACTION_SHUTDOWN"
|
|
ACTION_REBOOT = "android.intent.action.REBOOT"
|
|
ACTION_AIRPLANE_MODE_CHANGED = "android.intent.action.AIRPLANE_MODE"
|
|
ACTION_NETWORK_SET_TIME = "android.intent.action.NETWORK_SET_TIME"
|
|
ACTION_NETWORK_SET_TIMEZONE = "android.intent.action.NETWORK_SET_TIMEZONE"
|
|
ACTION_SIM_STATE_CHANGED = "android.intent.action.SIM_STATE_CHANGED"
|
|
ACTION_SERVICE_STATE = "android.intent.action.SERVICE_STATE"
|
|
ACTION_SIGNAL_STRENGTH_CHANGED = "android.intent.action.SIG_STR"
|
|
ACTION_DATA_CONNECTION_STATE_CHANGED = "android.intent.action.DATA_CONNECTION_STATE_CHANGED"
|
|
ACTION_ANY_DATA_CONNECTION_STATE_CHANGED = "android.intent.action.ANY_DATA_STATE"
|
|
ACTION_DATA_ACTIVITY = "android.intent.action.DATA_ACTIVITY"
|
|
ACTION_DATA_STALL = "android.intent.action.DATA_STALL"
|
|
ACTION_PROXY_CHANGE = "android.intent.action.PROXY_CHANGE"
|
|
ACTION_WALLPAPER_SETTINGS = "android.intent.action.WALLPAPER_SETTINGS"
|
|
ACTION_HDMI_AUDIO_PLUG = "android.intent.action.HDMI_AUDIO_PLUG"
|
|
ACTION_OPEN_DOCUMENT = "android.intent.action.OPEN_DOCUMENT"
|
|
ACTION_CREATE_DOCUMENT = "android.intent.action.CREATE_DOCUMENT"
|
|
ACTION_OPEN_DOCUMENT_TREE = "android.intent.action.OPEN_DOCUMENT_TREE"
|
|
ACTION_VIEW_DOWNLOADS = "android.intent.action.VIEW_DOWNLOADS"
|
|
ACTION_DOCUMENT_SETTINGS = "android.intent.action.DOCUMENT_SETTINGS"
|
|
ACTION_QUICK_CLOCK = "android.intent.action.QUICK_CLOCK"
|
|
ACTION_INTENT_FILTER_NEEDS_VERIFICATION = "android.intent.action.INTENT_FILTER_NEEDS_VERIFICATION"
|
|
ACTION_MANAGED_ROAMING_INDICATION = "android.intent.action.MANAGED_ROAMING_INDICATION"
|
|
ACTION_VOICE_COMMAND = "android.intent.action.VOICE_COMMAND"
|
|
ACTION_ASSIST = "android.intent.action.ASSIST"
|
|
ACTION_QUICK_VIEW = "android.intent.action.QUICK_VIEW"
|
|
ACTION_CUSTOM_EVENT = "android.intent.action.CUSTOM_EVENT"
|
|
ACTION_GET_RESTRICTION_ENTRIES = "android.intent.action.GET_RESTRICTION_ENTRIES"
|
|
ACTION_SET_RESTRICTION = "android.intent.action.SET_RESTRICTION"
|
|
ACTION_DEFAULT = "android.intent.action.DEFAULT"
|
|
ACTION_CREATE_SHORTCUT = "android.intent.action.CREATE_SHORTCUT"
|
|
ACTION_INSTALL_SHORTCUT = "android.intent.action.INSTALL_SHORTCUT"
|
|
ACTION_UNINSTALL_SHORTCUT = "com.android.launcher.action.UNINSTALL_SHORTCUT"
|
|
ACTION_INSTALL_PACKAGE = "android.intent.action.INSTALL_PACKAGE"
|
|
ACTION_UNINSTALL_PACKAGE = "android.intent.action.UNINSTALL_PACKAGE"
|
|
ACTION_INSTALL_FAILURE = "android.intent.action.INSTALL_FAILURE"
|
|
ACTION_UNINSTALL_FAILURE = "android.intent.action.UNINSTALL_FAILURE"
|
|
ACTION_VIEW_SECURITY_POLICY = "android.intent.action.VIEW_SECURITY_POLICY"
|
|
ACTION_DEVICE_ADMIN_DISABLE_REQUESTED = "android.app.action.DEVICE_ADMIN_DISABLE_REQUESTED"
|
|
ACTION_DEVICE_ADMIN_DISABLED = "android.app.action.DEVICE_ADMIN_DISABLED"
|
|
ACTION_DEVICE_ADMIN_ENABLED = "android.app.action.DEVICE_ADMIN_ENABLED"
|
|
ACTION_LOCK_TASK_ENTERING = "android.intent.action.LOCK_TASK_ENTERING"
|
|
ACTION_LOCK_TASK_EXITING = "android.intent.action.LOCK_TASK_EXITING"
|
|
ACTION_MASTER_CLEAR = "android.intent.action.MASTER_CLEAR"
|
|
ACTION_FACTORY_RESET = "android.intent.action.FACTORY_RESET"
|
|
ACTION_GET_ACCOUNTS = "android.accounts.GET_ACCOUNTS"
|
|
ACTION_ADD_ACCOUNT = "android.settings.ADD_ACCOUNT_SETTINGS"
|
|
ACTION_SETTINGS = "android.settings.SETTINGS"
|
|
ACTION_WIFI_SETTINGS = "android.settings.WIFI_SETTINGS"
|
|
ACTION_WIFI_IP_SETTINGS = "android.settings.WIFI_IP_SETTINGS"
|
|
ACTION_BLUETOOTH_SETTINGS = "android.settings.BLUETOOTH_SETTINGS"
|
|
ACTION_NFC_SETTINGS = "android.settings.NFC_SETTINGS"
|
|
ACTION_NFCSHARING_SETTINGS = "android.settings.NFCSHARING_SETTINGS"
|
|
ACTION_SOUND_SETTINGS = "android.settings.SOUND_SETTINGS"
|
|
ACTION_DISPLAY_SETTINGS = "android.settings.DISPLAY_SETTINGS"
|
|
ACTION_SECURITY_SETTINGS = "android.settings.SECURITY_SETTINGS"
|
|
ACTION_LOCATION_SOURCE_SETTINGS = "android.settings.LOCATION_SOURCE_SETTINGS"
|
|
ACTION_NETWORK_OPERATOR_SETTINGS = "android.settings.NETWORK_OPERATOR_SETTINGS"
|
|
ACTION_DATA_ROAMING_SETTINGS = "android.settings.DATA_ROAMING_SETTINGS"
|
|
ACTION_INTERNAL_STORAGE_SETTINGS = "android.settings.INTERNAL_STORAGE_SETTINGS"
|
|
ACTION_MEMORY_CARD_SETTINGS = "android.settings.MEMORY_CARD_SETTINGS"
|
|
ACTION_APP_NOTIFICATION_SETTINGS = "android.settings.APP_NOTIFICATION_SETTINGS"
|
|
ACTION_APPLICATION_DETAILS_SETTINGS = "android.settings.APPLICATION_DETAILS_SETTINGS"
|
|
ACTION_APPLICATION_DEVELOPMENT_SETTINGS = "android.settings.APPLICATION_DEVELOPMENT_SETTINGS"
|
|
ACTION_APPLICATION_SETTINGS = "android.settings.APPLICATION_SETTINGS"
|
|
ACTION_MANAGE_ALL_APPLICATIONS_SETTINGS = "android.settings.MANAGE_ALL_APPLICATIONS_SETTINGS"
|
|
ACTION_MANAGE_APPLICATIONS_SETTINGS = "android.settings.MANAGE_APPLICATIONS_SETTINGS"
|
|
ACTION_SYNC_SETTINGS = "android.settings.SYNC_SETTINGS"
|
|
ACTION_ADD_ACCOUNT_SETTINGS = "android.settings.ADD_ACCOUNT_SETTINGS"
|
|
ACTION_AIRPLANE_MODE_SETTINGS = "android.settings.AIRPLANE_MODE_SETTINGS"
|
|
ACTION_APN_SETTINGS = "android.settings.APN_SETTINGS"
|
|
ACTION_APPLICATION_SETTINGS_SHORT = "android.settings.APPLICATION_SETTINGS"
|
|
ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS = "android.settings.IGNORE_BATTERY_OPTIMIZATION_SETTINGS"
|
|
ACTION_MANAGE_DEFAULT_APPS_SETTINGS = "android.settings.MANAGE_DEFAULT_APPS_SETTINGS"
|
|
ACTION_MANAGE_OVERLAY_PERMISSION = "android.settings.action.MANAGE_OVERLAY_PERMISSION"
|
|
ACTION_MANAGE_WRITE_SETTINGS = "android.settings.action.MANAGE_WRITE_SETTINGS"
|
|
ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS = "android.settings.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"
|
|
ACTION_PRIVACY_SETTINGS = "android.settings.PRIVACY_SETTINGS"
|
|
ACTION_USAGE_ACCESS_SETTINGS = "android.settings.USAGE_ACCESS_SETTINGS"
|
|
ACTION_VR_LISTENER_SETTINGS = "android.settings.VR_LISTENER_SETTINGS"
|
|
ACTION_VPN_SETTINGS = "android.settings.VPN_SETTINGS"
|
|
ACTION_WIRELESS_SETTINGS = "android.settings.WIRELESS_SETTINGS"
|
|
ACTION_WIFI_ADD_NETWORKS = "android.settings.WIFI_ADD_NETWORKS"
|
|
ACTION_NOTIFICATION_LISTENER_SETTINGS = "android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"
|
|
ACTION_CAPTIONING_SETTINGS = "android.settings.CAPTIONING_SETTINGS"
|
|
ACTION_ACCESSIBILITY_SETTINGS = "android.settings.ACCESSIBILITY_SETTINGS"
|
|
ACTION_ACCOUNT_SYNC_SETTINGS = "android.settings.ACCOUNT_SYNC_SETTINGS"
|
|
ACTION_APP_OPEN_BY_DEFAULT_SETTINGS = "android.settings.APP_OPEN_BY_DEFAULT_SETTINGS"
|
|
ACTION_APP_LOCALE_SETTINGS = "android.settings.APP_LOCALE_SETTINGS"
|
|
ACTION_APPLICATION_SETTINGS_SYSTEM = "android.settings.APPLICATION_SETTINGS_SYSTEM"
|
|
ACTION_BATTERY_SAVER_SETTINGS = "android.settings.BATTERY_SAVER_SETTINGS"
|
|
ACTION_BIOMETRIC_ENROLL = "android.settings.BIOMETRIC_ENROLL"
|
|
ACTION_BLUETOOTH_SCAN_SETTINGS = "android.settings.BLUETOOTH_SCAN_SETTINGS"
|
|
ACTION_CAST_SETTINGS = "android.settings.CAST_SETTINGS"
|
|
ACTION_CHANNEL_NOTIFICATION_SETTINGS = "android.settings.CHANNEL_NOTIFICATION_SETTINGS"
|
|
ACTION_CONDITION_PROVIDER_SETTINGS = "android.settings.CONDITION_PROVIDER_SETTINGS"
|
|
ACTION_DATA_USAGE_SETTINGS = "android.settings.DATA_USAGE_SETTINGS"
|
|
ACTION_DATE_SETTINGS = "android.settings.DATE_SETTINGS"
|
|
ACTION_DEVICE_INFO_SETTINGS = "android.settings.DEVICE_INFO_SETTINGS"
|
|
ACTION_DREAM_SETTINGS = "android.settings.DREAM_SETTINGS"
|
|
ACTION_END_KEY_LONG_PRESS = "android.settings.END_KEY_LONG_PRESS"
|
|
ACTION_FINGERPRINT_ENROLL = "android.settings.FINGERPRINT_ENROLL"
|
|
ACTION_FINGERPRINT_SETTINGS = "android.settings.FINGERPRINT_SETTINGS"
|
|
ACTION_HARD_KEY_ASSIST = "android.settings.HARD_KEY_ASSIST"
|
|
ACTION_HOME_SETTINGS = "android.settings.HOME_SETTINGS"
|
|
ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS_SHORT = "android.settings.IGNORE_BATTERY_OPTIMIZATION_SETTINGS"
|
|
ACTION_INPUT_METHOD_SETTINGS = "android.settings.INPUT_METHOD_SETTINGS"
|
|
ACTION_INPUT_METHOD_SUBTYPE_SETTINGS = "android.settings.INPUT_METHOD_SUBTYPE_SETTINGS"
|
|
ACTION_INTERNAL_STORAGE_SETTINGS_SHORT = "android.settings.INTERNAL_STORAGE_SETTINGS"
|
|
ACTION_LOCALE_SETTINGS = "android.settings.LOCALE_SETTINGS"
|
|
ACTION_MANAGE_APPLICATIONS_SETTINGS_SHORT = "android.settings.MANAGE_APPLICATIONS_SETTINGS"
|
|
ACTION_MANAGE_SUPERVISOR_RESTRICTION = "android.settings.MANAGE_SUPERVISOR_RESTRICTION"
|
|
ACTION_MOBILE_DATA_SETTINGS = "android.settings.MOBILE_DATA_SETTINGS"
|
|
ACTION_PRINT_SETTINGS = "android.settings.PRINT_SETTINGS"
|
|
ACTION_PROCESS_WIFI_CREDENTIAL = "android.settings.PROCESS_WIFI_CREDENTIAL"
|
|
ACTION_QUICK_ACCESS_WALLET_SETTINGS = "android.settings.QUICK_ACCESS_WALLET_SETTINGS"
|
|
ACTION_QUICK_LAUNCH_SETTINGS = "android.settings.QUICK_LAUNCH_SETTINGS"
|
|
ACTION_SEARCH_SETTINGS = "android.settings.SEARCH_SETTINGS"
|
|
ACTION_STORAGE_VOLUME_ACCESS_SETTINGS = "android.settings.STORAGE_VOLUME_ACCESS_SETTINGS"
|
|
ACTION_SYSTEM_UPDATE_SETTINGS = "android.settings.SYSTEM_UPDATE_SETTINGS"
|
|
ACTION_TEST_SETTINGS = "android.settings.TEST_SETTINGS"
|
|
ACTION_TTS_SETTINGS = "android.settings.TTS_SETTINGS"
|
|
ACTION_USER_DICTIONARY_SETTINGS = "android.settings.USER_DICTIONARY_SETTINGS"
|
|
ACTION_VOICE_CONTROL_AIRPLANE_MODE = "android.settings.VOICE_CONTROL_AIRPLANE_MODE"
|
|
ACTION_VOICE_CONTROL_BATTERY_SAVER = "android.settings.VOICE_CONTROL_BATTERY_SAVER"
|
|
ACTION_VOICE_CONTROL_DO_NOT_DISTURB = "android.settings.VOICE_CONTROL_DO_NOT_DISTURB"
|
|
ACTION_VOICE_INPUT_SETTINGS = "android.settings.VOICE_INPUT_SETTINGS"
|
|
ACTION_WEBVIEW_SETTINGS = "android.settings.WEBVIEW_SETTINGS"
|
|
ACTION_WIFI_AP_SETTINGS = "android.settings.WIFI_AP_SETTINGS"
|
|
ACTION_WIFI_AP_SETTINGS_SHORT = "android.settings.WIFI_AP_SETTINGS"
|
|
ACTION_WIFI_SCAN_SETTINGS = "android.settings.WIFI_SCAN_SETTINGS"
|
|
ACTION_WIFI_SETUP = "android.settings.WIFI_SETUP"
|
|
ACTION_WIRELESS_SETTINGS_SHORT = "android.settings.WIRELESS_SETTINGS"
|
|
ACTION_ENTER_CAR_MODE = "android.intent.action.ENTER_CAR_MODE"
|
|
ACTION_EXIT_CAR_MODE = "android.intent.action.EXIT_CAR_MODE"
|
|
ACTION_CAR_MODE_SETTINGS = "android.settings.CAR_MODE_SETTINGS"
|
|
ACTION_CAR_DOCK_CONNECT = "android.intent.action.CAR_DOCK"
|
|
ACTION_DESK_DOCK_CONNECT = "android.intent.action.DESK_DOCK"
|
|
ACTION_LE_DESK_DOCK_CONNECT = "android.intent.action.LE_DESK_DOCK"
|
|
ACTION_HEADSET_PLUG_SHORT = "android.intent.action.HEADSET_PLUG"
|
|
ACTION_USB_ANLG_HEADSET_PLUG = "android.intent.action.USB_ANLG_HEADSET_PLUG"
|
|
ACTION_USB_DGTL_HEADSET_PLUG = "android.intent.action.USB_DGTL_HEADSET_PLUG"
|
|
ACTION_HTC_CONNECTOR_PLUG = "android.intent.action.HTC_CONNECTOR_PLUG"
|
|
ACTION_HTC_CONNECTOR_PLUG_SHORT = "android.intent.action.HTC_CONNECTOR_PLUG"
|
|
ACTION_NFC_DISCOVERED = "android.nfc.action.NDEF_DISCOVERED"
|
|
ACTION_TAG_FOUND = "android.nfc.action.TAG_FOUND"
|
|
ACTION_TECH_DISCOVERED = "android.nfc.action.TECH_DISCOVERED"
|
|
ACTION_TAB_CHANGED = "android.intent.action.TAB_CHANGED"
|
|
ACTION_TETHER_STATE_CHANGED = "android.net.wifi.WIFI_AP_STATE_CHANGED"
|
|
ACTION_TRANSACTION_DETECTED = "android.nfc.action.TRANSACTION_DETECTED"
|
|
ACTION_PHONE_STATE_CHANGED = "android.intent.action.PHONE_STATE"
|
|
ACTION_ACCOUNT_REMOVED = "android.accounts.action.ACCOUNT_REMOVED"
|
|
ACTION_ACCOUNT_VISIBLE = "android.accounts.action.ACCOUNT_VISIBLE"
|
|
ACTION_VOICEMAIL_SMS_RECEIVED = "android.intent.action.VOICEMAIL_SMS_RECEIVED"
|
|
ACTION_USER_ADDED = "android.intent.action.USER_ADDED"
|
|
ACTION_USER_REMOVED = "android.intent.action.USER_REMOVED"
|
|
ACTION_USER_SWITCHED = "android.intent.action.USER_SWITCHED"
|
|
ACTION_USER_STARTED = "android.intent.action.USER_STARTED"
|
|
ACTION_USER_STOPPED = "android.intent.action.USER_STOPPED"
|
|
ACTION_USER_BACKGROUND = "android.intent.action.USER_BACKGROUND"
|
|
ACTION_USER_FOREGROUND = "android.intent.action.USER_FOREGROUND"
|
|
ACTION_USER_INITIALIZE = "android.intent.action.USER_INITIALIZE"
|
|
ACTION_USER_UNLOCKED = "android.intent.action.USER_UNLOCKED"
|
|
ACTION_OVERLAY_CHANGED = "android.intent.action.OVERLAY_CHANGED"
|
|
ACTION_SYSTEM_TUTORIAL = "android.intent.action.SYSTEM_TUTORIAL"
|
|
ACTION_APP_ERROR = "android.intent.action.APP_ERROR"
|
|
ACTION_BUG_REPORT = "android.intent.action.BUG_REPORT"
|
|
ACTION_CLOSE_SYSTEM_DIALOGS = "android.intent.action.CLOSE_SYSTEM_DIALOGS"
|
|
ACTION_PREFERRED_ACTIVITY_CHANGED = "android.intent.action.PREFERRED_ACTIVITY_CHANGED"
|
|
ACTION_REBOOT_SHORT = "android.intent.action.REBOOT"
|
|
ACTION_SCREEN_ON_LATE = "android.intent.action.SCREEN_ON_LATE"
|
|
ACTION_SUBSCRIBER_FEATURES_CHANGED = "android.intent.action.SUBSCRIBER_FEATURES_CHANGED"
|
|
ACTION_SYSTEM_OVERLAY = "android.intent.action.SYSTEM_OVERLAY"
|
|
ACTION_UID_REMOVED = "android.intent.action.UID_REMOVED"
|
|
ACTION_CONTENT_CHANGED = "android.intent.action.CONTENT_CHANGED"
|
|
ACTION_DOWNLOAD_COMPLETE = "android.intent.action.DOWNLOAD_COMPLETE"
|
|
ACTION_DOWNLOAD_NOTIFICATION_CLICKED = "android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED"
|
|
ACTION_NOTIFICATION_CLICK = "android.intent.action.NOTIFICATION_CLICK"
|
|
ACTION_DELETE_SHORT = "android.intent.action.DELETE"
|
|
ACTION_INSERT_SHORT = "android.intent.action.INSERT"
|
|
ACTION_REBOOT_2 = "android.intent.action.REBOOT"
|
|
ACTION_PICK_ACTIVITY_SHORT = "android.intent.action.PICK_ACTIVITY"
|
|
ACTION_GET_CONTENT_SHORT = "android.intent.action.GET_CONTENT"
|
|
ACTION_SEND_SHORT = "android.intent.action.SEND"
|
|
ACTION_ANSWER_SHORT = "android.intent.action.ANSWER"
|
|
ACTION_INSERT_OR_EDIT = "android.intent.action.INSERT_OR_EDIT"
|
|
ACTION_PASTE = "android.intent.action.PASTE"
|
|
ACTION_CLOSE = "android.intent.action.CLOSE"
|
|
ACTION_SAVE = "android.intent.action.SAVE"
|
|
ACTION_UNDO = "android.intent.action.UNDO"
|
|
ACTION_REDO = "android.intent.action.REDO"
|
|
ACTION_CUT = "android.intent.action.CUT"
|
|
ACTION_COPY = "android.intent.action.COPY"
|
|
ACTION_PRINT = "android.intent.action.PRINT"
|
|
ACTION_PLAY = "android.intent.action.PLAY"
|
|
ACTION_PAUSE = "android.intent.action.PAUSE"
|
|
ACTION_STOP = "android.intent.action.STOP"
|
|
ACTION_NEXT = "android.intent.action.NEXT"
|
|
ACTION_PREVIOUS = "android.intent.action.PREVIOUS"
|
|
ACTION_FAST_FORWARD = "android.intent.action.FAST_FORWARD"
|
|
ACTION_REWIND = "android.intent.action.REWIND"
|
|
ACTION_PLAY_PAUSE = "android.intent.action.PLAY_PAUSE"
|
|
ACTION_MUTE = "android.intent.action.MUTE"
|
|
ACTION_VOLUME_UP = "android.intent.action.VOLUME_UP"
|
|
ACTION_VOLUME_DOWN = "android.intent.action.VOLUME_DOWN"
|
|
ACTION_INFO = "android.intent.action.INFO"
|
|
ACTION_REPLY = "android.intent.action.REPLY"
|
|
ACTION_FORWARD = "android.intent.action.FORWARD"
|
|
ACTION_COMPOSE = "android.intent.action.COMPOSE"
|
|
ACTION_REFRESH = "android.intent.action.REFRESH"
|
|
ACTION_SEARCH_LONG_PRESS = "android.intent.action.SEARCH_LONG_PRESS"
|
|
ACTION_MUSIC_PLAYER = "android.intent.action.MUSIC_PLAYER"
|
|
ACTION_ALARM_CHANGED = "android.intent.action.ALARM_CHANGED"
|
|
ACTION_NEXT_ALARM_SET = "android.intent.action.NEXT_ALARM_SET"
|
|
|
|
ACTION_ALL_APPS = "android.intent.action.ALL_APPS"
|
|
ACTION_BOOKMARK = "android.intent.action.BOOKMARK"
|
|
ACTION_CHROME_ICON = "android.intent.action.CHROME_ICON"
|
|
ACTION_ERROR = "android.intent.action.ERROR"
|
|
ACTION_GADGET = "android.intent.action.GADGET"
|
|
ACTION_GOOGLE = "android.intent.action.GOOGLE"
|
|
ACTION_HOTWORD = "android.intent.action.HOTWORD"
|
|
ACTION_ICON = "android.intent.action.ICON"
|
|
ACTION_LAUNCH = "android.intent.action.LAUNCH"
|
|
ACTION_MANAGE_PACKAGE_STORAGE = "android.intent.action.MANAGE_PACKAGE_STORAGE"
|
|
ACTION_MEDIA_PLAY_FROM_SEARCH = "android.intent.action.MEDIA_PLAY_FROM_SEARCH"
|
|
ACTION_MEDIA_PAUSED = "android.intent.action.MEDIA_PAUSED"
|
|
ACTION_MEDIA_PLAYING = "android.intent.action.MEDIA_PLAYING"
|
|
ACTION_MEDIA_UNPAUSED = "android.intent.action.MEDIA_UNPAUSED"
|
|
ACTION_NAVIGATE = "android.intent.action.NAVIGATE"
|
|
ACTION_NEW_APPLICATION = "android.intent.action.NEW_APPLICATION"
|
|
ACTION_NO_DOWNLOAD = "android.intent.action.NO_DOWNLOAD"
|
|
ACTION_NO_INSTALL = "android.intent.action.NO_INSTALL"
|
|
ACTION_PACKAGE_INSTALL = "android.intent.action.PACKAGE_INSTALL"
|
|
ACTION_RADIO = "android.intent.action.RADIO"
|
|
ACTION_RECORD = "android.intent.action.RECORD"
|
|
ACTION_REMEMBER = "android.intent.action.REMEMBER"
|
|
ACTION_RINGER_MODE_CHANGED = "android.media.RINGER_MODE_CHANGED"
|
|
ACTION_SEND_REPORT = "android.intent.action.SEND_REPORT"
|
|
ACTION_SET_WALLPAPER = "android.intent.action.SET_WALLPAPER"
|
|
ACTION_SHOW_ALARM = "android.intent.action.SHOW_ALARM"
|
|
ACTION_SHORTCUT = "android.intent.action.SHORTCUT"
|
|
ACTION_START = "android.intent.action.START"
|
|
ACTION_STATISTICS = "android.intent.action.STATISTICS"
|
|
ACTION_STOP_APPLICATION = "android.intent.action.STOP_APPLICATION"
|
|
ACTION_STOP_SERVICE = "android.intent.action.STOP_SERVICE"
|
|
ACTION_SYSTEM_DEVICE = "android.intent.action.SYSTEM_DEVICE"
|
|
ACTION_SYSTEM_UPDATE = "android.intent.action.SYSTEM_UPDATE"
|
|
ACTION_THEME = "android.intent.action.THEME"
|
|
ACTION_UNINSTALL = "android.intent.action.UNINSTALL"
|
|
ACTION_UNUSED = "android.intent.action.UNUSED"
|
|
ACTION_UPDATE = "android.intent.action.UPDATE"
|
|
ACTION_UPGRADE = "android.intent.action.UPGRADE"
|
|
ACTION_VERIFY = "android.intent.action.VERIFY"
|
|
ACTION_VIEW_APK = "android.intent.action.VIEW_APK"
|
|
ACTION_VIEW_CONTACTS = "android.intent.action.VIEW_CONTACTS"
|
|
ACTION_VIEW_URL = "android.intent.action.VIEW_URL"
|
|
ACTION_VOICE_RECOGNIZE = "android.intent.action.VOICE_RECOGNIZE"
|
|
ACTION_WEB_SEARCH_SHORT = "android.intent.action.WEB_SEARCH"
|
|
|
|
|
|
# ═══════════════════════════════════════════════════════════════
|
|
# CATEGORY_* — 标准 Intent Category 常量
|
|
# ═══════════════════════════════════════════════════════════════
|
|
|
|
CATEGORY_DEFAULT = "android.intent.category.DEFAULT"
|
|
CATEGORY_BROWSABLE = "android.intent.category.BROWSABLE"
|
|
CATEGORY_TAB = "android.intent.category.TAB"
|
|
CATEGORY_ALTERNATIVE = "android.intent.category.ALTERNATIVE"
|
|
CATEGORY_SELECTED_ALTERNATIVE = "android.intent.category.SELECTED_ALTERNATIVE"
|
|
CATEGORY_LAUNCHER = "android.intent.category.LAUNCHER"
|
|
CATEGORY_INFO = "android.intent.category.INFO"
|
|
CATEGORY_HOME = "android.intent.category.HOME"
|
|
CATEGORY_PREFERENCE = "android.intent.category.PREFERENCE"
|
|
CATEGORY_TEST = "android.intent.category.TEST"
|
|
CATEGORY_CAR_DOCK = "android.intent.category.CAR_DOCK"
|
|
CATEGORY_DESK_DOCK = "android.intent.category.DESK_DOCK"
|
|
CATEGORY_LE_DESK_DOCK = "android.intent.category.LE_DESK_DOCK"
|
|
CATEGORY_HE_DESK_DOCK = "android.intent.category.HE_DESK_DOCK"
|
|
CATEGORY_CAR_MODE = "android.intent.category.CAR_MODE"
|
|
CATEGORY_APP_MARKET = "android.intent.category.APP_MARKET"
|
|
CATEGORY_APP_BROWSER = "android.intent.category.APP_BROWSER"
|
|
CATEGORY_APP_CALCULATOR = "android.intent.category.APP_CALCULATOR"
|
|
CATEGORY_APP_CALENDAR = "android.intent.category.APP_CALENDAR"
|
|
CATEGORY_APP_CONTACTS = "android.intent.category.APP_CONTACTS"
|
|
CATEGORY_APP_EMAIL = "android.intent.category.APP_EMAIL"
|
|
CATEGORY_APP_GALLERY = "android.intent.category.APP_GALLERY"
|
|
CATEGORY_APP_MAPS = "android.intent.category.APP_MAPS"
|
|
CATEGORY_APP_MESSAGING = "android.intent.category.APP_MESSAGING"
|
|
CATEGORY_APP_MUSIC = "android.intent.category.APP_MUSIC"
|
|
CATEGORY_APP_FILES = "android.intent.category.APP_FILES"
|
|
CATEGORY_APP_CLOCK = "android.intent.category.APP_CLOCK"
|
|
CATEGORY_APP_SETTINGS = "android.intent.category.APP_SETTINGS"
|
|
CATEGORY_APP_WEATHER = "android.intent.category.APP_WEATHER"
|
|
CATEGORY_APP_VIDEO = "android.intent.category.APP_VIDEO"
|
|
CATEGORY_APP_CHAT = "android.intent.category.APP_CHAT"
|
|
CATEGORY_APP_GAME = "android.intent.category.APP_GAME"
|
|
CATEGORY_APP_FINANCE = "android.intent.category.APP_FINANCE"
|
|
CATEGORY_APP_NEWS = "android.intent.category.APP_NEWS"
|
|
CATEGORY_APP_SOCIAL = "android.intent.category.APP_SOCIAL"
|
|
CATEGORY_APP_PHOTOGRAPHY = "android.intent.category.APP_PHOTOGRAPHY"
|
|
CATEGORY_APP_PRODUCTIVITY = "android.intent.category.APP_PRODUCTIVITY"
|
|
CATEGORY_APP_TRAVEL = "android.intent.category.APP_TRAVEL"
|
|
CATEGORY_APP_WALLPAPER = "android.intent.category.APP_WALLPAPER"
|
|
CATEGORY_APP_RECENTS = "android.intent.category.APP_RECENTS"
|
|
CATEGORY_OPENABLE = "android.intent.category.OPENABLE"
|
|
CATEGORY_TYPED_OPENABLE = "android.intent.category.TYPED_OPENABLE"
|
|
CATEGORY_MONKEY = "android.intent.category.MONKEY"
|
|
CATEGORY_DEVELOPMENT_PREFERENCE = "android.intent.category.DEVELOPMENT_PREFERENCE"
|
|
CATEGORY_EMBED = "android.intent.category.EMBED"
|
|
CATEGORY_FRAMEWORK_INSTRUMENTATION_TEST = "android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST"
|
|
CATEGORY_MASTER_CLEAR = "android.intent.category.MASTER_CLEAR"
|
|
CATEGORY_UNIT_TEST = "android.intent.category.UNIT_TEST"
|
|
CATEGORY_SAMPLE_CODE = "android.intent.category.SAMPLE_CODE"
|
|
CATEGORY_ACCESSIBILITY = "android.intent.category.ACCESSIBILITY"
|
|
CATEGORY_VOICE = "android.intent.category.VOICE"
|
|
CATEGORY_NOTIFICATION_PREFERENCES = "android.intent.category.NOTIFICATION_PREFERENCES"
|
|
CATEGORY_SEARCH_RESULT = "android.intent.category.SEARCH_RESULT"
|
|
CATEGORY_LEANBACK_LAUNCHER = "android.intent.category.LEANBACK_LAUNCHER"
|
|
CATEGORY_LEANBACK_SETTINGS = "android.intent.category.LEANBACK_SETTINGS"
|
|
CATEGORY_LEANBACK_VIDEO = "android.intent.category.LEANBACK_VIDEO"
|
|
CATEGORY_LEANBACK_DOCUMENT = "android.intent.category.LEANBACK_DOCUMENT"
|
|
CATEGORY_LEANBACK_HOME = "android.intent.category.LEANBACK_HOME"
|
|
CATEGORY_LEANBACK_SEARCH = "android.intent.category.LEANBACK_SEARCH"
|
|
CATEGORY_SECONDARY_HOME = "android.intent.category.SECONDARY_HOME"
|
|
CATEGORY_PREFERENCE_SHORT = "android.intent.category.PREFERENCE"
|
|
CATEGORY_TEST_SHORT = "android.intent.category.TEST"
|
|
CATEGORY_DESK_DOCK_SHORT = "android.intent.category.DESK_DOCK"
|
|
CATEGORY_CAR_DOCK_SHORT = "android.intent.category.CAR_DOCK"
|
|
CATEGORY_LE_DESK_DOCK_SHORT = "android.intent.category.LE_DESK_DOCK"
|
|
|
|
|
|
# ═══════════════════════════════════════════════════════════════
|
|
# EXTRA_* — 标准 Intent Extra 常量
|
|
# ═══════════════════════════════════════════════════════════════
|
|
|
|
EXTRA_ALARM_COUNT = "android.intent.extra.ALARM_COUNT"
|
|
EXTRA_BUG_REPORT = "android.intent.extra.BUG_REPORT"
|
|
EXTRA_DATA_REMOVED = "android.intent.extra.DATA_REMOVED"
|
|
EXTRA_DOCK_STATE = "android.intent.extra.DOCK_STATE"
|
|
EXTRA_DOCK_STATE_HE_DESK = 4
|
|
EXTRA_DOCK_STATE_LE_DESK = 3
|
|
EXTRA_DOCK_STATE_CAR = 2
|
|
EXTRA_DOCK_STATE_DESK = 1
|
|
EXTRA_DOCK_STATE_UNDOCKED = 0
|
|
EXTRA_DONT_KILL_APP = "android.intent.extra.DONT_KILL_APP"
|
|
EXTRA_EMAIL = "android.intent.extra.EMAIL"
|
|
EXTRA_INITIAL_INTENTS = "android.intent.extra.INITIAL_INTENTS"
|
|
EXTRA_INTENT = "android.intent.extra.INTENT"
|
|
EXTRA_KEY_EVENT = "android.intent.extra.KEY_EVENT"
|
|
EXTRA_LOCAL_ONLY = "android.intent.extra.LOCAL_ONLY"
|
|
EXTRA_MIME_TYPES = "android.intent.extra.MIME_TYPES"
|
|
EXTRA_NOT_INITIALIZED = "android.intent.extra.NOT_INITIALIZED"
|
|
EXTRA_PACKAGES = "android.intent.extra.PACKAGES"
|
|
EXTRA_PHONE_NUMBER = "android.intent.extra.PHONE_NUMBER"
|
|
EXTRA_REFERRER = "android.intent.extra.REFERRER"
|
|
EXTRA_REFERRER_NAME = "android.intent.extra.REFERRER_NAME"
|
|
EXTRA_REMOTE_INTENT_TOKEN = "android.intent.extra.remote_intent_token"
|
|
EXTRA_REPLACING = "android.intent.extra.REPLACING"
|
|
EXTRA_SHORTCUT_ICON = "android.intent.extra.shortcut.ICON"
|
|
EXTRA_SHORTCUT_ICON_RESOURCE = "android.intent.extra.shortcut.ICON_RESOURCE"
|
|
EXTRA_SHORTCUT_INTENT = "android.intent.extra.shortcut.INTENT"
|
|
EXTRA_SHORTCUT_NAME = "android.intent.extra.shortcut.NAME"
|
|
EXTRA_SHUTDOWN_USERSPACE_ONLY = "android.intent.extra.SHUTDOWN_USERSPACE_ONLY"
|
|
EXTRA_STREAM = "android.intent.extra.STREAM"
|
|
EXTRA_SUBJECT = "android.intent.extra.SUBJECT"
|
|
EXTRA_TEMPLATE = "android.intent.extra.TEMPLATE"
|
|
EXTRA_TEXT = "android.intent.extra.TEXT"
|
|
EXTRA_TITLE = "android.intent.extra.TITLE"
|
|
EXTRA_UID = "android.intent.extra.UID"
|
|
EXTRA_USER = "android.intent.extra.USER"
|
|
EXTRA_USER_ID = "android.intent.extra.USER_ID"
|
|
EXTRA_USER_HANDLE = "android.intent.extra.USER_HANDLE"
|
|
EXTRA_ALLOW_MULTIPLE = "android.intent.extra.ALLOW_MULTIPLE"
|
|
EXTRA_HTML_TEXT = "android.intent.extra.HTML_TEXT"
|
|
EXTRA_CC = "android.intent.extra.CC"
|
|
EXTRA_BCC = "android.intent.extra.BCC"
|
|
EXTRA_FROM_STORAGE = "android.intent.extra.FROM_STORAGE"
|
|
EXTRA_INSTALLER_PACKAGE_NAME = "android.intent.extra.INSTALLER_PACKAGE_NAME"
|
|
EXTRA_NOTIFICATION_ID = "android.intent.extra.NOTIFICATION_ID"
|
|
EXTRA_NOTIFICATION_TAG = "android.intent.extra.NOTIFICATION_TAG"
|
|
EXTRA_CHANNEL_ID = "android.intent.extra.CHANNEL_ID"
|
|
EXTRA_CHANNEL_GROUP_ID = "android.intent.extra.CHANNEL_GROUP_ID"
|
|
EXTRA_CONVERSATION_ID = "android.intent.extra.CONVERSATION_ID"
|
|
EXTRA_IS_GROUP_CONVERSATION = "android.intent.extra.IS_GROUP_CONVERSATION"
|
|
EXTRA_MESSAGES = "android.intent.extra.MESSAGES"
|
|
EXTRA_PEOPLE = "android.intent.extra.PEOPLE"
|
|
EXTRA_SELF_DISPLAY_NAME = "android.intent.extra.SELF_DISPLAY_NAME"
|
|
EXTRA_TIME = "android.intent.extra.TIME"
|
|
EXTRA_SIZE = "android.intent.extra.SIZE"
|
|
EXTRA_COUNTRY = "android.intent.extra.COUNTRY"
|
|
EXTRA_LOCATION = "android.intent.extra.LOCATION"
|
|
EXTRA_LATITUDE = "android.intent.extra.LATITUDE"
|
|
EXTRA_LONGITUDE = "android.intent.extra.LONGITUDE"
|
|
EXTRA_ALTITUDE = "android.intent.extra.ALTITUDE"
|
|
EXTRA_BEARING = "android.intent.extra.BEARING"
|
|
EXTRA_SPEED = "android.intent.extra.SPEED"
|
|
EXTRA_ACCURACY = "android.intent.extra.ACCURACY"
|
|
EXTRA_POI_NAME = "android.intent.extra.POI_NAME"
|
|
EXTRA_PHONE_NUMBER_SHORT = "android.intent.extra.PHONE_NUMBER"
|
|
EXTRA_RINGER_MODE = "android.intent.extra.RINGER_MODE"
|
|
EXTRA_VIBRATE_SETTING = "android.intent.extra.VIBRATE_SETTING"
|
|
EXTRA_VOLUME_STREAM_TYPE = "android.intent.extra.VOLUME_STREAM_TYPE"
|
|
EXTRA_VOLUME_STREAM_VALUE = "android.intent.extra.VOLUME_STREAM_VALUE"
|
|
EXTRA_VOLUME_STREAM_VOLUME = "android.intent.extra.VOLUME_STREAM_VOLUME"
|
|
EXTRA_FORCE_MASTER_VOLUME_MUTE = "android.intent.extra.FORCE_MASTER_VOLUME_MUTE"
|
|
EXTRA_PREVIOUS_VOLUME_STREAM_VALUE = "android.intent.extra.PREVIOUS_VOLUME_STREAM_VALUE"
|
|
EXTRA_VIBRATE_TYPE = "android.intent.extra.VIBRATE_TYPE"
|
|
EXTRA_SCREEN_OFF_TIMEOUT = "android.intent.extra.SCREEN_OFF_TIMEOUT"
|
|
EXTRA_TASK_ID = "android.intent.extra.TASK_ID"
|
|
EXTRA_WINDOW_MINIMUM_SIZE_MAJOR = "android.intent.extra.WINDOW_MINIMUM_SIZE_MAJOR"
|
|
EXTRA_WINDOW_MINIMUM_SIZE_MINOR = "android.intent.extra.WINDOW_MINIMUM_SIZE_MINOR"
|
|
EXTRA_CHANGED_COMPONENT_NAME = "android.intent.extra.changed_component_name"
|
|
EXTRA_CHANGED_COMPONENT_NAME_LIST = "android.intent.extra.changed_component_name_list"
|
|
EXTRA_CHANGED_UID = "android.intent.extra.changed_uid"
|
|
EXTRA_DATA_REMOVED_SHORT = "android.intent.extra.DATA_REMOVED"
|
|
EXTRA_DOCK_STATE_SHORT = "android.intent.extra.DOCK_STATE"
|
|
EXTRA_REPLACING_SHORT = "android.intent.extra.REPLACING"
|
|
EXTRA_SERVICE_INFO = "android.intent.extra.SERVICE_INFO"
|
|
EXTRA_SERVICE_COMPONENT = "android.intent.extra.SERVICE_COMPONENT"
|
|
EXTRA_REQUEST_QUALITY = "android.intent.extra.REQUEST_QUALITY"
|
|
EXTRA_ORIGINATING_URI = "android.intent.extra.ORIGINATING_URI"
|
|
EXTRA_REFERRER_SHORT = "android.intent.extra.REFERRER"
|
|
EXTRA_ORIGINATING_UID = "android.intent.extra.ORIGINATING_UID"
|
|
EXTRA_CALLING_PACKAGE = "android.intent.extra.CALLING_PACKAGE"
|
|
EXTRA_CALLING_UID = "android.intent.extra.CALLING_UID"
|
|
EXTRA_CALLING_ACTIVITY = "android.intent.extra.CALLING_ACTIVITY"
|
|
EXTRA_LAUNCHER_INTENT = "android.intent.extra.LAUNCHER_INTENT"
|
|
EXTRA_WALLPAPER_OFFSET = "android.intent.extra.WALLPAPER_OFFSET"
|
|
EXTRA_WALLPAPER_ID = "android.intent.extra.WALLPAPER_ID"
|
|
EXTRA_CHOOSER_TARGETS = "android.intent.extra.CHOOSER_TARGETS"
|
|
EXTRA_CHOOSER_REFINEMENT_INTENT_SENDER = "android.intent.extra.CHOOSER_REFINEMENT_INTENT_SENDER"
|
|
EXTRA_RESULT_RECEIVER = "android.intent.extra.RESULT_RECEIVER"
|
|
EXTRA_ALARM_GROUP_ID = "android.intent.extra.ALARM_GROUP_ID"
|
|
EXTRA_DELAY = "android.intent.extra.DELAY"
|
|
EXTRA_HEADER = "android.intent.extra.HEADER"
|
|
EXTRA_PROTOCOL = "android.intent.extra.PROTOCOL"
|
|
EXTRA_FETCH_MODE = "android.intent.extra.FETCH_MODE"
|
|
EXTRA_ID = "android.intent.extra.ID"
|
|
EXTRA_NAME = "android.intent.extra.NAME"
|
|
EXTRA_QUERY = "android.intent.extra.QUERY"
|
|
EXTRA_DESCRIPTION = "android.intent.extra.DESCRIPTION"
|
|
EXTRA_ICON = "android.intent.extra.ICON"
|
|
EXTRA_COLOR = "android.intent.extra.COLOR"
|
|
EXTRA_ORIENTATION = "android.intent.extra.ORIENTATION"
|
|
EXTRA_PRIORITY = "android.intent.extra.PRIORITY"
|
|
EXTRA_STATE = "android.intent.extra.STATE"
|
|
EXTRA_STATUS = "android.intent.extra.STATUS"
|
|
EXTRA_TAG = "android.intent.extra.TAG"
|
|
EXTRA_TARGET = "android.intent.extra.TARGET"
|
|
EXTRA_TOKEN = "android.intent.extra.TOKEN"
|
|
EXTRA_VERSION = "android.intent.extra.VERSION"
|
|
EXTRA_URL = "android.intent.extra.URL"
|
|
EXTRA_REQUEST_ID = "android.intent.extra.REQUEST_ID"
|
|
EXTRA_RESPONSE_CODE = "android.intent.extra.RESPONSE_CODE"
|
|
EXTRA_RESPONSE_MESSAGE = "android.intent.extra.RESPONSE_MESSAGE"
|
|
EXTRA_AUTHENTICATOR_RESPONSE = "android.accounts.extra.AUTHENTICATOR_RESPONSE"
|
|
EXTRA_AUTHENTICATOR_ACCOUNT = "android.accounts.extra.AUTHENTICATOR_ACCOUNT"
|
|
EXTRA_AUTHENTICATOR_INTENT = "android.accounts.extra.AUTHENTICATOR_INTENT"
|
|
EXTRA_ACCOUNT_TYPE = "android.accounts.extra.ACCOUNT_TYPE"
|
|
EXTRA_ACCOUNT_LABEL = "android.accounts.extra.ACCOUNT_LABEL"
|
|
EXTRA_ACCOUNT_AUTH_TOKEN_LABEL = "android.accounts.extra.AUTH_TOKEN_LABEL"
|
|
EXTRA_PASSWORD = "android.accounts.extra.PASSWORD"
|
|
EXTRA_AUTH_TOKEN_TYPE = "android.accounts.extra.AUTH_TOKEN_TYPE"
|
|
EXTRA_CONFIRM_CREDENTIALS = "android.accounts.extra.CONFIRM_CREDENTIALS"
|
|
EXTRA_UPDATE_CURRENT_ACCOUNT = "android.accounts.extra.UPDATE_CURRENT_ACCOUNT"
|
|
EXTRA_ALLOW_ACCOUNT_REAUTH = "android.accounts.extra.ALLOW_ACCOUNT_REAUTH"
|
|
EXTRA_UNKNOWN_USER = "android.accounts.extra.UNKNOWN_USER"
|
|
|
|
|
|
# ═══════════════════════════════════════════════════════════════
|
|
# FLAG_* — Intent Flag 常量(Android SDK 实际数值)
|
|
# ═══════════════════════════════════════════════════════════════
|
|
|
|
FLAG_GRANT_READ_URI_PERMISSION = 0x00000001
|
|
FLAG_GRANT_WRITE_URI_PERMISSION = 0x00000002
|
|
FLAG_FROM_BACKGROUND = 0x00000004
|
|
FLAG_DEBUG_LOG_RESOLUTION = 0x00000008
|
|
FLAG_EXCLUDE_STOPPED_PACKAGES = 0x00000010
|
|
FLAG_INCLUDE_STOPPED_PACKAGES = 0x00000020
|
|
FLAG_GRANT_PERSISTABLE_URI_PERMISSION = 0x00000040
|
|
FLAG_GRANT_PREFIX_URI_PERMISSION = 0x00000080
|
|
FLAG_ACTIVITY_MATCH_EXTERNAL = 0x00001000
|
|
FLAG_ACTIVITY_NO_HISTORY = 0x40000000
|
|
FLAG_ACTIVITY_SINGLE_TOP = 0x20000000
|
|
FLAG_ACTIVITY_NEW_TASK = 0x10000000
|
|
FLAG_ACTIVITY_MULTIPLE_TASK = 0x08000000
|
|
FLAG_ACTIVITY_CLEAR_TOP = 0x04000000
|
|
FLAG_ACTIVITY_FORWARD_RESULT = 0x02000000
|
|
FLAG_ACTIVITY_PREVIOUS_IS_TOP = 0x01000000
|
|
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS = 0x00800000
|
|
FLAG_ACTIVITY_BROUGHT_TO_FRONT = 0x00400000
|
|
FLAG_ACTIVITY_RESET_TASK_IF_NEEDED = 0x00200000
|
|
FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY = 0x00100000
|
|
FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET = 0x00080000
|
|
FLAG_ACTIVITY_NEW_DOCUMENT = 0x00080000
|
|
FLAG_ACTIVITY_CLEAR_TASK = 0x00008000
|
|
FLAG_ACTIVITY_TASK_ON_HOME = 0x00004000
|
|
FLAG_ACTIVITY_RETAIN_IN_RECENTS = 0x00002000
|
|
FLAG_ACTIVITY_LAUNCH_ADJACENT = 0x00001000
|
|
FLAG_ACTIVITY_REORDER_TO_FRONT = 0x00020000
|
|
FLAG_ACTIVITY_NO_USER_ACTION = 0x00010000
|
|
FLAG_ACTIVITY_NO_ANIMATION = 0x00010000
|
|
FLAG_RECEIVER_REGISTERED_ONLY = 0x40000000
|
|
FLAG_RECEIVER_REPLACE_PENDING = 0x20000000
|
|
FLAG_RECEIVER_FOREGROUND = 0x10000000
|
|
FLAG_RECEIVER_NO_ABORT = 0x08000000
|
|
FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT = 0x04000000
|
|
FLAG_RECEIVER_BOOT_UPGRADE = 0x02000000
|
|
FLAG_RECEIVER_INCLUDE_BACKGROUND = 0x01000000
|
|
FLAG_RECEIVER_EXCLUDE_BACKGROUND = 0x00800000
|
|
FLAG_RECEIVER_FROM_SHELL = 0x00400000
|
|
FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS = 0x00200000
|
|
FLAG_RECEIVER_OFFLOAD = 0x00100000
|
|
FLAG_SYSTEM_BROADCAST = 0x00000040
|
|
|
|
|
|
# ═══════════════════════════════════════════════════════════════
|
|
# URI_*, SCHEME_*, MIME_* 常量
|
|
# ═══════════════════════════════════════════════════════════════
|
|
|
|
URI_INTENT_SCHEME = "intent"
|
|
SCHEME_FILE = "file"
|
|
SCHEME_CONTENT = "content"
|
|
SCHEME_ANDROID_RESOURCE = "android.resource"
|
|
SCHEME_PACKAGE = "package"
|
|
SCHEME_HTTP = "http"
|
|
SCHEME_HTTPS = "https"
|
|
SCHEME_TEL = "tel"
|
|
SCHEME_SMSTO = "smsto"
|
|
SCHEME_MAILTO = "mailto"
|
|
SCHEME_GEO = "geo"
|
|
SCHEME_MARKET = "market"
|
|
SCHEME_ABOUT = "about"
|
|
|
|
MIME_TYPE_TEXT_PLAIN = "text/plain"
|
|
MIME_TYPE_TEXT_HTML = "text/html"
|
|
MIME_TYPE_TEXT_CALENDAR = "text/calendar"
|
|
MIME_TYPE_TEXT_XML = "text/xml"
|
|
MIME_TYPE_IMAGE_JPEG = "image/jpeg"
|
|
MIME_TYPE_IMAGE_PNG = "image/png"
|
|
MIME_TYPE_IMAGE_GIF = "image/gif"
|
|
MIME_TYPE_IMAGE_WEBP = "image/webp"
|
|
MIME_TYPE_IMAGE_ALL = "image/*"
|
|
MIME_TYPE_AUDIO_MPEG = "audio/mpeg"
|
|
MIME_TYPE_AUDIO_MP4 = "audio/mp4"
|
|
MIME_TYPE_AUDIO_ALL = "audio/*"
|
|
MIME_TYPE_VIDEO_MP4 = "video/mp4"
|
|
MIME_TYPE_VIDEO_ALL = "video/*"
|
|
MIME_TYPE_APPLICATION_PDF = "application/pdf"
|
|
MIME_TYPE_APPLICATION_ZIP = "application/zip"
|
|
MIME_TYPE_APPLICATION_JSON = "application/json"
|
|
MIME_TYPE_APPLICATION_XML = "application/xml"
|
|
MIME_TYPE_APPLICATION_OCTET_STREAM = "application/octet-stream"
|
|
MIME_TYPE_MULTIPART_MIXED = "multipart/mixed"
|
|
MIME_TYPE_MULTIPART_FORM_DATA = "multipart/form-data"
|
|
MIME_TYPE_ALL = "*/*"
|
|
|
|
|
|
# ═══════════════════════════════════════════════════════════════
|
|
# Intent — 完整扩展
|
|
# ═══════════════════════════════════════════════════════════════
|
|
|
|
class Intent(Stub):
|
|
"""Android Intent — 完整扩展 (桌面存根)"""
|
|
|
|
# ── ShortcutIconResource inner class ──
|
|
|
|
class ShortcutIconResource(Stub):
|
|
"""ShortcutIconResource — 快捷方式图标资源"""
|
|
|
|
def __init__(self, packageName: str = "", resourceName: str = ""):
|
|
super().__init__()
|
|
self.packageName = packageName
|
|
self.resourceName = resourceName
|
|
|
|
@staticmethod
|
|
def fromContext(context: Any, iconId: int) -> "Intent.ShortcutIconResource":
|
|
return Intent.ShortcutIconResource(
|
|
packageName=getattr(context, "getPackageName", lambda: "unknown")(),
|
|
resourceName=str(iconId),
|
|
)
|
|
|
|
def toString(self) -> str:
|
|
return f"ShortcutIconResource(packageName={self.packageName}, resourceName={self.resourceName})"
|
|
|
|
# ── FilterComparison inner class ──
|
|
|
|
class FilterComparison(Stub):
|
|
"""FilterComparison — Intent 过滤器比较"""
|
|
|
|
def __init__(self, intent: "Intent"):
|
|
super().__init__()
|
|
self._intent = intent
|
|
|
|
def getIntent(self) -> "Intent":
|
|
return self._intent
|
|
|
|
def equals(self, other: Any) -> bool:
|
|
if not isinstance(other, Intent.FilterComparison):
|
|
return False
|
|
return self._intent.filterEquals(other._intent)
|
|
|
|
def hashCode(self) -> int:
|
|
return self._intent.filterHashCode()
|
|
|
|
def toString(self) -> str:
|
|
return f"FilterComparison({self._intent})"
|
|
|
|
# ── Intent 主构造 ──
|
|
|
|
def __init__(self, action: str = "", uri: Optional[str] = None,
|
|
package: str = "", component: Optional[Any] = None):
|
|
super().__init__()
|
|
self._action = action
|
|
self._data: Optional[str] = uri
|
|
self._type: Optional[str] = None
|
|
self._package = package
|
|
self._component = component
|
|
self._flags: int = 0
|
|
self._categories: Set[str] = set()
|
|
self._extras: Dict[str, Any] = {}
|
|
self._scheme: str = ""
|
|
self._authority: str = ""
|
|
self._path: str = ""
|
|
self._clip_data: Optional[Any] = None
|
|
self._identifier: Optional[str] = None
|
|
self._selector: Optional["Intent"] = None
|
|
self._source_bounds: Optional[Tuple[int, int, int, int]] = None
|
|
|
|
# ── Action ──
|
|
|
|
def getAction(self) -> str:
|
|
return self._action
|
|
|
|
def setAction(self, action: str) -> "Intent":
|
|
self._action = action
|
|
return self
|
|
|
|
# ── Data / URI ──
|
|
|
|
def getData(self) -> Optional[str]:
|
|
return self._data
|
|
|
|
def setData(self, data: str) -> "Intent":
|
|
self._data = data
|
|
self._type = None
|
|
return self
|
|
|
|
def getDataString(self) -> Optional[str]:
|
|
return self._data
|
|
|
|
def getScheme(self) -> str:
|
|
return self._scheme
|
|
|
|
# ── Type ──
|
|
|
|
def getType(self) -> Optional[str]:
|
|
return self._type
|
|
|
|
def setType(self, type_: str) -> "Intent":
|
|
self._type = type_
|
|
self._data = None
|
|
return self
|
|
|
|
def setDataAndType(self, data: str, type_: str) -> "Intent":
|
|
self._data = data
|
|
self._type = type_
|
|
return self
|
|
|
|
def resolveType(self, resolver: Any = None) -> Optional[str]:
|
|
return self._type
|
|
|
|
# ── Scheme ──
|
|
|
|
def getSchemeSpecificPart(self) -> str:
|
|
if self._data and ":" in self._data:
|
|
return self._data.split(":", 1)[1]
|
|
return ""
|
|
|
|
# ── Package ──
|
|
|
|
def getPackage(self) -> str:
|
|
return self._package
|
|
|
|
def setPackage(self, package: str) -> "Intent":
|
|
self._package = package or ""
|
|
return self
|
|
|
|
# ── Component ──
|
|
|
|
def getComponent(self) -> Optional[Any]:
|
|
return self._component
|
|
|
|
def setComponent(self, component: Any) -> "Intent":
|
|
self._component = component
|
|
return self
|
|
|
|
def getClassName(self) -> str:
|
|
if self._component:
|
|
return getattr(self._component, "getClassName", lambda: str(self._component))()
|
|
return ""
|
|
|
|
# ── Flags ──
|
|
|
|
def getFlags(self) -> int:
|
|
return self._flags
|
|
|
|
def setFlags(self, flags: int) -> "Intent":
|
|
self._flags = flags
|
|
return self
|
|
|
|
def addFlags(self, flags: int) -> "Intent":
|
|
self._flags |= flags
|
|
return self
|
|
|
|
def removeFlags(self, flags: int) -> None:
|
|
self._flags &= ~flags
|
|
|
|
# ── Categories ──
|
|
|
|
def hasCategory(self, category: str) -> bool:
|
|
return category in self._categories
|
|
|
|
def getCategories(self) -> Set[str]:
|
|
return self._categories.copy()
|
|
|
|
def addCategory(self, category: str) -> "Intent":
|
|
self._categories.add(category)
|
|
return self
|
|
|
|
def removeCategory(self, category: str) -> None:
|
|
self._categories.discard(category)
|
|
|
|
# ── Extras ──
|
|
|
|
def getExtras(self) -> Dict[str, Any]:
|
|
return dict(self._extras)
|
|
|
|
def hasExtra(self, name: str) -> bool:
|
|
return name in self._extras
|
|
|
|
def getStringExtra(self, name: str) -> Optional[str]:
|
|
val = self._extras.get(name)
|
|
return str(val) if val is not None else None
|
|
|
|
def getIntExtra(self, name: str, default: int = 0) -> int:
|
|
val = self._extras.get(name)
|
|
return int(val) if val is not None else default
|
|
|
|
def getLongExtra(self, name: str, default: int = 0) -> int:
|
|
val = self._extras.get(name)
|
|
return int(val) if val is not None else default
|
|
|
|
def getFloatExtra(self, name: str, default: float = 0.0) -> float:
|
|
val = self._extras.get(name)
|
|
return float(val) if val is not None else default
|
|
|
|
def getDoubleExtra(self, name: str, default: float = 0.0) -> float:
|
|
val = self._extras.get(name)
|
|
return float(val) if val is not None else default
|
|
|
|
def getBooleanExtra(self, name: str, default: bool = False) -> bool:
|
|
val = self._extras.get(name)
|
|
return bool(val) if val is not None else default
|
|
|
|
def getCharExtra(self, name: str, default: str = "") -> str:
|
|
val = self._extras.get(name)
|
|
return str(val) if val is not None else default
|
|
|
|
def getShortExtra(self, name: str, default: int = 0) -> int:
|
|
val = self._extras.get(name)
|
|
return int(val) if val is not None else default
|
|
|
|
def getByteExtra(self, name: str, default: int = 0) -> int:
|
|
val = self._extras.get(name)
|
|
return int(val) if val is not None else default
|
|
|
|
def getSerializableExtra(self, name: str) -> Optional[Any]:
|
|
return self._extras.get(name)
|
|
|
|
def getIntegerArrayListExtra(self, name: str) -> Optional[List[int]]:
|
|
val = self._extras.get(name)
|
|
if isinstance(val, list) and all(isinstance(v, int) for v in val):
|
|
return val
|
|
return None
|
|
|
|
def getStringArrayListExtra(self, name: str) -> Optional[List[str]]:
|
|
val = self._extras.get(name)
|
|
if isinstance(val, list) and all(isinstance(v, str) for v in val):
|
|
return val
|
|
return None
|
|
|
|
def getCharSequenceArrayListExtra(self, name: str) -> Optional[List[str]]:
|
|
val = self._extras.get(name)
|
|
if isinstance(val, list):
|
|
return [str(v) for v in val]
|
|
return None
|
|
|
|
def getBundleExtra(self, name: str) -> Optional[Dict[str, Any]]:
|
|
val = self._extras.get(name)
|
|
return val if isinstance(val, dict) else None
|
|
|
|
def putExtra(self, name: str, value: Any) -> "Intent":
|
|
self._extras[name] = value
|
|
return self
|
|
|
|
def putExtras(self, extras: Dict[str, Any]) -> "Intent":
|
|
self._extras.update(extras)
|
|
return self
|
|
|
|
def removeExtra(self, name: str) -> None:
|
|
self._extras.pop(name, None)
|
|
|
|
def replaceExtras(self, extras: Dict[str, Any]) -> "Intent":
|
|
self._extras = dict(extras)
|
|
return self
|
|
|
|
def putIntegerArrayListExtra(self, name: str, values: List[int]) -> "Intent":
|
|
self._extras[name] = list(values)
|
|
return self
|
|
|
|
def putStringArrayListExtra(self, name: str, values: List[str]) -> "Intent":
|
|
self._extras[name] = list(values)
|
|
return self
|
|
|
|
def putCharSequenceArrayListExtra(self, name: str, values: List[str]) -> "Intent":
|
|
self._extras[name] = [str(v) for v in values]
|
|
return self
|
|
|
|
# ── Selector ──
|
|
|
|
def getSelector(self) -> Optional["Intent"]:
|
|
return self._selector
|
|
|
|
def setSelector(self, selector: "Intent") -> None:
|
|
self._selector = selector
|
|
|
|
# ── ClipData ──
|
|
|
|
def getClipData(self) -> Optional[Any]:
|
|
return self._clip_data
|
|
|
|
def setClipData(self, clip: Optional[Any]) -> None:
|
|
self._clip_data = clip
|
|
|
|
# ── Identifier ──
|
|
|
|
def getIdentifier(self) -> Optional[str]:
|
|
return self._identifier
|
|
|
|
def setIdentifier(self, identifier: str) -> None:
|
|
self._identifier = identifier
|
|
|
|
# ── SourceBounds ──
|
|
|
|
def getSourceBounds(self) -> Optional[Tuple[int, int, int, int]]:
|
|
return self._source_bounds
|
|
|
|
def setSourceBounds(self, bounds: Optional[Tuple[int, int, int, int]]) -> None:
|
|
self._source_bounds = bounds
|
|
|
|
# ── FillIn ──
|
|
|
|
def fillIn(self, other: "Intent", flags: int = 0) -> int:
|
|
"""将 other 的内容合并到当前 Intent"""
|
|
changes = 0
|
|
if not self._action and other._action:
|
|
self._action = other._action
|
|
changes |= 1
|
|
if not self._data and other._data:
|
|
self._data = other._data
|
|
changes |= 2
|
|
if not self._type and other._type:
|
|
self._type = other._type
|
|
changes |= 4
|
|
if not self._package and other._package:
|
|
self._package = other._package
|
|
changes |= 8
|
|
if not self._component and other._component:
|
|
self._component = other._component
|
|
changes |= 16
|
|
if not self._scheme and other._scheme:
|
|
self._scheme = other._scheme
|
|
changes |= 32
|
|
for cat in other._categories:
|
|
if cat not in self._categories:
|
|
self._categories.add(cat)
|
|
changes |= 64
|
|
self._flags |= other._flags
|
|
for k, v in other._extras.items():
|
|
if k not in self._extras:
|
|
self._extras[k] = v
|
|
changes |= 128
|
|
return changes
|
|
|
|
# ── FilterEquals (Intent resolution matching) ──
|
|
|
|
def filterEquals(self, other: Any) -> bool:
|
|
"""判断两个 Intent 在 filter 匹配意义上是否相等"""
|
|
if not isinstance(other, Intent):
|
|
return False
|
|
return (self._action == other._action
|
|
and self._data == other._data
|
|
and self._type == other._type
|
|
and self._package == other._package
|
|
and self._component == other._component
|
|
and self._categories == other._categories)
|
|
|
|
def filterHashCode(self) -> int:
|
|
"""计算 filter 哈希码"""
|
|
h = hash(self._action) if self._action else 0
|
|
h = h * 31 + (hash(self._data) if self._data else 0)
|
|
h = h * 31 + (hash(self._type) if self._type else 0)
|
|
h = h * 31 + (hash(self._package) if self._package else 0)
|
|
h = h * 31 + (hash(str(self._component)) if self._component else 0)
|
|
for cat in sorted(self._categories):
|
|
h = h * 31 + hash(cat)
|
|
return h & 0x7FFFFFFF
|
|
|
|
# ── DescribeContents / WriteToParcel ──
|
|
|
|
def describeContents(self) -> int:
|
|
return 0
|
|
|
|
def writeToParcel(self, dest: Any, flags: int = 0) -> None:
|
|
"""写入 Parcel (桌面存根)"""
|
|
pass
|
|
|
|
def readFromParcel(self, source: Any) -> None:
|
|
"""从 Parcel 读取 (桌面存根)"""
|
|
pass
|
|
|
|
# ── Create chooser ──
|
|
|
|
@staticmethod
|
|
def createChooser(target: "Intent", title: Optional[str] = None,
|
|
sender: Optional[Any] = None) -> "Intent":
|
|
intent = Intent(ACTION_CHOOSER)
|
|
intent.putExtra(EXTRA_INTENT, target)
|
|
if title:
|
|
intent.putExtra(EXTRA_TITLE, title)
|
|
if sender:
|
|
intent.putExtra(EXTRA_CHOOSER_REFINEMENT_INTENT_SENDER, sender)
|
|
return intent
|
|
|
|
@staticmethod
|
|
def getIntentOld(action: str) -> "Intent":
|
|
return Intent(action)
|
|
|
|
@staticmethod
|
|
def getIntent(uri: str) -> "Intent":
|
|
return Intent(uri=uri)
|
|
|
|
@staticmethod
|
|
def parseUri(uri: str, flags: int = 0) -> "Intent":
|
|
return Intent(uri=uri)
|
|
|
|
def toURI(self) -> str:
|
|
return f"{self._scheme}:{self._data or ''}#Intent;action={self._action};end"
|
|
|
|
def toUri(self, flags: int = 0) -> str:
|
|
return self.toURI()
|
|
|
|
def toString(self) -> str:
|
|
parts = [f"Intent {{ act={self._action}"]
|
|
if self._data:
|
|
parts.append(f" dat={self._data}")
|
|
if self._type:
|
|
parts.append(f" typ={self._type}")
|
|
if self._package:
|
|
parts.append(f" pkg={self._package}")
|
|
if self._component:
|
|
parts.append(f" cmp={self._component}")
|
|
if self._flags:
|
|
parts.append(f" flg=0x{self._flags:08x}")
|
|
if self._categories:
|
|
parts.append(f" cat={self._categories}")
|
|
parts.append(" }")
|
|
return "".join(parts)
|
|
|
|
def equals(self, other: Any) -> bool:
|
|
if not isinstance(other, Intent):
|
|
return False
|
|
return (self._action == other._action
|
|
and self._data == other._data
|
|
and self._type == other._type
|
|
and self._package == other._package)
|
|
|
|
def hashCode(self) -> int:
|
|
h = hash(self._action) if self._action else 0
|
|
h = h * 31 + (hash(self._data) if self._data else 0)
|
|
h = h * 31 + (hash(self._type) if self._type else 0)
|
|
h = h * 31 + (hash(self._package) if self._package else 0)
|
|
return h & 0x7FFFFFFF
|
|
|
|
def clone(self) -> "Intent":
|
|
cloned = Intent(self._action, self._data, self._package, self._component)
|
|
cloned._type = self._type
|
|
cloned._flags = self._flags
|
|
cloned._categories = set(self._categories)
|
|
cloned._extras = dict(self._extras)
|
|
cloned._scheme = self._scheme
|
|
cloned._selector = self._selector
|
|
cloned._clip_data = self._clip_data
|
|
cloned._identifier = self._identifier
|
|
cloned._source_bounds = self._source_bounds
|
|
return cloned
|
|
|
|
def toInsecureString(self) -> str:
|
|
return self.toString()
|
|
|
|
def toSecureString(self) -> str:
|
|
return self.toString()
|
|
|
|
def isDocument(self) -> bool:
|
|
return bool(self._flags & FLAG_ACTIVITY_NEW_DOCUMENT)
|
|
|
|
def isExcludingStopped(self) -> bool:
|
|
return bool(self._flags & FLAG_EXCLUDE_STOPPED_PACKAGES)
|
|
|
|
def isWebIntent(self) -> bool:
|
|
return self._scheme in (SCHEME_HTTP, SCHEME_HTTPS)
|
|
|
|
def getBooleanArrayExtra(self, name: str) -> Optional[List[bool]]:
|
|
val = self._extras.get(name)
|
|
if isinstance(val, list):
|
|
return [bool(v) for v in val]
|
|
return None
|
|
|
|
def getIntArrayExtra(self, name: str) -> Optional[List[int]]:
|
|
val = self._extras.get(name)
|
|
if isinstance(val, list):
|
|
return [int(v) for v in val]
|
|
return None
|
|
|
|
def getLongArrayExtra(self, name: str) -> Optional[List[int]]:
|
|
val = self._extras.get(name)
|
|
if isinstance(val, list):
|
|
return [int(v) for v in val]
|
|
return None
|
|
|
|
def getFloatArrayExtra(self, name: str) -> Optional[List[float]]:
|
|
val = self._extras.get(name)
|
|
if isinstance(val, list):
|
|
return [float(v) for v in val]
|
|
return None
|
|
|
|
def getDoubleArrayExtra(self, name: str) -> Optional[List[float]]:
|
|
val = self._extras.get(name)
|
|
if isinstance(val, list):
|
|
return [float(v) for v in val]
|
|
return None
|
|
|
|
def getStringArrayExtra(self, name: str) -> Optional[List[str]]:
|
|
val = self._extras.get(name)
|
|
if isinstance(val, list):
|
|
return [str(v) for v in val]
|
|
return None
|
|
|
|
def getCharSequenceArrayExtra(self, name: str) -> Optional[List[str]]:
|
|
val = self._extras.get(name)
|
|
if isinstance(val, list):
|
|
return [str(v) for v in val]
|
|
return None
|
|
|
|
def getBundleArrayExtra(self, name: str) -> Optional[List[Dict[str, Any]]]:
|
|
val = self._extras.get(name)
|
|
if isinstance(val, list) and all(isinstance(v, dict) for v in val):
|
|
return val
|
|
return None
|
|
|
|
def hasExtraSecret(self, name: str) -> bool:
|
|
return name in self._extras
|
|
|
|
def putExtraSecret(self, name: str, value: Any) -> "Intent":
|
|
self._extras[name] = value
|
|
return self
|
|
|
|
def toShortString(self) -> str:
|
|
return self.toString()[:80]
|
|
|
|
def toShortUri(self) -> str:
|
|
return self.toUri()[:80]
|
|
|
|
|
|
# ═══════════════════════════════════════════════════════════════
|
|
# IntentReceiver
|
|
# ═══════════════════════════════════════════════════════════════
|
|
|
|
class IntentReceiver(Stub):
|
|
"""IntentReceiver — Intent 接收器 (桌面存根)"""
|
|
|
|
def __init__(self):
|
|
super().__init__()
|
|
self._result_code = 0
|
|
self._result_data: Optional[str] = None
|
|
self._result_extras: Optional[Dict[str, Any]] = None
|
|
self._abort = False
|
|
|
|
def onReceive(self, context: Any, intent: Intent) -> None:
|
|
"""接收 Intent (桌面存根)"""
|
|
pass
|
|
|
|
def getResultCode(self) -> int:
|
|
return self._result_code
|
|
|
|
def setResultCode(self, code: int) -> None:
|
|
self._result_code = code
|
|
|
|
def getResultData(self) -> Optional[str]:
|
|
return self._result_data
|
|
|
|
def setResultData(self, data: str) -> None:
|
|
self._result_data = data
|
|
|
|
def getResultExtras(self) -> Optional[Dict[str, Any]]:
|
|
return self._result_extras
|
|
|
|
def setResultExtras(self, extras: Dict[str, Any]) -> None:
|
|
self._result_extras = dict(extras)
|
|
|
|
def abortBroadcast(self) -> None:
|
|
self._abort = True
|
|
|
|
def isAborted(self) -> bool:
|
|
return self._abort
|
|
|
|
def clearAbortBroadcast(self) -> None:
|
|
self._abort = False
|
|
|
|
def toString(self) -> str:
|
|
return f"IntentReceiver(resultCode={self._result_code})"
|
|
|
|
|
|
# ═══════════════════════════════════════════════════════════════
|
|
# PendingIntent
|
|
# ═══════════════════════════════════════════════════════════════
|
|
|
|
class PendingIntent(Stub):
|
|
"""PendingIntent — 延迟 Intent"""
|
|
|
|
FLAG_ONE_SHOT = 1 << 30
|
|
FLAG_NO_CREATE = 1 << 29
|
|
FLAG_CANCEL_CURRENT = 1 << 28
|
|
FLAG_UPDATE_CURRENT = 1 << 27
|
|
FLAG_IMMUTABLE = 1 << 26
|
|
FLAG_MUTABLE = 1 << 25
|
|
|
|
def __init__(self, intent: Optional[Intent] = None, requestCode: int = 0,
|
|
flags: int = 0):
|
|
super().__init__()
|
|
self._intent = intent
|
|
self._request_code = requestCode
|
|
self._flags = flags
|
|
self._canceled = False
|
|
|
|
@staticmethod
|
|
def getActivity(context: Any, requestCode: int, intent: Intent,
|
|
flags: int) -> "PendingIntent":
|
|
return PendingIntent(intent, requestCode, flags)
|
|
|
|
@staticmethod
|
|
def getActivities(context: Any, requestCode: int,
|
|
intents: List[Intent], flags: int) -> "PendingIntent":
|
|
return PendingIntent(intents[0] if intents else None, requestCode, flags)
|
|
|
|
@staticmethod
|
|
def getBroadcast(context: Any, requestCode: int, intent: Intent,
|
|
flags: int) -> "PendingIntent":
|
|
return PendingIntent(intent, requestCode, flags)
|
|
|
|
@staticmethod
|
|
def getService(context: Any, requestCode: int, intent: Intent,
|
|
flags: int) -> "PendingIntent":
|
|
return PendingIntent(intent, requestCode, flags)
|
|
|
|
@staticmethod
|
|
def getForegroundService(context: Any, requestCode: int, intent: Intent,
|
|
flags: int) -> "PendingIntent":
|
|
return PendingIntent(intent, requestCode, flags)
|
|
|
|
def getIntent(self) -> Optional[Intent]:
|
|
return self._intent
|
|
|
|
def getCreatorPackage(self) -> str:
|
|
return ""
|
|
|
|
def getCreatorUid(self) -> int:
|
|
return -1
|
|
|
|
def getTargetPackage(self) -> str:
|
|
return self._intent.getPackage() if self._intent else ""
|
|
|
|
def getRequestCode(self) -> int:
|
|
return self._request_code
|
|
|
|
def isActivity(self) -> bool:
|
|
return True
|
|
|
|
def isForegroundService(self) -> bool:
|
|
return False
|
|
|
|
def isBroadcast(self) -> bool:
|
|
return False
|
|
|
|
def isService(self) -> bool:
|
|
return not self.isActivity() and not self.isBroadcast()
|
|
|
|
def send(self, code: int = 0, onFinished: Any = None,
|
|
handler: Any = None, requiredPermission: Optional[str] = None,
|
|
options: Optional[Dict[str, Any]] = None) -> None:
|
|
"""发送 PendingIntent (桌面存根)"""
|
|
pass
|
|
|
|
def cancel(self) -> None:
|
|
self._canceled = True
|
|
|
|
def equals(self, other: Any) -> bool:
|
|
if not isinstance(other, PendingIntent):
|
|
return False
|
|
return (self._intent == other._intent
|
|
and self._request_code == other._request_code)
|
|
|
|
def hashCode(self) -> int:
|
|
h = hash(self._intent) if self._intent else 0
|
|
return (h * 31 + self._request_code) & 0x7FFFFFFF
|
|
|
|
def toString(self) -> str:
|
|
return f"PendingIntent(requestCode={self._request_code}, flags=0x{self._flags:08x})"
|
|
|
|
def getCreatorToken(self) -> Optional[Any]:
|
|
return None
|
|
|
|
def getTag(self, tagType: str) -> str:
|
|
return ""
|
|
|
|
def writeToParcel(self, dest: Any, flags: int = 0) -> None:
|
|
pass
|
|
|
|
def describeContents(self) -> int:
|
|
return 0
|
|
|
|
|
|
# ═══════════════════════════════════════════════════════════════
|
|
# IntentSender
|
|
# ═══════════════════════════════════════════════════════════════
|
|
|
|
class IntentSender(Stub):
|
|
"""IntentSender — Intent 发送器"""
|
|
|
|
class SendIntentException(Exception):
|
|
"""SendIntentException — Intent 发送异常"""
|
|
pass
|
|
|
|
def __init__(self, intent: Optional[Intent] = None):
|
|
super().__init__()
|
|
self._intent = intent
|
|
|
|
@staticmethod
|
|
def getActivity(context: Any, requestCode: int, intent: Intent,
|
|
flags: int = 0) -> "IntentSender":
|
|
return IntentSender(intent)
|
|
|
|
def getTargetPackage(self) -> str:
|
|
return self._intent.getPackage() if self._intent else ""
|
|
|
|
def getCreatorUid(self) -> int:
|
|
return -1
|
|
|
|
def sendIntent(self, context: Any, code: int, onFinished: Any = None,
|
|
handler: Any = None, requiredPermission: str = "") -> None:
|
|
"""发送 Intent (桌面存根)"""
|
|
pass
|
|
|
|
def equals(self, other: Any) -> bool:
|
|
if not isinstance(other, IntentSender):
|
|
return False
|
|
return self._intent == other._intent
|
|
|
|
def hashCode(self) -> int:
|
|
return hash(self._intent) & 0x7FFFFFFF if self._intent else 0
|
|
|
|
def toString(self) -> str:
|
|
return f"IntentSender({self._intent})"
|
|
|
|
def describeContents(self) -> int:
|
|
return 0
|
|
|
|
def writeToParcel(self, dest: Any, flags: int = 0) -> None:
|
|
pass
|
|
|
|
|
|
# ═══════════════════════════════════════════════════════════════
|
|
# IntentService
|
|
# ═══════════════════════════════════════════════════════════════
|
|
|
|
class IntentService(Stub):
|
|
"""IntentService — Intent 服务 (桌面存根)"""
|
|
|
|
def __init__(self, name: str = "IntentService"):
|
|
super().__init__()
|
|
self._name = name
|
|
self._started = False
|
|
self._redelivery = False
|
|
|
|
def onCreate(self) -> None:
|
|
"""服务创建"""
|
|
self._started = True
|
|
|
|
def onStartCommand(self, intent: Optional[Intent], flags: int, startId: int) -> int:
|
|
"""接收启动命令"""
|
|
return 1 # START_REDELIVER_INTENT
|
|
|
|
def onBind(self, intent: Intent) -> Optional[Any]:
|
|
return None
|
|
|
|
def onDestroy(self) -> None:
|
|
self._started = False
|
|
|
|
def setIntentRedelivery(self, enabled: bool) -> None:
|
|
self._redelivery = enabled
|
|
|
|
def stopSelf(self) -> None:
|
|
self._started = False
|
|
|
|
def stopSelfResult(self, startId: int) -> bool:
|
|
self._started = False
|
|
return True
|
|
|
|
def toString(self) -> str:
|
|
return f"IntentService(name={self._name}, started={self._started})"
|
|
|
|
|
|
# ═══════════════════════════════════════════════════════════════
|
|
# IntentFilter
|
|
# ═══════════════════════════════════════════════════════════════
|
|
|
|
class IntentFilter(Stub):
|
|
"""IntentFilter — Intent 过滤器 (桌面存根)"""
|
|
|
|
class AuthorityEntry(Stub):
|
|
"""AuthorityEntry — 权限条目"""
|
|
|
|
def __init__(self, host: str, port: int = -1):
|
|
super().__init__()
|
|
self._host = host
|
|
self._port = port
|
|
|
|
def getHost(self) -> str:
|
|
return self._host
|
|
|
|
def getPort(self) -> int:
|
|
return self._port
|
|
|
|
def match(self, data: Optional[str]) -> int:
|
|
return IntentFilter.MATCH_CATEGORY_HOST if self._host else IntentFilter.NO_MATCH_DATA
|
|
|
|
def toString(self) -> str:
|
|
return f"AuthorityEntry(host={self._host}, port={self._port})"
|
|
|
|
class MalformedMimeTypeException(Exception):
|
|
"""MalformedMimeTypeException — MIME 类型格式错误"""
|
|
pass
|
|
|
|
class PriorityGroup:
|
|
"""PriorityGroup — 优先级分组"""
|
|
PRIORITY_GROUP_UNDEFINED = 0
|
|
PRIORITY_GROUP_BACKGROUND = 0x1000
|
|
PRIORITY_GROUP_FOREGROUND = 0x2000
|
|
PRIORITY_GROUP_SYSTEM = 0x3000
|
|
|
|
MATCH_CATEGORY_EMPTY = 0x00000000
|
|
MATCH_CATEGORY_SCHEME = 0x00040000
|
|
MATCH_CATEGORY_AUTHORITY = 0x00080000
|
|
MATCH_CATEGORY_HOST = 0x00100000
|
|
MATCH_CATEGORY_PORT = 0x00200000
|
|
MATCH_CATEGORY_PATH = 0x00400000
|
|
MATCH_CATEGORY_TYPE = 0x00800000
|
|
MATCH_ADJUSTMENT_NORMAL = 0x00008000
|
|
MATCH_ADJUSTMENT_MASK = 0x0000FFFF
|
|
NO_MATCH_ACTION = -3
|
|
NO_MATCH_CATEGORY = -4
|
|
NO_MATCH_DATA = -2
|
|
NO_MATCH_TYPE = -1
|
|
MATCH_CATEGORY_MASK = 0xFFFF0000
|
|
|
|
SYSTEM_HIGH_PRIORITY = 10000
|
|
SYSTEM_LOW_PRIORITY = -10000
|
|
|
|
def __init__(self, action: str = "", dataType: str = "",
|
|
dataScheme: str = "", dataAuthority: str = "",
|
|
dataPath: str = ""):
|
|
super().__init__()
|
|
self._actions: List[str] = [action] if action else []
|
|
self._categories: List[str] = []
|
|
self._data_types: List[str] = [dataType] if dataType else []
|
|
self._data_schemes: List[str] = [dataScheme] if dataScheme else []
|
|
self._data_authorities: List[IntentFilter.AuthorityEntry] = []
|
|
if dataAuthority:
|
|
self._data_authorities.append(
|
|
IntentFilter.AuthorityEntry(dataAuthority))
|
|
self._data_paths: List[str] = [dataPath] if dataPath else []
|
|
self._priority: int = 0
|
|
self._has_partial_types = False
|
|
self._mime_group: Optional[str] = None
|
|
self._scheme_specific_parts: List[str] = []
|
|
self._data_scheme_specific_parts: List[str] = []
|
|
|
|
def addAction(self, action: str) -> None:
|
|
if action not in self._actions:
|
|
self._actions.append(action)
|
|
|
|
def addCategory(self, category: str) -> None:
|
|
if category not in self._categories:
|
|
self._categories.append(category)
|
|
|
|
def addDataType(self, type_: str) -> None:
|
|
self._data_types.append(type_)
|
|
|
|
def addDataScheme(self, scheme: str) -> None:
|
|
if scheme not in self._data_schemes:
|
|
self._data_schemes.append(scheme)
|
|
|
|
def addDataAuthority(self, host: str, port: int = -1) -> None:
|
|
self._data_authorities.append(
|
|
IntentFilter.AuthorityEntry(host, port))
|
|
|
|
def addDataPath(self, path: str) -> None:
|
|
self._data_paths.append(path)
|
|
|
|
def addDataSchemeSpecificPart(self, ssp: str) -> None:
|
|
self._scheme_specific_parts.append(ssp)
|
|
|
|
def hasAction(self, action: str) -> bool:
|
|
return action in self._actions
|
|
|
|
def hasCategory(self, category: str) -> bool:
|
|
return category in self._categories
|
|
|
|
def hasDataType(self, type_: str) -> bool:
|
|
return type_ in self._data_types
|
|
|
|
def hasDataScheme(self, scheme: str) -> bool:
|
|
return scheme in self._data_schemes
|
|
|
|
def getAction(self, index: int) -> str:
|
|
return self._actions[index] if 0 <= index < len(self._actions) else ""
|
|
|
|
def getCategory(self, index: int) -> str:
|
|
return self._categories[index] if 0 <= index < len(self._categories) else ""
|
|
|
|
def getDataType(self, index: int) -> str:
|
|
return self._data_types[index] if 0 <= index < len(self._data_types) else ""
|
|
|
|
def getDataScheme(self, index: int) -> str:
|
|
return self._data_schemes[index] if 0 <= index < len(self._data_schemes) else ""
|
|
|
|
def getDataAuthority(self, index: int) -> Optional[AuthorityEntry]:
|
|
if 0 <= index < len(self._data_authorities):
|
|
return self._data_authorities[index]
|
|
return None
|
|
|
|
def countActions(self) -> int:
|
|
return len(self._actions)
|
|
|
|
def countCategories(self) -> int:
|
|
return len(self._categories)
|
|
|
|
def countDataTypes(self) -> int:
|
|
return len(self._data_types)
|
|
|
|
def countDataSchemes(self) -> int:
|
|
return len(self._data_schemes)
|
|
|
|
def countDataAuthorities(self) -> int:
|
|
return len(self._data_authorities)
|
|
|
|
def countDataPaths(self) -> int:
|
|
return len(self._data_paths)
|
|
|
|
def setPriority(self, priority: int) -> None:
|
|
self._priority = priority
|
|
|
|
def getPriority(self) -> int:
|
|
return self._priority
|
|
|
|
def match(self, action: str, type_: Optional[str], scheme: str,
|
|
data: Optional[str], categories: Set[str], tag: str = "") -> int:
|
|
"""匹配 Intent (桌面存根)"""
|
|
if self._actions and action not in self._actions:
|
|
return IntentFilter.NO_MATCH_ACTION
|
|
# 简化匹配逻辑
|
|
return IntentFilter.MATCH_CATEGORY_EMPTY
|
|
|
|
def matchAction(self, action: str) -> bool:
|
|
return action in self._actions
|
|
|
|
def matchCategories(self, categories: Set[str]) -> Optional[str]:
|
|
for cat in categories:
|
|
if cat not in self._categories:
|
|
return cat
|
|
return None
|
|
|
|
def matchData(self, type_: str, scheme: str, data: str) -> int:
|
|
"""匹配数据 (桌面存根)"""
|
|
return IntentFilter.MATCH_CATEGORY_EMPTY
|
|
|
|
def matchDataAuthority(self, data: Optional[str]) -> int:
|
|
for auth in self._data_authorities:
|
|
if auth.match(data) >= 0:
|
|
return IntentFilter.MATCH_CATEGORY_AUTHORITY
|
|
return IntentFilter.NO_MATCH_DATA
|
|
|
|
def describeContents(self) -> int:
|
|
return 0
|
|
|
|
def writeToParcel(self, dest: Any, flags: int = 0) -> None:
|
|
pass
|
|
|
|
def toString(self) -> str:
|
|
return (f"IntentFilter(actions={self._actions}, "
|
|
f"categories={self._categories}, "
|
|
f"types={self._data_types}, "
|
|
f"priority={self._priority})")
|
|
|
|
def equals(self, other: Any) -> bool:
|
|
if not isinstance(other, IntentFilter):
|
|
return False
|
|
return (self._actions == other._actions
|
|
and self._categories == other._categories)
|
|
|
|
def hashCode(self) -> int:
|
|
h = 0
|
|
for a in self._actions:
|
|
h = h * 31 + hash(a)
|
|
for c in self._categories:
|
|
h = h * 31 + hash(c)
|
|
return h & 0x7FFFFFFF
|
|
|
|
|
|
# ═══════════════════════════════════════════════════════════════
|
|
# MatchingFlags
|
|
# ═══════════════════════════════════════════════════════════════
|
|
|
|
class MatchingFlags(Stub):
|
|
"""MatchingFlags — Intent 匹配标志"""
|
|
|
|
MATCH_ALL = 0x00000000
|
|
MATCH_DEFAULT_ONLY = 0x00010000
|
|
MATCH_SYSTEM_ONLY = 0x00020000
|
|
MATCH_DEBUG_TRIANGULATION = 0x00000010
|
|
MATCH_INSTANT = 0x00000020
|
|
MATCH_VISIBLE_TO_INSTANT_APP_ONLY = 0x00000040
|
|
MATCH_DIRECT_BOOT_AUTO = 0x00000100
|
|
MATCH_DIRECT_BOOT_AWARE = 0x00000200
|
|
MATCH_DIRECT_BOOT_UNAWARE = 0x00000400
|
|
MATCH_SYSTEM = 0x00010000
|
|
MATCH_KNOWN_PACKAGES = 0x00080000
|
|
MATCH_VERIFIED = 0x00100000
|
|
MATCH_APEX = 0x01000000
|
|
|
|
def __init__(self, flags: int = MATCH_ALL):
|
|
super().__init__()
|
|
self._flags = flags
|
|
|
|
def getFlags(self) -> int:
|
|
return self._flags
|
|
|
|
def setFlags(self, flags: int) -> None:
|
|
self._flags = flags
|
|
|
|
def toString(self) -> str:
|
|
return f"MatchingFlags(0x{self._flags:08x})"
|
|
|
|
|
|
# ═══════════════════════════════════════════════════════════════
|
|
# ShortcutInfo
|
|
# ═══════════════════════════════════════════════════════════════
|
|
|
|
class ShortcutInfo(Stub):
|
|
"""ShortcutInfo — 快捷方式信息"""
|
|
|
|
DISABLED_REASON_UNDEFINED = 0
|
|
DISABLED_REASON_NOT_DISABLED = 1
|
|
DISABLED_REASON_BY_APP = 2
|
|
DISABLED_REASON_BY_USER = 3
|
|
DISABLED_REASON_UNKNOWN = 4
|
|
DISABLED_REASON_BACKUP_NOT_SUPPORTED = 5
|
|
DISABLED_REASON_BLOCKED = 6
|
|
DISABLED_REASON_EXCLUDED = 7
|
|
DISABLED_REASON_APP_CHANGED = 8
|
|
DISABLED_REASON_RESTORE_APP_REMOVED = 9
|
|
DISABLED_REASON_RESTORE_BACKUP_NOT_AVAILABLE = 10
|
|
DISABLED_REASON_RESTORE_VERSION_LOWER = 11
|
|
DISABLED_REASON_RESTORE_SIGNATURE_MISMATCH = 12
|
|
DISABLED_REASON_RESTORE_UID_MISMATCH = 13
|
|
DISABLED_REASON_RESTORE_STALE = 14
|
|
DISABLED_REASON_RESTORE_OTHER = 15
|
|
SHORTCUT_TYPE_CLASSIC = 0
|
|
SHORTCUT_TYPE_DYNAMIC = 1
|
|
SHORTCUT_TYPE_PINNED = 2
|
|
|
|
class Builder(Stub):
|
|
"""ShortcutInfo.Builder — ShortcutInfo 构建器"""
|
|
|
|
def __init__(self, context: Any, id_: str):
|
|
super().__init__()
|
|
self._id = id_
|
|
self._context = context
|
|
self._short_label = ""
|
|
self._long_label = ""
|
|
self._disabled_message = ""
|
|
self._intent: Optional[Intent] = None
|
|
self._intents: List[Intent] = []
|
|
self._icon: Optional[Any] = None
|
|
self._rank = 0
|
|
self._activity: Optional[Any] = None
|
|
self._categories: Set[str] = set()
|
|
self._is_enabled = True
|
|
self._is_declared = False
|
|
self._shortcut_type = ShortcutInfo.SHORTCUT_TYPE_CLASSIC
|
|
self._icon_resource: Optional[Intent.ShortcutIconResource] = None
|
|
self._long_lived = False
|
|
self._person: Optional[Any] = None
|
|
self._package_name = ""
|
|
|
|
def setShortLabel(self, label: str) -> "ShortcutInfo.Builder":
|
|
self._short_label = label
|
|
return self
|
|
|
|
def setLongLabel(self, label: str) -> "ShortcutInfo.Builder":
|
|
self._long_label = label
|
|
return self
|
|
|
|
def setDisabledMessage(self, msg: str) -> "ShortcutInfo.Builder":
|
|
self._disabled_message = msg
|
|
return self
|
|
|
|
def setIntent(self, intent: Intent) -> "ShortcutInfo.Builder":
|
|
self._intent = intent
|
|
return self
|
|
|
|
def setIntents(self, intents: List[Intent]) -> "ShortcutInfo.Builder":
|
|
self._intents = list(intents)
|
|
return self
|
|
|
|
def setIcon(self, icon: Any) -> "ShortcutInfo.Builder":
|
|
self._icon = icon
|
|
return self
|
|
|
|
def setRank(self, rank: int) -> "ShortcutInfo.Builder":
|
|
self._rank = rank
|
|
return self
|
|
|
|
def setActivity(self, activity: Any) -> "ShortcutInfo.Builder":
|
|
self._activity = activity
|
|
return self
|
|
|
|
def setCategories(self, categories: Set[str]) -> "ShortcutInfo.Builder":
|
|
self._categories = set(categories)
|
|
return self
|
|
|
|
def setLongLived(self, longLived: bool) -> "ShortcutInfo.Builder":
|
|
self._long_lived = longLived
|
|
return self
|
|
|
|
def setShortcutType(self, shortcutType: int) -> "ShortcutInfo.Builder":
|
|
self._shortcut_type = shortcutType
|
|
return self
|
|
|
|
def setIconResource(self, resource: Intent.ShortcutIconResource) -> "ShortcutInfo.Builder":
|
|
self._icon_resource = resource
|
|
return self
|
|
|
|
def setPackageName(self, packageName: str) -> "ShortcutInfo.Builder":
|
|
self._package_name = packageName
|
|
return self
|
|
|
|
def build(self) -> "ShortcutInfo":
|
|
info = ShortcutInfo(self._id)
|
|
info._short_label = self._short_label
|
|
info._long_label = self._long_label
|
|
info._disabled_message = self._disabled_message
|
|
info._intent = self._intent
|
|
info._intents = list(self._intents)
|
|
info._icon = self._icon
|
|
info._rank = self._rank
|
|
info._activity = self._activity
|
|
info._categories = set(self._categories)
|
|
info._is_enabled = self._is_enabled
|
|
info._shortcut_type = self._shortcut_type
|
|
info._icon_resource = self._icon_resource
|
|
info._long_lived = self._long_lived
|
|
info._person = self._person
|
|
info._package_name = self._package_name
|
|
return info
|
|
|
|
def __init__(self, id_: str = ""):
|
|
super().__init__()
|
|
self._id = id_
|
|
self._package_name = ""
|
|
self._short_label = ""
|
|
self._long_label = ""
|
|
self._disabled_message = ""
|
|
self._intent: Optional[Intent] = None
|
|
self._intents: List[Intent] = []
|
|
self._icon: Optional[Any] = None
|
|
self._rank = 0
|
|
self._activity: Optional[Any] = None
|
|
self._categories: Set[str] = set()
|
|
self._is_enabled = True
|
|
self._is_declared = False
|
|
self._shortcut_type = ShortcutInfo.SHORTCUT_TYPE_CLASSIC
|
|
self._icon_resource: Optional[Intent.ShortcutIconResource] = None
|
|
self._last_changed_timestamp = 0
|
|
self._long_lived = False
|
|
self._person: Optional[Any] = None
|
|
self._package_name = ""
|
|
|
|
def getId(self) -> str:
|
|
return self._id
|
|
|
|
def getPackage(self) -> str:
|
|
return self._package_name
|
|
|
|
def getShortLabel(self) -> str:
|
|
return self._short_label
|
|
|
|
def getLongLabel(self) -> str:
|
|
return self._long_label
|
|
|
|
def getDisabledMessage(self) -> str:
|
|
return self._disabled_message
|
|
|
|
def getIntent(self) -> Optional[Intent]:
|
|
return self._intent
|
|
|
|
def getIntents(self) -> List[Intent]:
|
|
return list(self._intents)
|
|
|
|
def getIcon(self) -> Optional[Any]:
|
|
return self._icon
|
|
|
|
def getRank(self) -> int:
|
|
return self._rank
|
|
|
|
def getActivity(self) -> Optional[Any]:
|
|
return self._activity
|
|
|
|
def getCategories(self) -> Set[str]:
|
|
return set(self._categories)
|
|
|
|
def isEnabled(self) -> bool:
|
|
return self._is_enabled
|
|
|
|
def isDeclared(self) -> bool:
|
|
return self._is_declared
|
|
|
|
def getShortcutType(self) -> int:
|
|
return self._shortcut_type
|
|
|
|
def getLastChangedTimestamp(self) -> int:
|
|
return self._last_changed_timestamp
|
|
|
|
def isLongLived(self) -> bool:
|
|
return self._long_lived
|
|
|
|
def hasIconResource(self) -> bool:
|
|
return self._icon_resource is not None
|
|
|
|
def getIconResource(self) -> Optional[Intent.ShortcutIconResource]:
|
|
return self._icon_resource
|
|
|
|
def setRank(self, rank: int) -> None:
|
|
self._rank = rank
|
|
|
|
def setCategories(self, categories: Set[str]) -> None:
|
|
self._categories = set(categories)
|
|
|
|
def addCategory(self, category: str) -> None:
|
|
self._categories.add(category)
|
|
|
|
def toString(self) -> str:
|
|
return (f"ShortcutInfo(id={self._id}, "
|
|
f"shortLabel={self._short_label}, "
|
|
f"rank={self._rank})")
|
|
|
|
def equals(self, other: Any) -> bool:
|
|
if not isinstance(other, ShortcutInfo):
|
|
return False
|
|
return self._id == other._id
|
|
|
|
def hashCode(self) -> int:
|
|
return hash(self._id) & 0x7FFFFFFF
|
|
|
|
|
|
# ═══════════════════════════════════════════════════════════════
|
|
# ShortcutManager
|
|
# ═══════════════════════════════════════════════════════════════
|
|
|
|
class ShortcutManager(Stub):
|
|
"""ShortcutManager — 快捷方式管理器 (扩展)"""
|
|
|
|
FLAG_MATCH_CACHED = 0x00000001
|
|
FLAG_MATCH_DYNAMIC = 0x00000002
|
|
FLAG_MATCH_MANIFEST = 0x00000004
|
|
FLAG_MATCH_PINNED = 0x00000008
|
|
FLAG_GET_ALL = (FLAG_MATCH_DYNAMIC | FLAG_MATCH_MANIFEST | FLAG_MATCH_PINNED)
|
|
RESULT_OK = 0
|
|
RESULT_FAILURE = -1
|
|
RESULT_DISABLED = -2
|
|
RESULT_DUPLICATE = -3
|
|
RESULT_MAX_SHORTCUTS_REACHED = -4
|
|
RESULT_PINNED_MAX_SHORTCUTS_REACHED = -5
|
|
RESULT_CALLER_NOT_ALLOWED = -6
|
|
RESULT_PACKAGE_NOT_FOUND = -7
|
|
RESULT_STORAGE_FULL = -8
|
|
|
|
def __init__(self, context: Optional[Any] = None):
|
|
super().__init__()
|
|
self._context = context
|
|
self._dynamic_shortcuts: Dict[str, ShortcutInfo] = {}
|
|
self._pinned_shortcuts: Dict[str, ShortcutInfo] = {}
|
|
self._manifest_shortcuts: Dict[str, ShortcutInfo] = {}
|
|
self._cached_shortcuts: Dict[str, ShortcutInfo] = {}
|
|
self._max_shortcut_count_per_activity = 5
|
|
self._icon_max_width = -1
|
|
self._icon_max_height = -1
|
|
self._rate_limit_attempts = 0
|
|
self._shortcuts_changed_listeners: List[Any] = []
|
|
|
|
def setDynamicShortcuts(self, shortcutInfos: List[ShortcutInfo]) -> bool:
|
|
self._dynamic_shortcuts.clear()
|
|
for info in shortcutInfos:
|
|
self._dynamic_shortcuts[info.getId()] = info
|
|
return True
|
|
|
|
def getDynamicShortcuts(self) -> List[ShortcutInfo]:
|
|
return list(self._dynamic_shortcuts.values())
|
|
|
|
def getManifestShortcuts(self) -> List[ShortcutInfo]:
|
|
return list(self._manifest_shortcuts.values())
|
|
|
|
def getPinnedShortcuts(self) -> List[ShortcutInfo]:
|
|
return list(self._pinned_shortcuts.values())
|
|
|
|
def getCachedShortcuts(self) -> List[ShortcutInfo]:
|
|
return list(self._cached_shortcuts.values())
|
|
|
|
def addDynamicShortcuts(self, shortcutInfos: List[ShortcutInfo]) -> bool:
|
|
for info in shortcutInfos:
|
|
self._dynamic_shortcuts[info.getId()] = info
|
|
return True
|
|
|
|
def removeDynamicShortcuts(self, shortcutIds: List[str]) -> None:
|
|
for sid in shortcutIds:
|
|
self._dynamic_shortcuts.pop(sid, None)
|
|
|
|
def removeAllDynamicShortcuts(self) -> None:
|
|
self._dynamic_shortcuts.clear()
|
|
|
|
def disableShortcuts(self, shortcutIds: List[str],
|
|
disabledMessage: str = "") -> None:
|
|
for sid in shortcutIds:
|
|
if sid in self._dynamic_shortcuts:
|
|
self._dynamic_shortcuts[sid]._is_enabled = False
|
|
if sid in self._pinned_shortcuts:
|
|
self._pinned_shortcuts[sid]._is_enabled = False
|
|
|
|
def enableShortcuts(self, shortcutIds: List[str]) -> None:
|
|
for sid in shortcutIds:
|
|
if sid in self._dynamic_shortcuts:
|
|
self._dynamic_shortcuts[sid]._is_enabled = True
|
|
if sid in self._pinned_shortcuts:
|
|
self._pinned_shortcuts[sid]._is_enabled = True
|
|
|
|
def getShortcuts(self, matchFlags: int = FLAG_GET_ALL) -> List[ShortcutInfo]:
|
|
result: List[ShortcutInfo] = []
|
|
if matchFlags & ShortcutManager.FLAG_MATCH_DYNAMIC:
|
|
result.extend(self._dynamic_shortcuts.values())
|
|
if matchFlags & ShortcutManager.FLAG_MATCH_PINNED:
|
|
result.extend(self._pinned_shortcuts.values())
|
|
if matchFlags & ShortcutManager.FLAG_MATCH_MANIFEST:
|
|
result.extend(self._manifest_shortcuts.values())
|
|
if matchFlags & ShortcutManager.FLAG_MATCH_CACHED:
|
|
result.extend(self._cached_shortcuts.values())
|
|
return result
|
|
|
|
def updateShortcuts(self, shortcutInfos: List[ShortcutInfo]) -> bool:
|
|
for info in shortcutInfos:
|
|
sid = info.getId()
|
|
if sid in self._dynamic_shortcuts:
|
|
self._dynamic_shortcuts[sid] = info
|
|
if sid in self._pinned_shortcuts:
|
|
self._pinned_shortcuts[sid] = info
|
|
return True
|
|
|
|
def isRateLimitingActive(self) -> bool:
|
|
return self._rate_limit_attempts > 5
|
|
|
|
def getIconMaxWidth(self) -> int:
|
|
return self._icon_max_width
|
|
|
|
def getIconMaxHeight(self) -> int:
|
|
return self._icon_max_height
|
|
|
|
def pushDynamicShortcut(self, shortcut: ShortcutInfo) -> None:
|
|
self._dynamic_shortcuts[shortcut.getId()] = shortcut
|
|
|
|
def removeLongLivedShortcuts(self, shortcutIds: List[str]) -> None:
|
|
for sid in shortcutIds:
|
|
self._dynamic_shortcuts.pop(sid, None)
|
|
self._pinned_shortcuts.pop(sid, None)
|
|
|
|
def onApplicationActive(self, packageName: str, userId: int) -> None:
|
|
"""应用激活回调 (桌面存根)"""
|
|
pass
|
|
|
|
def registerShortcutsChangedListener(
|
|
self, listener: Any, handler: Any = None) -> None:
|
|
self._shortcuts_changed_listeners.append(listener)
|
|
|
|
def unregisterShortcutsChangedListener(self, listener: Any) -> None:
|
|
if listener in self._shortcuts_changed_listeners:
|
|
self._shortcuts_changed_listeners.remove(listener)
|
|
|
|
def reportShortcutUsed(self, shortcutId: str) -> None:
|
|
"""报告快捷方式被使用"""
|
|
pass
|
|
|
|
def setShareTargets(self, packageName: str, shareTargets: List[Any]) -> None:
|
|
"""设置分享目标 (桌面存根)"""
|
|
pass
|
|
|
|
def getShareTargets(self, packageName: str) -> List[Any]:
|
|
"""获取分享目标 (桌面存根)"""
|
|
return []
|
|
|
|
def getMaxShortcutCountPerActivity(self) -> int:
|
|
return self._max_shortcut_count_per_activity
|
|
|
|
def toString(self) -> str:
|
|
return (f"ShortcutManager(dynamic={len(self._dynamic_shortcuts)}, "
|
|
f"pinned={len(self._pinned_shortcuts)})") |