- 浏览: 316656 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
a455642158:
xiajy 写道他妈的都该名字了,更可恶的金山手机助手是:sj ...
解决ADB server didn't ACK问题 -
wwt455653509:
关闭tadb.exe,重启eclipse搞定
解决ADB server didn't ACK问题 -
Frederic:
感谢,真是帮了大忙!腾讯
解决ADB server didn't ACK问题 -
xiajy:
他妈的都该名字了,更可恶的金山手机助手是:sjk_daemon ...
解决ADB server didn't ACK问题 -
xiaofeilv321:
赞同
解决ADB server didn't ACK问题
getSharedPreferences(String name, int mode) of Service的实现(转)
- 博客分类:
- android
I found a method getSharedPreferences(String name, int mode) in Service class
than I want to see how it implements
first I got a abstrat method in Context class
/android_opensource/frameworks/base/core/java/android/content/Context.java
and Service extends ContextWrapper, ContextWrapper extends Context just implements from a new Context instance
/android_opensource/frameworks/base/core/java/android/content/ContextWrapper.java
so where does it pass the Context instance to the Service
The Context instance must implements the method
than I found the implementation in ApplicationContext which extends the Context
android_opensource/frameworks/base/core/java/android/app/ApplicationContext.java
but I still did't found where it pass the ApplicationContext in
after few minutes search I found another class ActivityThread
It had a method handleCreateService which should be called when create a Service
android_opensource/frameworks/base/core/java/android/app/ActivityThread.java
In the method it call the service's method attch and pass a ApplicationContext as parameter
then The service's attch method would pass the context throght the attachBaseContext(context) method
android_opensource/frameworks/base/core/java/android/app/Service.java
android_opensource/frameworks/base/core/java/android/content/ContextWrapper.java
so the service get the Context instance which implement the getSharedPreferences(String name, int mode) method
the original url http://hi.baidu.com/ksoftware/blog/item/de17bbd6806b202507088bd8.html
than I want to see how it implements
first I got a abstrat method in Context class
/android_opensource/frameworks/base/core/java/android/content/Context.java
... 262 /** 263 * Retrieve and hold the contents of the preferences file 'name', returning 264 * a SharedPreferences through which you can retrieve and modify its 265 * values. Only one instance of the SharedPreferences object is returned 266 * to any callers for the same name, meaning they will see each other's 267 * edits as soon as they are made. 268 * 269 * @param name Desired preferences file. If a preferences file by this name 270 * does not exist, it will be created when you retrieve an 271 * editor (SharedPreferences.edit()) and then commit changes (Editor.commit()). 272 * @param mode Operating mode. Use 0 or {@link #MODE_PRIVATE} for the 273 * default operation, {@link #MODE_WORLD_READABLE} 274 * and {@link #MODE_WORLD_WRITEABLE} to control permissions. 275 * 276 * @return Returns the single SharedPreferences instance that can be used 277 * to retrieve and modify the preference values. 278 * 279 * @see #MODE_PRIVATE 280 * @see #MODE_WORLD_READABLE 281 * @see #MODE_WORLD_WRITEABLE 282 */ 283 public abstract SharedPreferences getSharedPreferences(String name, 284 int mode); ...
and Service extends ContextWrapper, ContextWrapper extends Context just implements from a new Context instance
/android_opensource/frameworks/base/core/java/android/content/ContextWrapper.java
... 132 @Override 133 public SharedPreferences getSharedPreferences(String name, int mode) { 134 return mBase.getSharedPreferences(name, mode); 135 } ...
so where does it pass the Context instance to the Service
The Context instance must implements the method
than I found the implementation in ApplicationContext which extends the Context
android_opensource/frameworks/base/core/java/android/app/ApplicationContext.java
... @Override 303 public SharedPreferences getSharedPreferences(String name, int mode) { 304 SharedPreferencesImpl sp; 305 File f = makeFilename(getPreferencesDir(), name + ".xml"); 306 synchronized (sSharedPrefs) { 307 sp = sSharedPrefs.get(f); 308 if (sp != null && !sp.hasFileChanged()) { 309 //Log.i(TAG, "Returning existing prefs " + name + ": " + sp); 310 return sp; 311 } 312 } 313 314 FileInputStream str = null; 315 File backup = makeBackupFile(f); 316 if (backup.exists()) { 317 f.delete(); 318 backup.renameTo(f); 319 } 320 321 // Debugging 322 if (f.exists() && !f.canRead()) { 323 Log.w(TAG, "Attempt to read preferences file " + f + " without permission"); 324 } 325 326 Map map = null; 327 if (f.exists() && f.canRead()) { 328 try { 329 str = new FileInputStream(f); 330 map = XmlUtils.readMapXml(str); 331 str.close(); 332 } catch (org.xmlpull.v1.XmlPullParserException e) { 333 Log.w(TAG, "getSharedPreferences", e); 334 } catch (FileNotFoundException e) { 335 Log.w(TAG, "getSharedPreferences", e); 336 } catch (IOException e) { 337 Log.w(TAG, "getSharedPreferences", e); 338 } 339 } 340 341 synchronized (sSharedPrefs) { 342 if (sp != null) { 343 //Log.i(TAG, "Updating existing prefs " + name + " " + sp + ": " + map); 344 sp.replace(map); 345 } else { 346 sp = sSharedPrefs.get(f); 347 if (sp == null) { 348 sp = new SharedPreferencesImpl(f, mode, map); 349 sSharedPrefs.put(f, sp); 350 } 351 } 352 return sp; 353 } 354 } ...
but I still did't found where it pass the ApplicationContext in
after few minutes search I found another class ActivityThread
It had a method handleCreateService which should be called when create a Service
android_opensource/frameworks/base/core/java/android/app/ActivityThread.java
... 2436 private final void handleCreateService(CreateServiceData data) { 2437 // If we are getting ready to gc after going to the background, well 2438 // we are back active so skip it. 2439 unscheduleGcIdler(); 2440 2441 PackageInfo packageInfo = getPackageInfoNoCheck( 2442 data.info.applicationInfo); 2443 Service service = null; 2444 try { 2445 java.lang.ClassLoader cl = packageInfo.getClassLoader(); 2446 service = (Service) cl.loadClass(data.info.name).newInstance(); 2447 } catch (Exception e) { 2448 if (!mInstrumentation.onException(service, e)) { 2449 throw new RuntimeException( 2450 "Unable to instantiate service " + data.info.name 2451 + ": " + e.toString(), e); 2452 } 2453 } 2454 2455 try { 2456 if (localLOGV) Log.v(TAG, "Creating service " + data.info.name); 2457 2458 ApplicationContext context = new ApplicationContext(); 2459 context.init(packageInfo, null, this); 2460 2461 Application app = packageInfo.makeApplication(); 2462 context.setOuterContext(service); 2463 service.attach(context, this, data.info.name, data.token, app, 2464 ActivityManagerNative.getDefault()); 2465 service.onCreate(); 2466 mServices.put(data.token, service); 2467 try { 2468 ActivityManagerNative.getDefault().serviceDoneExecuting(data.token); 2469 } catch (RemoteException e) { 2470 // nothing to do. 2471 } 2472 } catch (Exception e) { 2473 if (!mInstrumentation.onException(service, e)) { 2474 throw new RuntimeException( 2475 "Unable to create service " + data.info.name 2476 + ": " + e.toString(), e); 2477 } 2478 } 2479 } ...
In the method it call the service's method attch and pass a ApplicationContext as parameter
then The service's attch method would pass the context throght the attachBaseContext(context) method
android_opensource/frameworks/base/core/java/android/app/Service.java
... 356 public final void attach( 357 Context context, 358 ActivityThread thread, String className, IBinder token, 359 Application application, Object activityManager) { 360 attachBaseContext(context); 361 mThread = thread; // NOTE: unused - remove? 362 mClassName = className; 363 mToken = token; 364 mApplication = application; 365 mActivityManager = (IActivityManager)activityManager; 366 } ...
android_opensource/frameworks/base/core/java/android/content/ContextWrapper.java
... 50 /** 51 * Set the base context for this ContextWrapper. All calls will then be 52 * delegated to the base context. Throws 53 * IllegalStateException if a base context has already been set. 54 * 55 * @param base The new base context for this wrapper. 56 */ 57 protected void attachBaseContext(Context base) { 58 if (mBase != null) { 59 throw new IllegalStateException("Base context already set"); 60 } 61 mBase = base; 62 } ...
so the service get the Context instance which implement the getSharedPreferences(String name, int mode) method
the original url http://hi.baidu.com/ksoftware/blog/item/de17bbd6806b202507088bd8.html
发表评论
-
使用fatjar导出有第三方库引用的jar
2013-11-26 16:24 1443把android项目导出为jar时,老是不能把第三方库一起导出 ... -
(转)关于百度地图和高德地图,关于地图坐标系
2013-11-21 11:23 8882原文作者: 深白Andy 原 ... -
android操作png
2013-10-16 11:31 1475PNGJ是纯Java库的高效编码解码/ PNG图像的库,开源项 ... -
通过SharedPreference实现共享数据
2013-04-22 17:07 2439如果程序B想要访问程序A的sharedPreference可以 ... -
android 安装app私有存储目录下的apk
2013-04-08 18:05 3368一般安装app就是 Intent i = new Intent ... -
android在线播放音频视频
2012-12-05 17:43 1994在项目中要用到终端现场录制视频音频,用户在web页面看,所以找 ... -
Android video streaming and encoder
2012-11-26 15:38 1709一个开源的android流媒体项目https://code.g ... -
锁定屏幕
2012-10-24 21:52 1316if (!mDPM.isAdminActive(mDevice ... -
android 企业级开发框架
2012-10-24 17:38 1397http://code.google.com/p/openmo ... -
afinal 开发框架
2012-10-20 18:03 1311afinal 是一个android的 orm 和 ioc 框架 ... -
在后台保持屏幕唤醒状态
2012-10-16 21:05 1065在网上找了很久,都是在前台起作用的,只有自己实现了,还有些小问 ... -
基于经纬度计算方向,距离等
2012-10-11 12:57 1630The code encapsulating a locati ... -
NFC Android 应用开发指南
2012-09-30 14:44 1491文档里说的很详细很有用,能看完,对NFC在android上的开 ... -
(转)百度地图API经纬度转换接口
2012-09-28 20:55 31773先列参考文 百度提供的各种地图API http://dev.b ... -
(转)google地图纠偏
2012-09-28 12:13 2120由于受到国家一些法律 ... -
位置服务的封装
2012-09-24 21:33 1029/** * Retrieve accurate locat ... -
结合重力感应器来计算手机移动的方位
2012-09-24 21:24 1243public void onSensorChanged( Se ... -
根据Latitude/Longitude 计算方位,距离等
2012-09-24 21:09 4059里面有详细的说明http://www.movable-type ... -
通过google api获得位置的方向
2012-09-23 15:10 1072private String[] getDirectio ... -
模拟位置信息
2012-09-23 12:40 1218计算两点间距离 方法一 double dist = 0.0; ...
相关推荐
SharedPreferences提供了简单易用的API,开发者可以通过`Context`的`getSharedPreferences(String name, int mode)`方法获取一个SharedPreferences实例,其中`name`参数是SharedPreferences文件的名称,而`mode`参数...
- `getSharedPreferences(String name, int mode)`: 全局的SharedPreferences,根据指定名称和模式创建实例。 - `getPreferences(int mode)`: 当前Activity的SharedPreferences,使用当前类名作为默认名称。 - *...
- 调用 `getSharedPreferences(String name, int mode)` 方法获取 `SharedPreferences` 对象。 - 使用 `edit()` 方法获取 `Editor` 对象,通过调用 `putXXX(key, value)` 方法写入数据。 - 最后调用 `apply()` 或...
- `Activity.getSharedPreferences(String name, int mode)`:在当前`Activity`上下文中获取偏好设置,仅限于当前`Activity`。 其中,`name`参数是偏好设置文件的名称,`mode`参数表示访问模式,例如`MODE_PRIVATE`...
- `getSharedPreferences(String name, int mode)`:在任何类中使用,需要传入首选项的名称和模式。 2. **编辑SharedPreferences** - `SharedPreferences.Editor`:通过`edit()`方法获取,用于添加、修改或删除...
1. 使用方式:SharedPreferences通过Context对象获取,如`getSharedPreferences(String name, int mode)`,其中name是SharedPreferences文件的名称,mode是访问模式,如MODE_PRIVATE(默认)表示私有模式,只有当前...
- `getSharedPreferences(String name, int mode)`:这个方法在`Context`中定义,传入文件名和访问模式(如私有模式、只读模式等)来创建SharedPreferences对象。 - `Activity.getPreferences(int mode)`:针对...
1. **创建SharedPreferences对象**:通常在应用的Context环境下,如Activity或Service中,通过`getSharedPreferences(String name, int mode)`方法创建一个SharedPreferences对象,其中`name`参数是文件名,`mode`...
- `getSharedPreferences(String name, int mode)`: 这个静态方法是通过Context对象来获取SharedPreferences实例。`name`参数用于指定SharedPreferences文件的名称,通常默认为“preferences”。`mode`参数定义了...
- `getSharedPreferences(String name, int mode)`:适用于全局偏好设置,需要传入文件名(默认为`PreferenceManager.getDefaultSharedPreferences(Context context)`)和访问模式(如`Context.MODE_PRIVATE`)。...
1. **获取SharedPreferences实例**:通常会提供一个静态方法,用于获取SharedPreferences的实例,例如`getSharedPreferences(String name, int mode)`,其中name是文件名,mode是访问模式。 2. **保存键值对**:...
它支持多种基本数据类型的存储,如boolean、int、float、long和String等。 获取SharedPreferences对象有两种主要方式: 1. 使用Context对象的getSharedPreferences()方法,传入一个文件名(作为SharedPreferences...
- 获取SharedPreferences对象:通常在Activity或Fragment中,通过`getPreferences(MODE_PRIVATE)`方法获取当前组件的SharedPreferences,或者通过`getSharedPreferences(String name, int mode)`方法传入自定义的...
- `getSharedPreferences(String name, int mode)`:这是获取SharedPreferences实例的方法,`name`是配置文件的名称,`mode`是访问模式,如私有(Context.MODE_PRIVATE)。 - `edit()`:返回一个`...
- `getSharedPreferences(String name, int mode)`:通过传入文件名和访问模式来获取,例如`getSharedPreferences("my_prefs", Context.MODE_PRIVATE)`,其中"my_prefs"是文件名,`Context.MODE_PRIVATE`表示私有...
1. `getSharedPreferences(String name, int mode)`:这个静态方法用于获取一个`SharedPreferences`实例。`name`参数定义了首选项文件的名称,`mode`参数则定义了访问模式,比如只读或读写。 2. `edit()`:此方法...
- 创建 SharedPreferences 实例:通过 `getSharedPreferences(String name, int mode)` 方法,其中 `name` 是首选项文件的名称,`mode` 决定了文件的访问权限。 - 存储数据:使用 `edit()` 方法获取到 `...
}// ContextImpl.java@Overridepublic SharedPreferences getSharedPreferences(String name, int mode) { synchronized (mSync) { SharedPreferencesImpl sp = mPreferencesMap.get(name); if (sp == null) { File ...
注意,SharedPreferences实例需要通过`Context`的`getSharedPreferences(String name, int mode)`方法获取,其中`mode`参数决定了数据的读写权限。 关于SharedPreferences的存储位置,它们通常位于应用的私有数据...
- `getSharedPreferences(String name, int mode)`: 根据给定的名字和访问模式创建或获取`SharedPreferences`对象。 - `getString(String key, String defValue)`: 获取存储的字符串值。 - `putString(String key...