Android Preference 初探

Android应用Preference相关及源码浅析(Preference组件家族篇) public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) | @deprecated,当Preference控件被点击时,触发该方法。到此可以看见PreferenceFragment里bind最终是交给了PreferenceScreen的bind来关联PreferenceFragment的ListView与PreferenceScreen的ListAdapter。 阅读详情

前言

做了好几个Android 应用的开发,虽然每次都用到Preference来配置应用程序的参数,但是每次都是套用以前的模式来做的,没有深究。这次遇到一个项目,重新写的PreferenceActivity,发现一些概念自己还是没哟完全搞清楚,就仔细研究了一下Prefenece,PreferenceActivity, SharedPreferences以及Preference Layout XML文件等若干类或文件之间的关系,基本上有了个较为全面的认识,这里简单记录一下,以供今后查阅和回忆,谁让我的记性不好呢,吐舌头。

1. Preference相关的类和函数介绍

PreferenceActivity :作为构建一个配置界面的基类,此类中包含一个ListView来管理各个配置项,也就是Preference,每个Preference都是ListView的一个Item。此listView从资源文件中的Preference Layout xml文件中经过inflate生成。
Preference Layout File :类似Activity的layout XML文件,不过里面的元素都是和Preference相关的,比如PreferenceScreen,PreferenceGroup,ListPreference等等。
Preference :此类对应PreferenceActvity中一个配置单位,相当于一个控件(view)。实际使用的都是此类的子类,比如ListPreference, CheckboxPreference。此类的一个实例,对应Preference 资源文件中的一个元素。
SharedPreferences :这是一个接口类,提供一个抽象的接口,供应用中来访问和修改应用的而配置文件。此类提供诸如getInt(String key, boolean defValue)的方法来获取各种类型的配置值,其中“key” 是键值,Preference Layout File中定义各个Preference中的android:key属性,就要和这里对应。当让,此类也提供修改配置文件的方法,必须先使用edit( ) 函数获得一个SharedPreferences.Editor 对象,再使用这个对象的方法进行修改,修改完后还需要提交修改(commit( ))。这样设计的目的,手册中这样描述 :
             All changes you make in an editor are batched, and not copied back to the original SharedPreferences until you call commit() or apply()

PreferenceManager :此类提供一个很有用的静态函数getDefaultSharedPreference (Context context),返回一个SharedPreferences 对象,用来操作整个应用范围内共享的、缺省的、唯一的preference文件。

Activity.getPreferences(int mode) :返回一个SharedPreferences 对象,用来操作此Activity私有的、唯一的preference文件。保存在系统中的xml形式的文件的名称为这个Activity的名字。

ContextWrapper.getSharePreferences(String name, int mode) :返回一个SharedPreferences 对象,用来操作整个应用范围内共享的、指定名称的preference文件。也就是说,可以通过这个函数建立多个在应用范围内共享的preference文件,文件名由第一个参数指定。

2. Preference Layout XML文件和Preferences 文件

我开始在这个地方就有点混淆,经过查阅资料才稍微清晰些。

2.1 Preference 文件的访问

Preferences文件,是Android一种保存持久数据的方法(其他方式还有文件,数据库等),是Android数据持久化方法中最简单的一种,即使用Preferences的键值对存储方式。这种方式主要用来存储比较简单的一些数据,而且是标准的Boolean、Int、Float、Long、String等类型。

和此Preference相关的 android.content.SharedPreferences 是一个接口,用来获取和修改持久化存储的数据。有三种获取系统中保存的持久化数据的方式:

1. public SharedPreferences getPreferences (int mode)

    通过Activity对象获取,获取的是本Activity私有的Preference,保存在系统中的xml形式的文件的名称为这个Activity的名字,因此一个Activity只能有一个,属于这个Activity。

2. public SharedPreferences getSharedPreferences (String name, int mode)

    因为Activity继承了ContextWrapper,因此也是通过Activity对象获取,但是属于整个应用程序,可以有多个,以第一参数的name为文件名保存在系统中。

