极力推荐Android 开发大总结文章:欢迎收藏 程序员Android 力荐 ,Android 开发者须要的必备技能 java
Android 8.0 Oreo
更智能、更迅捷、更强大。广受世人喜好的不只仅是曲奇饼干,更是为您打造的全新 Android
系统。Android 8.0
为用户和开发者引入多种新功能。本文重点介绍面向开发者的新功能。 请务必查阅 Android 8.0
行为变动以了解平台变动可能影响您的应用的领域。 经过本篇文章阅读,您将获取到如下内容:android
- 新的 StrictMode 检测程序
- 缓存数据
- 内容提供程序分页
- 内容刷新请求
- JobScheduler 改进
- 自定义数据存储
- findViewById() 签名变动
- 媒体加强功能
- MediaPlayer
- 音频播放控制
- 加强的媒体文件访问功能
- 自定义文档提供程序
- 链接
- 共享
- 智能文本选择
- 无障碍功能
- 独立的音量调整
- 指纹手势
- 字词级突出显示
- 标准化单端范围值
- 提示文本
- 安全性与隐私
- 新的账号访问和 Discovery API
- Google Safe Browsing API
- 测试
- 运行时和工具
- Android 企业版
Android 8.0
添加了三个新的 StrictMode
检测程序,帮助识别应用可能出现的错误:程序员
detectUnbufferedIo()
将检测您的应用什么时候读取或写入未缓冲的数据,这可能极大影响性能。detectContentUriWithoutPermission()
将检测您的应用在其外部启动 Activity 时什么时候意外忘记向其余应用授予权限。detectUntaggedSockets()
将检测您的应用什么时候使用网络流量,而不使用 setThreadStatsTag(int)
将流量标记用于调试目的。Android 8.0
优化了缓存数据的导航和行为。如今,每一个应用均得到必定的磁盘空间配额,用于存储 getCacheQuotaBytes(UUID)
返回的缓存数据。数据库
当系统须要释放磁盘空间时,将开始从超过配额最多的应用中删除缓存文件。所以,若是将您的缓存数据量始终保持低于配额的水平,则在必须清除系统中的某些文件时,您的缓存文件将能坚持到最后。系统在决定删除您的应用中的哪些缓存文件时,将首先考虑删除最旧的文件(由修改时间肯定)。编程
您还能够针对每一个目录启用两种新行为,以控制系统如何释放缓存数据:数组
StorageManager.setCacheBehaviorAtomic()
可用于指示某个目录及其全部内容应做为一个不可分割的总体进行删除。setCacheBehaviorTombstone(File, boolean)
可用于指示不该删除某个目录内的文件,而应将它们截断到 0 字节长度,使空文件保持无缺。 最后,在须要为大文件分配磁盘空间时,可考虑使用新的 allocateBytes(FileDescriptor, long) API
,它将自动清除属于其余应用的缓存文件(根据须要),以知足您的请求。在肯定设备是否有足够的磁盘空间保存您的新数据时,请调用 getAllocatableBytes(UUID)
而不要使用 getUsableSpace()
,由于前者会考虑系统要为您清除的任何缓存数据。咱们已更新内容提供程序以支持加载大型数据集,每次加载一页。例如,一个具备大量图像的照片应用可查询要在页面中显示的数据的子集。内容提供程序返回的每一个结果页面由一个 Cursor 对象表示。客户端和提供程序必须实现分页才能利用此功能。缓存
如需了解有关内容提供程序变动的详细信息,请参阅 ContentProvider
和 ContentProviderClient
。安全
#4 . 内容刷新请求bash
如今,ContentProvider
和ContentResolver
类均包含 refresh()
函数,这样,客户端能够更轻松地知道所请求的信息是否为最新信息。微信
您能够扩展ContentProvider
以添加自定义的内容刷新逻辑。请务必重写refresh()
函数,以返回true
,告知提供程序的客户端您已尝试自行刷新数据。
您的客户端应用可经过调用另外一个函数(又称 refresh())
,显式请求已刷新的内容。在调用此函数时,传入待刷新数据的URI
。
注:因为您可能经过网络不断请求数据,您应仅在有明显迹象代表内容确已过期时才从客户端调用 refresh()。执行此类内容刷新最多见的缘由是响应滑动刷新手势,该手势显式请求当前界面显示最新内容。
Android 8.0
引入了对 JobScheduler
的多项改进。因为您一般可使用计划做业替代如今受限的后台服务或隐式广播接收器,这些改进可让您的应用更轻松地符合新的后台执行限制。
JobScheduler 的更新包括:
JobScheduler.enqueue()
。看成业运行时,它能够将待定工做从队列中剥离并进行处理。这种功能能够处理以前须要启动后台服务(尤为是实现 IntentService
的服务)的许多用例。JobInfo.Builder.setClipData()
的方式将ClipData
与做业关联。利用此选项,您能够将 URI 权限授予与做业关联,相似于这些权限传递到 Context.startService()
的方式。您也能够将 URI 权限授予用于工做队列上的intent
。JobInfo.isRequireStorageNotLow()
若是设备的可用存储空间很是低,做业将不会运行。 JobInfo.isRequireBatteryNotLow()
若是电池电量等于或低于临界阈值,做业将不会运行;临界阈值是指设备显示 Low battery warning 系统对话框的电量。 NETWORK_TYPE_METERED
做业须要一个按流量计费的网络链接,好比大多数移动数据网络数据套餐。Android 8.0 容许您为首选项提供自定义数据存储,若是您的应用将首选项存储在云或本地数据库中,或者若是首选项特定于某个设备,此功能会很是有用。如需了解有关实现数据存储的详细信息,请参阅自定义数据存储。
如今,findViewById()
函数的所有实例均返回 <T extends View> T
,而不是 View
。此变动会带来如下影响:
someMethod(View)
和 someMethod(TextView)
均接受调用findViewById()
的结果,这可能致使现有代码的返回类型不肯定。assertNotNull(findViewById(...)).someViewMethod()))
显式转换为 View。findViewById()
函数(例如,Activity.findViewById())将须要更新其返回类型。有一个新的 VolumeShaper
类。您能够用它来执行简短的自动音量转换,例如淡入、淡出和交叉淡入淡出。
音频应用经过请求和舍弃音频焦点的方式在设备上共享音频输出。应用经过启动或中止播放或者闪避音量的方式处理处于聚焦状态的变动。有一个新的 AudioFocusRequest
类。对于此类,应用在处理音频焦点变化时会使用新功能:自动闪避和延迟聚焦
。
新的 getMetrics()
函数将返回一个包含配置和性能信息的 PersistableBundle
对象,用一个包含属性和值的地图表示。为如下媒体类定义 getMetrics()
函数:
为每一个实例单独收集指标,并持续到实例的生命周期结束为止。若是没有可用的指标,则此函数将返回 null。返回的实际指标取决于类。
Android 8.0 为 MediaPlayer
类添加了多种新函数。这些函数能够从多个方面加强您的应用处理媒体播放的能力:
在搜索帧时进行精细控制。 播放受数字版权管理保护的材料的功能。 MediaPlayer 如今支持采样级加密。
音频录制器如今支持对流式传输有用的 MPEG2_TS 格式:
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS);
请参阅 MediaRecorder.OutputFormat
MediaMuxer
如今能够处理任意数量的音频和视频流,而再也不仅限于一个音频曲目和/或一个视频曲目。使用 addTrack()
可混录所需的任意数量的曲目。
MediaMuxer
还能够添加一个或多个包含用户定义的每帧信息的元数据曲目。元数据的格式由您的应用定义。仅对 MP4 容器支持元数据曲目。 元数据能够用于离线处理。例如,传感器的陀螺仪信号能够用于执行视频稳定操做。
在添加元数据曲目时,曲目的 MIME
格式必须之前缀“application/”
开头。除了数据不是来源于 MediaCodec
之外,写入元数据的操做与写入视频/音频数据相同。相反,应用将包含相关时间戳的 ByteBuffer
传递给 writeSampleData()
函数。时间戳必须和视频及音频曲目处于相同的时基。
生成的 MP4 文件使用 ISOBMFF 的 12.3.3.2 部分定义的 TextMetaDataSampleEntry
,指示元数据的 MIME 格式。在使用MediaExtractor 提取包含元数据曲目的文件时,元数据的 MIME 格式将提取到
MediaFormat` 中。
Android 8.0 容许您查询和请求设备产生声音的方式。对音频播放的如下控制将让您的服务更轻松地仅在有利的设备条件下产生声音。
Google 智能助理的新音频使用类型 AudioAttributes
类包含一种新的声音类型,即 USAGE_ASSISTANT
,对应于 Google 智能助理在设备上的回答。
若是您但愿本身的服务仅在特定的设备音频配置处于活动状态时开始产生声音,您可使用 AudioManager
类注册一个AudioManager.AudioPlaybackCallback
实例,后者的onPlaybackConfigChanged()
函数能够帮助您肯定当前活动的音频属性集。
您的服务可使用 requestAudioFocus()
函数提交一个更精细的设备级音频焦点接收请求。传入一个 AudioFocusRequest
对象,您可使用 AudioFocusRequest.Builder
建立这个对象。在这个构建类中,您能够指定如下选项:
AUDIOFOCUS_GAIN_TRANSIENT 或 AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK
。注:构建您的
AudioFocusRequest
实例时,若是您经过调用setAcceptsDelayedFocusGain()
指示您的服务能够等待产生声音,您也必须调用setOnAudioFocusChangeListener()
,以便您的服务了解它什么时候能够开始产生声音。
存储访问框架 (SAF)
容许应用显示自定义 DocumentsProvider
,后者能够为其余应用提供访问数据源中的文件的权限。事实上,文档提供程序甚至能够提供驻留在网络存储区或使用媒体传输协议 (MTP)
等协议的文件的访问权限。
可是,访问远程数据源中的大媒体文件面临一些挑战:
媒体播放器须要以寻址方式访问来自文档提供程序的文件。当大媒体文件驻留在远程数据源上时,文档提供程序必须事先提取全部数据,并建立快照文件描述符。媒体播放器没法播放没有文件描述符的文件,所以在文档提供程序完成文件下载前,没法开始播放。
照片应用等媒体集合管理器必须经过做用域文件夹遍历一系列访问 URI 才能访问存储在外部SD
卡上的媒体。这种访问模式会让媒体上的批量操做(例如移动、复制和删除)变得很是缓慢。
媒体集合管理器没法根据文档的 URI
肯定其位置。这就让这些类型的应用难以容许用户选择媒体文件的保存位置。 Android 8.0
经过改进存储访问框架解决了各个挑战。
##12. 自定义文档提供程序
从Android 8.0
开始,存储访问框架容许自定义文档提供程序为驻留在远程数据源中的文件建立可寻址的文件描述符。SAF
可打开文件,获取原生可寻址的文件描述符。而后 SAF
向文档提供程序提交离散字节请求。此功能使文档提供程序能够返回媒体播放器应用请求的准确字节范围,而没必要事先缓存整个文件。
要使用此功能,您须要调用新的 StorageManager.openProxyFileDescriptor()
函数。openProxyFileDescriptor()
函数可接受 ProxyFileDescriptorCallback
对象做为回调。任什么时候候,当客户端应用对文档提供程序返回的文件描述符执行文件操做时,SAF 都会调用回调。
从 Android 8.0
开始,您可使用 getDocumentUri()
函数得到与给定 mediaUri
引用相同文档的 URI
。不过,因为返回的 URI
由 DocumentsProvider
提供支持,媒体集合管理器能够直接访问文档,不用遍历做用域目录树。所以,媒体管理器可以以明显加快的速度对文档执行文件操做。
注意:getDocumentUri() 函数仅能够定位媒体文件;没法授予应用访问这些文件的权限。要详细了解如何获取媒体文件的访问权限,请参阅参考文档。
在 Android 8.0 中使用存储访问框架时,您能够根据文档的 ID,使用 findDocumentPath()
函数(存在于 DocumentsContract
和 DocumentsProvider
类中)从文件系统的根目录中肯定路径。该函数将在 DocumentsContract.Path
对象中返回此路径。若是文件系统对相同文档有多个定义的路径,该函数将返回访问具备给定 ID 的文档时最常使用的路径。
您的应用使用能够显示特定文档位置的“另存为”对话框。
您的应用在搜索结果视图中显示文件夹而且若是用户选择某个文件夹,应用必须加载此特定文件夹内的子文档。
注:若是您的应用仅具备路径中某些文档的访问权限,那么 findDocumentPath() 的返回值将仅包含您的应用能够访问的文件夹和文档。
Android 8.0 新增了对 WLAN 感知的支持,此技术基于周边感知联网 (NAN) 规范。在具备相应 WLAN 感知硬件的设备上,应用和附近设备能够经过 WLAN 进行搜索和通讯,无需依赖互联网接入点。咱们正在与硬件合做伙伴合做,以尽快将 WLAN 感知技术应用于设备。要了解有关如何将 WLAN 感知集成到您的应用中的信息,请参阅 WLAN 感知。
Android 8.0 经过增长如下功能,加强了平台对蓝牙的支持:
支持 AVRCP 1.4 标准,该标准支持音乐库浏览。 支持蓝牙低功耗 (BLE) 5.0 标准。 将 Sony LDAC 编解码器集成到蓝牙堆叠中。
在尝试经过蓝牙、BLE 和 WLAN 与配套设备配对时,Android 8.0 提供的 API 容许您自定义配对请求对话框。如需了解详细信息,请参阅配套设备配对。
如需了解有关在 Android 上使用蓝牙的详细信息,请参阅蓝牙指南。有关对蓝牙所做的特定于 Android 8.0 的变动,请参阅 Android 8.0 行为变动页面的蓝牙部分。
#14. 共享
Android 8.0 了解用户的个性化分享首选项,在经过哪些应用分享各个类型的内容方面,也有着更好的把握。例如,若是用户为一张收据拍照,Android 8.0 能够建议费用跟踪应用;若是用户自拍,一款社交媒体应用能够更好地处理图像。Android 8.0 能够根据用户的个性化首选项自动学习全部这些模式。
智能分享适用于 image 以外的内容类型,例如 audio、video、text 和 URL 等。
要启用智能分享,请将具备最多三个字符串注释的 ArrayList 添加到分享内容的 intent。这些注释应说明内容中的主要部分或主题。下面的代码示例显示了如何向 intent 添加注释:
ArrayList<String> annotations = new ArrayList<>();
annotations.add("topic1");
annotations.add("topic2");
annotations.add("topic3");
intent.putStringArrayListExtra(
Intent.EXTRA_CONTENT_ANNOTATIONS,
annotations
);
复制代码
如需了解有关智能分享注释的详细信息,请参阅 EXTRA_CONTENT_ANNOTATIONS。
在兼容设备上,Android 8.0 让应用能够帮助用户以更有意义的方式与文本交互。当用户长按某个实体中可识别格式的单词(例如某个地址或餐馆名称)时,系统会选中整个实体。用户会看到一个浮动工具栏,该工具栏包含能够处理所选文本实体的应用。例如,若是系统识别出某个地址,它能够将用户导向地图应用。
系统识别的实体包括地址、网址、电话号码和电子邮件地址。如需了解详细信息,请参阅 TextClassifier。
#16. 无障碍功能 Android 8.0 支持开发者使用如下无障碍功能建立本身的无障碍服务。如需了解有关如何让您的应用更便于访问的更多信息,请参阅无障碍功能。
您的无障碍服务如今能够请求在系统的导航区域显示无障碍功能按钮,该按钮让用户可从其设备上的任意位置快速激活您的服务功能。要执行此操做,请在某个 AccessibilityServiceInfo
对象的 android:accessibilityFlags
属性中添加 FLAG_REQUEST_ACCESSIBILITY_BUTTON
标志。稍后,您可使用registerAccessibilityButtonCallback()
注册回调。
注:此功能仅适用于提供软件渲染导航区域的设备。请始终使用
isAccessibilityButtonAvailable()
,并经过实现onAvailabilityChanged()
根据无障碍功能按钮的可用性来响应变动。经过该方式,用户能够始终访问您的服务功能,即便该无障碍功能按钮不受支持或变得不可用。
Android 8.0 引入了STREAM_ACCESSIBILITY
音量类别,容许您单独控制无障碍服务音频输出的音量,而不会影响设备上的其余声音。
要使用这个新的流类型来控制无障碍服务音量,请在无障碍服务中设置 FLAG_ENABLE_ACCESSIBILITY_VOLUME
选项。而后,您可使用adjustStreamVolume()
更改设备的无障碍服务音频音量。
您的无障碍服务也能够响应替代的输入机制,即沿设备的指纹传感器按特定方向滑动(上、下、左和右)。要接收有关这些交互的回调,请完成如下一系列步骤:
USE_FINGERPRINT
权限和 CAPABILITY_CAN_REQUEST_FINGERPRINT_GESTURES
功能。android:accessibilityFlags 属性中设置
FLAG_REQUEST_FINGERPRINT_GESTURES `标志。registerFingerprintGestureCallback()
注册回调。 请记住,并不是全部设备都包含指纹传感器。您可使用 isHardwareDetected()
函数识别设备是否支持此传感器。即便对于包含指纹传感器的设备,您的服务也只有在指纹传感器不用于身份验证目的时才可以使用它。要识别此传感器什么时候可用,请调用 isGestureDetectionAvailable()
函数并实现 onGestureDetectionAvailabilityChanged()
回调。要肯定 TextView
对象中可见字符的位置,您能够在 EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY
中将其做为第一个参数传递到 refreshWithExtraData()
中。随后会更新您为refreshWithExtraData()
提供的做为第二个参数的 Bundle
对象,使之包含一个可打包的 Rect
对象数组。每一个 Rect 对象表明某个特定字符的边界框。
若是您的服务使用 TextToSpeech
对象朗读屏幕上出现的内容,您能够获取有关文本到语音转换引擎什么时候开始朗读单个合成字词时的准确时间信息,前提是文本到语音转换引擎提供此信息。当引擎即将开始播放特定范围文本的音频时,Text-to-Speech API
会通知您的服务,将使用 onRangeStart()
函数开始朗读此范围的文本。
若是您建立本身的 TextToSpeechService
实现,您可使用rangeStart()
函数支持这一新功能。
AccessibilityNodeInfo
的一些实例使用 AccessibilityNodeInfo.RangeInfo
的某个实例来代表界面元素可接受必定范围的值。使用 RangeInfo.obtain()
建立范围或使用getMin()
和 getMax()
检索此范围的极值时,请注意,Android 8.0 规定了标准化单端范围:
Android 8.0 包含可用于与文本可编辑对象的提示文本进行交互的多个函数:
getHintText()。
您的服务如今可使用 GestureDescription.StrokeDescription
构造函数中的最后一个参数 willContinue,指定属于同一设定手势的笔划的顺序
Android 8.0 引入了多个与电话有关的新权限:
ANSWER_PHONE_CALLS
容许您的应用经过编程方式接听呼入电话。要在您的应用中处理呼入电话,您可使用 acceptRingingCall()
函数。READ_PHONE_NUMBERS
权限容许您的应用读取设备中存储的电话号码。 这些权限均被划分为危险
类别,属于 PHONE 权限组。#23. 新的账号访问和 Discovery API
Android 8.0 对应用访问用户账号的方式引入多项改进。对于由身份验证器管理的账号,身份验证器在决定对应用隐藏账号仍是显示账号时可使用本身的策略。Android 系统跟踪能够访问特定账号的应用。
在之前的 Android 版本中,想要跟踪用户账号列表的应用必须获取有关全部账号的更新,包括具备不相关类型的账号。Android 8.0 添加了 addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, java.lang.String[])
函数,其容许应用指定应接收账号变动的账号类型列表。
API 变动 AccountManager
提供六个新函数以帮助身份验证器管理哪些应用能够查看某个账号:
setAccountVisibility(android.accounts.Account, java.lang.String, int)
:针对特定用户账号和软件包组合设置可见性级别。getAccountVisibility(android.accounts.Account, java.lang.String)
:获取特定用户账号和软件包组合的可见性级别。getAccountsAndVisibilityForPackage(java.lang.String, java.lang.String)
:容许身份验证器获取账号和给定软件包的可见性级别。getPackagesAndVisibilityForAccount(android.accounts.Account)
:容许身份验证器获取存储的给定账号的可见性值。addAccountExplicitly(android.accounts.Account, java.lang.String, android.os.Bundle, java.util.Map<java.lang.String, java.lang.Integer>)
:容许身份验证器初始化账号的可见性值。addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, java.lang.String[])
:将 OnAccountsUpdateListener
侦听器添加到AccountManager
对象。不管设备上的账号列表什么时候发生变化,系统都将调用此侦听器。 Android 8.0 引入两个特殊的软件包名称值,以使用 setAccountVisibility(android.accounts.Account, java.lang.String, int)
函数指定未设置的应用的可见性级别。PACKAGE_NAME_KEY_LEGACY_VISIBLE
可见性值应用于具备 GET_ACCOUNTS
权限的应用,而且其目标 Android 版本低于 Android 8.0,或其签名与针对任意 Android 版本的身份验证器匹配。PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE
为以前未设置的应用提供默认的可见性值,对于此类应用,PACKAGE_NAME_KEY_LEGACY_VISIBLE
不适用。如需了解有关新的账号访问和发现 API 的详细信息,请参阅 AccountManager
和OnAccountsUpdateListener
参考。
WebView 类如今添加了一个Safe Browsing API
来加强网络浏览的安全性。如需了解详细信息,请参阅 Google Safe Browsing API。
Android 8.0 为应用的仪器测试提供如下几项额外支持。
如今,您能够指定针对您的应用的默认进程之外的进程运行特定仪器测试。若是您的应用包含多个在不一样进程中运行的操做组件,此配置很是有用。
要定义非默认进程仪器测试,请导航至您的清单文件,而后导航至所需的<instrumentation>
元素。添加 android:targetProcess
属性,并将它的值设置为如下值之一:
在测试过程当中报告结果 如今,经过调用 addResults(),您能够在执行仪器测试时(而不用等到测试后)报告结果。
为了更轻松地为您应用的操做组件建立隔离、独立的界面测试,Android 8.0 引入了 onStartActivity() 函数。要处理您的测试类调用的特定 intent,您能够在 Instrumentation.ActivityMonitor
类的自定义子类中替换此函数。
当您的测试类调用 intent 时,该函数将返回一个存根 Instrumentation.ActivityResult 对象,而不是执行 intent 自己。经过在您的测试中使用这种模拟 intent 逻辑,您能够侧重于本身的操做组件如何准备和处理您传递到不一样操做组件或彻底不一样的应用中的 intent。
Android 8.0 为平台引入了运行时优化和其余优化,这些优化将带来多项性能改进。这些优化包括并发压缩垃圾回收、更有效的内存利用和代码区域。
它们能够加快启动时间,并为 OS 和应用带来更好的性能。
Android 8.0 添加了对更多 OpenJDK Java API 的支持:
java.time
。java.nio.file
和java.lang.invoke
。 要详细了解这些新添加的软件包中的类和函数,请参阅 API 参考文档。若是您想要在 Android Studio 中使用 Java 8 语言功能,您应下载最新的预览版本。
更新的 ICU4J Android Framework API Android 8.0 扩展了 ICU4J Android 框架 API—,它是 ICU4J API 的子集—,供应用开发者在 android.icu 软件包中使用。这些 API 使用设备上具备的本地化数据。所以,您无需在 APK 中编译 ICU4J 库,从而减小 APK 占用空间。
如需详细了解针对受支持的 ICU4J API 的更新,请阅读版本说明。 #27. Android 企业版 已为运行 Android 8.0 的设备引入新的企业功能和 API。重要功能包括以下:
彻底托管的设备中的工做资料使企业能够在管理工做数据与我的数据的同时,将它们分离开来。 API 委派容许设备全部者和我的资料全部者将应用管理分配给其余应用。 配置流程中的用户体验改进措施(包含新的自定义选项)缩短了设置时间。 蓝牙、WLAN、备份和安全性方面的新增控制选项使企业能够更精细地管理设备。网络操做组件日志记录可帮助企业追查问题。 如需详细了解上述及其余新增 Android 企业版 API 和功能,请参阅企业中的 Android。
至此,本篇已结束,若有不对的地方,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!
若有侵权,请联系小编,小编对此深感抱歉,届时小编会删除文章,当即中止侵权行为,请您多多包涵。
既然都看到这里,领两个红包在走吧! 如下两个红包天天均可以领取
1.支付宝搜索 522398497,或扫码支付宝红包海报。
2.微信红包,微信扫一扫便可领取红包