3. public static SharedPreferences getDefaultSharedPreferences (Context context)

    PreferenceManager的静态函数,保存PreferenceActivity中的设置,属于整个应用程序,但是只有一个,Android会根据包名和PreferenceActivity的布局文件来起一个名字保存。

    通过以上方式取得SharedPreferences后就可以对数据进行读取或者保存了。


2.2  Preference 文件的存放位置

这些文件是应用私有的,手机上安装程序后,一般放在/data/data/包名/shared_prefs/ 目录下。从前一章的分析可以看出,一个应用可能有多个preference文件,而且生成的方式各有不同:可能是缺省生成的,也可能是程序中制定文件名生成的。

例如,在Android 自带的Browser应用中,在从未运行的情况下,此目录下只有一个preference文件:com.android.browser_preferences.xml 

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<boolean name="enable_hardware_accel_skia" value="false" />
<boolean name="debug_menu" value="false" />
</map>
可以看出,此文件中记录了已经设定的配置项的name(key)/value pair,使用的是map概念。

在运行一次后,此目录下又增加了一个preference 文件:browser_recovery_prefs.xml

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<long name="last_recovered" value="0" />
</map>
从名字看,是来记录recover信息的。

接下来,在启动一次Settings界面后,并进入“Advance” Fragments后,com.android.browser_preferences.xml 文件内容发生了变化:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="default_text_encoding">Latin-1</string>
<boolean name="debug_menu" value="false" />
<boolean name="open_in_background" value="true" />
<boolean name="enable_javascript" value="true" />
<boolean name="load_page" value="true" />
<string name="plugin_state">ON</string>
<boolean name="autofit_pages" value="true" />
<boolean name="block_popup_windows" value="true" />
<string name="default_zoom">MEDIUM</string>
<boolean name="enable_hardware_accel_skia" value="false" />
<string name="search_engine">google</string>
<boolean name="reset_default_preferences" value="false" />
</map>

由此可以看出,com.android.browser_preferences.xml 文件算是Default 的preference 文件,在PreferenceActivity中加载Layout文件后,就会在这个文件里添加相应的items。而browser_recovery_prefs.xml可能就是程序运行时,代码建立的一个preference文件了。

2.3 Preference Layout XML 文件

Preference Layout XML文件是个资源文件,它的作用就是为PreferenceActivity提供layout;于此同时,在PreferenceActivity 加载这个资源文件之后,也会在应用的私有目录中建立一个与之对应的preference 文件,其命名方式是根据包名和Layout XML文件名来设定。当然也可以通过getPreferenceManager().setSharedPreferencesName("配置文件名")来设定。

3. 测试程序验证

为了进一步验证上面的分析,编写了一个简单的测试程序。

此程序有两个Activity。一个是主Activity,里面只有一个Button Widget,点击这个Button就会打开Prefence Activity。对应代码如下:

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        Button bt = (Button)findViewById(R.id.button1);
        
        bt.setOnClickListener(new OnClickListener(){

			public void onClick(View v) {
				Intent intent = new Intent(cxt, PrefActivity.class);
				startActivity(intent);
			}
        	
        });
    }

    private Context cxt = this;
}
另外一个是配置Activity,对应代码如下:

public class PrefActivity extends PreferenceActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        addPreferencesFromResource(R.xml.demo_pref);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.sh, menu);
        return true;
    }

}
其中红色代码部分加载了资源文件中的Preference Layout 文件demo_pref.xml , 它的内容如下:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
    <PreferenceCategory>
        <ListPreference android:entries="@array/pref_add_list_choices" android:entryValues="@array/pref_add_list_values" android:dialogTitle="Select Address" android:title="Address" android:summary="Select Address" android:key="add" android:defaultValue="cn"/>
    </PreferenceCategory>
    

</PreferenceScreen>

这里面只有一个ListPreference,用户如果点击的话,会弹出一个List Dialog,列出若干项供用户选择,截图如下:


我是在模拟器上测试的,可以童工DDMS工具看到此程序私有的文件目录。我查看了在不同情况下,preference 文件的出现时机和内容的变化情况。

1)当程序刚刚安装好后:

因为还未加载Preference Layout 文件,Android系统还未生成与之对应的default preference 文件。

2)当程序运行,但从未进入PreferenceActivty时:

因为还未加载Preference Layout 文件,Android系统还未生成与之对应的default preference 文件。

3)当程序首次进入PreferenceActivty, 尚未点击ListPreference 条目时:

因为已经加载了Preference Layout 文件,Android系统会在此应用的私有目录下生成一个shared_prefs目录,此目录下建立一个名为com.mutu.example.prefdemo_preferences.xml的default preference 文件。因为此程序的package名称为:com.mutu.example.prefdemo,所以猜测系统命名的方式就是简单地在包名后加上“_preferences.xml”。此时,文件内容如下:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="add">cn</string>
</map>
此时只保存了一个name/value 条目,因为Preference Layout 文件中只有一个ListPreference。而且取值也和ListPreference设置的Default Value一致。

4)当点击点击ListPreference 条目,选择一个item,然后返回后:

选择一个非缺省的值,此时preference 文件内容变化:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="add">au</string>
</map>
也就是在PreferenceActivity界面的造作,导致default preference文件内容发生变化。此后如果应用通过SharedPreferences接口访问这个文件,获得的“add”对应的值,就发生了变化。当让,在很多应用中,都是会监听此界面的修改,实时的改变程序运行的状态。

5)如果在程序中新建一个配置文件,分别利用Activity.getPreferences(int mode) 和ContextWrapper.getSharePreferences(String name, int mode) 来建立,相关代码如下:

        bt = (Button)findViewById(R.id.button2);
        bt.setOnClickListener(new OnClickListener(){

			public void onClick(View v) {
				// activity private preference
		        SharedPreferences prefs = ctx.getPreferences(MODE_PRIVATE);
		        SharedPreferences.Editor ed = prefs.edit();
		        ed.putBoolean("student", true);
		        ed.putString("country", "cn");
		        ed.commit();
			}
        	
        });
        
        bt = (Button)findViewById(R.id.button3);
        bt.setOnClickListener(new OnClickListener(){

			public void onClick(View v) {
				 // activity private preference
		        SharedPreferences prefs = ctx.getSharedPreferences("specfied_pref1",MODE_PRIVATE);
		        SharedPreferences.Editor ed = prefs.edit();
		        ed.putBoolean("man", true);
		        ed.putString("job", "sales");
		        ed.commit();	    
			}
        	
        });


分别点击增加的两个Button, 会在对应在shared_prefs目录下生成两个preference文件,分别是MainActivity.xml :

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<boolean name="student" value="true" />
<string name="country">cn</string>
</map>

和specified_pref1.xml:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="job">sales</string>
<boolean name="man" value="true" />
</map>
Activity私有的preference文件,使用它的类名+“.xml”来命名。在Android SDK文档中也有说明:
public SharedPreferences getPreferences (int mode)
Since: API Level 1

Retrieve a SharedPreferences object for accessing preferences that are private to this activity. This simply calls the underlying getSharedPreferences(String, int) method by passing in this activity's class name as the preferences name.

4. 总结

本文主要是从preference文件生成方法入手,通过一个简单的测试程序,粗浅的了解了Android系统处理Preference的生成对应文件的机制。

针对和应用相关的preference文件,总结以下几点:

  • 各种类型的Preference都对应着一个preference 文件
  • 具体应用根据需要,通过不同的方法,获取不同的SharePreferences接口实例,操作不同的preference文件
  • 概略上可以分为两种:一种从PreferenceActivity Layout 文件生成的preference;一种是通过Activity的preference相关函数建立。
时间有限,考虑的不是很全面,以后有机会再完善。



Android Preference深度解析:从声明式UI到状态管理的完整实践 在Android应用开发中,数据持久化与UI状态管理是构建稳定应用的基础。SharedPreferences作为轻量级存储方案,长期用于保存用户配置。而Preference组件则在此基础上,通过声明式XML配置实现了数据与UI的自动双向绑定,将开发者从繁琐的findViewById和手动同步中解放。这套机制的核心价值在于提升开发效率、降低模板代码,并确保设置页面的行为一致性。其应用场景广泛覆盖应用设置、用户偏好配置等模块。本文聚焦Android Preference的完整技术体系,详解其与SharedPre 阅读详情

相关推荐

Android存储:SharePreferences保存Map方法

场景:工作需要动态保存一个map,每次需要进行查询是否有某个元素,有的话就不保存,没有就保存 保存map /** * 用于保存集合 * * @param map map数据 * @return 保存结果 */ public static &lt;K, V&gt; boolean putHashMapData(Map&lt;K, V&g...

码点 7879

Preference中如何增加activity生命周期监听

Preference控件如何自定义应对Activity执行onStop或者onDestory生命周期方法的逻辑。

hailushijie的专栏 2761

DB2__基本概念——联邦

建立联邦 优点:优点是数据仍然保留在原来的存储位置,而不必建立一个集中的式数据仓储。  缺点:数据联邦查询反映会慢,不适合频繁查询,而且容易出现锁争用和资源冲突等问题 建立联邦表步骤 前提条件:知道两个数据库的ip,用户名,密码及被连数据库的版本 eg:  数据库  qqdb  ip: 22.5.225.225   端口:50000    密码:123456        数据库   ...

qq_38569524的博客 1257

自定义android偏好界面——Preference解析与自定义

    Preference用于android设置偏好界面,像设置界面就是用这个写的,其实就是xml文件,放在res/xml中,方便简单,如果直接用,有时候不符合自己App的风格、主题。下面我们就以android.support.v7.preference.ListPreference为例:上面就是ListPreference的所有属性,这里有个问题,mValueSet又是什么:mValueSet...

wk的博客 9202

基于大模型的自动驾驶智能体:Agent-Driver架构、训练与实战指南

自动驾驶系统正从传统的模块化流水线向以智能体为核心的新范式演进。其核心原理在于将车辆视为一个能够与环境持续交互的自主决策智能体,通过多模态感知、记忆管理和基于大模型的推理能力,实现对复杂交通场景的理解与应对。这一技术价值在于利用大模型的常识推理和泛化能力,有望解决传统方法在长尾场景下面临的挑战。在应用场景上,智能体驱动架构特别适合处理动态交互密集、需高层语义理解的城区驾驶、无保护转弯及突发状况应对。本文聚焦的Agent-Driver项目,正是这一方向的典型实践,它通过融合视觉、语言大模型与强化学习,构建了一

weixin_28729843的博客 529

ENVI学习总结(十二)——基于改进的 CASA 模型反演 NPP

基于改进的 CASA 模型反演 NPP 数据为地理空间数据云提供的 TM 影像,其具体信息如图 1 所示。该实验中所使用的 TM 数据已进行过 QUAC 快速大气校正,来消除大气和光照等因素对地物反射的影响。Landsat 主题成像仪(TM)是 Landsat4 和 Landsat5 携带的传感器,每 16 天扫描同一地区,即 16 天覆盖全球一次。 TM 影像包含 7 个波段,波段 1-5 ...

Arcgiser的博客 3万+

Android存储:sharedpreferences存储一个Map

最近突然项目中用到的sharedpreferences来存储一个Map集合,特来此记录一下可以让更多的小伙伴知道一下。 这里只是一个记录单独存储map的,可以直接用 String examtype = "examtype"; //存储Map public static void setMap(Context context, Map map) { if (

qq_38474512的博客 2452

别再手动配网了!用安信可PB-02模组+PHY Mesh App,5分钟搞定蓝牙Mesh智能灯群控

本文详细介绍了如何使用安信可PB-02模组和PHY Mesh App快速搭建蓝牙Mesh智能灯群控系统。通过5分钟的硬件连接和固件烧录,用户可实现多灯分组控制、场景切换及地理围栏等高级功能,显著提升智能家居部署效率。方案特别适合需要快速实现灯光群控的场景。

weixin_28675839的博客 419

Android SharedPreferences保存Map集合

Android中数据存储方式: 1 使用SharedPreferences存储数据; 2 文件存储数据; 3 SQLite数据库存储数据; 4 使用ContentProvider存储数据; 5 网络存储数据; 在开发中根据项目需要,选取合适的数据存储方式。 借此文章,记录一下自己在开发中利用SharedPreferences存储Map集合的实现方式: 存: public static Shared...

qq_39994562的博客 3151

手把手教你学Simulink--使用Simulink进行双冗余电机驱动系统的故障切换验证

提高系统可靠性:当一个电机或其驱动器出现故障时,另一个可以立即接管,避免系统停机。增强安全性:对于一些关键任务的应用场景(如飞行控制),确保即使在硬件故障情况下也能维持基本操作能力。简化维护:允许在不影响系统正常工作的情况下进行维护和更换故障部件。确定可能发生的故障类型(如过流、欠压、温度过高),以及每种故障对应的条件。通过上述步骤,我们简要介绍了如何基于Simulink实现双冗余电机驱动系统的故障切换验证。

MHD0815的博客 442

【DRAM存储器六十九】DDR5介绍--2N mode 和 CS Geardown mode

摘要: DDR5内存速率提升至8400MT/s以上时,信号完整性成为关键挑战。JEDEC在JESD79-5B标准中引入2N Mode和CS Geardown Mode两项技术,通过“时间换稳定性”优化时序裕量。2N Mode默认启用,将命令周期延长至两倍时钟周期,增强全局命令稳定性;CS Geardown Mode则针对片选信号(CS_n)降低采样频率,提升局部信号容错能力。两者均需通过特定寄存器配置,适用于高频场景下的性能与稳定性平衡。这些技术为DDR5在高频运行中提供了可靠的时序保障。

highman110的博客 226

Android下Preference初探

Android中有四种持久化数据的方法:SQLite数据库、文件存储、Preference、ContentProvider。 四种方法各有专攻,而其中Preference是以类似Map的键值对形式存储的,最适合用来保存用户个人设置之类的信息。 可以用一个xml文件来配置一个设置界面,然后用专门的PreferenceActivity将其显示。PreferenceActivit

u011833422的专栏 638

ubuntu下编译qtwebengine

ubuntu qtwebengine

tianyu的专栏 - Linux site:blog.youkuaiyun.com/wishfly 1463

Android Preference初探,另一种布局方式

记得android五大数据存储中有个SharePreferences,其他四种分别是: SQLite数据库 ContentProvider(内容提供者) 文件存储 网络存储 这里简单回顾一下SharePreference是的使用:// 1. 得到sharedPreferences,第一个参数指定SharePreference保存的xml文件的文件名,第二个参数是SharedPreferences模式

宿罪的博客 5686

蓝牙攻防实战:蓝牙技术详解

蓝牙作为轻量级、低功耗的无线通信技术,其设计兼顾了效率与灵活性,但也留下了诸多安全隐患。随着物联网设备的爆发式增长,蓝牙的攻击面也在不断扩大。理解其底层通信机制、协议栈结构以及配对加密逻辑,是提升无线安全防护能力的关键。

idlecloud0105的博客 740

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Android Preference详解

Preference 用来管理应用程序的偏好设置和保证使用这些的每个应用程序的所有参数 拥有同样的方式和用户体验   并且系统和其他应用程序的UI保持偏一致。 一个应用程序的偏好部分应作为一个独立的活动扩展preferenceactivity类 类中的对象应该是preferencescreen ,preferencescreen包含偏好等元素的布局的根元素 比如checkboxpreferenc

Tamic (大白) 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Android Preference简单介绍

想刀一个人的心是藏不住的,我要吐槽一下Google工程师;写代码就写代码,Settings代码非要写Preference那套布局.没怎么学过Preference相关知识,之前很多次想修改获取一直Settings里面的某个功能或者布局就看得蛋疼。PreferenceScreen、PreferenceCategory、SwitchPreference这个东西,看Settings里面的代码是一脸懵逼。如果你把Preference相关的类和布局当成普通类,想要修改一两个文件的布局界面和具体事件,

wenzhi的博客 4424

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Android Settings中Preference的理解以及使用

Android Settings中Preference的理解以及自定义修改Preference

hhbstudy的博客 4248

Android中的Preference

既然要先说说Preference组件家族基础,那不得不先简单说说这些Preference组件间的关系,相比以前低版本的API来说,谷歌官方又增加了一些实用的Preference组件,不过遗憾的是这里面有些是被hide掉的,有些是在com.android.internal.preference包下的,所以这些hide和com.android.internal.preference包的preference我们应用层是不能直接使用的。扯蛋了这么多,唉,叹个气继续吧,接下来就到了有意思的环节,源码结构简介。

HYYMCD的博客 2893

Android之Preference的使用

Preference的使用(大部分使用在设置Settings首选项) Preference直译为偏好,建议翻译为首选项。一些配置数据,一些我们上次点击选择的内容,我们希望在下次应用调起的时候依然有效,无须用户再一次进行配置或选择。Android提供preference这个键值对的方式来处理这种情况,自动保存这些数据,并立时生效,同时Android提供一种类似的layout的方式来进行Prefernce的布局。 1、概述 主题只有一个另一种构建UI的方式——通过preference去构建UI,而不是直.

qq_43722933的博客 4191

Android Preference 须知

Android Settings 须知     Vision Date Modifier Modification Reviewer 1.0 2014-10-23 Zhangqinglian App settings 开发须知          

Simple Android 3331

android preference控件,Android Preference 设置项简单使用详解

Preference 是Android App 中重要的控件之一,Settings 模块大部分都是通过 Preference 实现的。使用方法一般在 XML 文件夹中创建 xml 文件来对 Settings 进行布局,布局文件中通常使用 PreferenceScreen 容器,PreferenceScreen 包含多个 Preference 控件,PreferenceCategory 可以设置分类...

weixin_35714534的博客 3925

Android Preference的使用以及解析

重点在监听view变化,在变化后通过回调,将终值写入SharedPreferences,在初始化的时候读出值并赋给view。: 0)

ysqyes的博客 1243

Android Preference显示间隔线

要显示Preference的间隔线 关键就在于要同时配置这两个属性: app:allowDividerAbove="true" app:allowDividerBelow="true" <Preference app:allowDividerBelow="true" app:key="serial_num" app:summary="Unknown" app:title="序列号" /> <SwitchPreference app:all

lookfuyao的专栏 3260

Android Preference 笔记

需要从PreferenceScreen 中 删除某个Preference 1 . 先获取PreferenceScreen PreferenceScreen ps = getPreferenceScreen(); 2. 获取要删除的Preference Preference pf = findPreference(pfKey); // pfKey 为String类型 3. 删除 if (pf != null && ps != null) { ps.removePref.

whjk20的专栏 1162

android preference属性,Android进阶——Preference详解之Preference系的基本应用和管理(二)...

并非我们第一次打开相应界面之后就会自动创建对应的SharedPreferences文件,而是在我们改变了原有状态时候喎�"/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPjwvcD4NCjxwPjxzdHJvbmc+sqK3x8v509C1xFByZWZlcmVuY2W8sMbk19PA4La8u+G0tL2oo6y99r321...

weixin_40008135的博客 1342
上一篇: android BroadcastReceiver 生命周期的问题
下一篇: [转]有意思的12道C面试题及答案
mutu
博客等级 码龄24年 0粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值