Skip to content

Latest commit

 

History

History
172 lines (121 loc) · 6.62 KB

File metadata and controls

172 lines (121 loc) · 6.62 KB

八、安卓偏好设置

在前一章中,我们处理了存储在 SQLite 数据库中的复杂数据。这次,我们将处理一种简单得多的数据形式。我们将介绍一个特定的使用案例来演示安卓共享首选项的使用。

假设我们想记住我们的ViewPager类的最后一页位置,并在每次应用启动时打开它。我们将使用共享首选项来记住它,并在每个视图页面位置发生变化时保持该信息,并在需要时检索它。

在这短短的一章中,我们将涉及以下主题:

  • 安卓的喜好是什么,怎么用?
  • 定义您自己的首选项管理器

安卓偏好什么?

安卓共享偏好机制持久化和检索的应用偏好被称为共享偏好。共享首选项本身表示由安卓及其应用编程接口访问和修改的 XML 数据。安卓为我们处理所有关于检索和保存偏好的工作。它还提供了一种机制,使这些偏好成为私有的,对公众不可见。Android SDK 有一套很棒的偏好管理类。此外,还有一些可用的抽象,因此您不局限于默认的 XMLs,而是可以创建自己的持久层。

你如何使用它们?

要使用共享首选项,您必须从当前上下文中获取SharedPreferences实例:

    val prefs = ctx.getSharedPreferences(key, mode) 

这里,key表示将命名这个共享首选项实例的String。系统中的 XML 文件也将具有该名称。这些是可从Context class获得的模式(操作模式):

  • MODE_PRIVATE:这是默认模式,创建的文件只能由我们的调用应用访问
  • MODE_WORLD_READABLE:不推荐使用
  • MODE_WORLD_WRITEABLE:不推荐使用

然后,我们可以按如下方式存储或检索值:

    val value = prefs.getString("key", "default value")  

所有常见的数据类型都有类似的getter方法。

编辑(存储)首选项

我们将通过提供一个首选项编辑示例来开始这一部分:

    preferences.edit().putString("key", "balue").commit() 

The commit() method executes the operation immediately, while the apply() method executes it in the background. Never obtain or manipulate your shared preferences from an application's main thread if you use the commit() method. Make sure that all writing and reading is performed in the background. You can use AsyncTask for that purpose or, instead of commit(), use apply().

删除首选项

要删除首选项,有一个remove方法可用,如下所示:

    prefs.edit().remove("key").commit() 

不要通过用空数据覆盖首选项来删除它们。例如,用 null 覆盖整数或用空字符串覆盖字符串。

定义您自己的首选项管理器

为了完成本章开头的任务,我们将创建一个适当的机制来获得共享的偏好。

创建一个名为preferences的新包。我们将把所有preferences相关代码放在那个包里。对于共享首选项管理,我们需要以下三个类:

  • PreferencesProviderAbstract:这是提供对 SharedPreferences 访问的基本抽象
  • PreferencesProvider:这是PreferencesProviderAbstract实现
  • PreferencesConfiguration:这个类负责描述我们试图实例化的偏好

使用这种方法的好处是在我们的应用中共享偏好访问的统一方法。

让我们如下定义每个类:

  • PreferencesProviderAbstract类代码如下:
         package com.journaler.perferences 

         import android.content.Context 
         import android.content.SharedPreferences 

         abstract class PreferencesProviderAbstract { 
           abstract fun obtain(configuration: PreferencesConfiguration,
           ctx: Context): SharedPreferences 
         } 
  • PreferencesConfiguration类代码如下:
         package com.journaler.perferences 
         data class PreferencesConfiguration
         (val key: String, val mode: Int) 
  • PreferencesProvider类代码如下:
        package com.journaler.perferences 

        import android.content.Context 
        import android.content.SharedPreferences 

        class PreferencesProvider : PreferencesProviderAbstract() { 
          override fun obtain(configuration: PreferencesConfiguration,
          ctx: Context): SharedPreferences { 
            return ctx.getSharedPreferences(configuration.key,
            configuration.mode) 
          } 
        } 

如您所见,我们创建了一个简单的机制来获取共享首选项。我们会合并它。打开MainActivity类,根据这段代码进行扩展:

     class MainActivity : BaseActivity() { 
       ... 
       private val keyPagePosition = "keyPagePosition" 
       ... 

       override fun onCreate(savedInstanceState: Bundle?) { 
         super.onCreate(savedInstanceState) 

         val provider = PreferencesProvider() 
         val config = PreferencesConfiguration("journaler_prefs",
         Context.MODE_PRIVATE) 
         val preferences = provider.obtain(config, this) 

         pager.adapter = ViewPagerAdapter(supportFragmentManager) 
         pager.addOnPageChangeListener(object :
         ViewPager.OnPageChangeListener { 
            override fun onPageScrollStateChanged(state: Int) { 
                // Ignore 
         } 

         override fun onPageScrolled(position: Int, positionOffset:
         Float, positionOffsetPixels: Int) { 
                // Ignore 
         } 

         override fun onPageSelected(position: Int) { 
           Log.v(tag, "Page [ $position ]") 
           preferences.edit().putInt(keyPagePosition, position).apply() 
         } 
       }) 

       val pagerPosition = preferences.getInt(keyPagePosition, 0) 
       pager.setCurrentItem(pagerPosition, true) 
       ... 
      } 
      ... 
     } 

我们创建了preferences实例,用于持久化和读取视图页面位置。构建并运行您的应用;轻扫其中一个页面,然后关闭应用并再次运行。如果你看一下 Logcat,你会看到类似这样的东西(通过Page过滤):

     V/Main activity: Page [ 1 ] 
     V/Main activity: Page [ 2 ] 
     V/Main activity: Page [ 3 ] 
     After we restarted the application: 
     V/Main activity: Page [ 3 ] 
     V/Main activity: Page [ 2 ] 
     V/Main activity: Page [ 1 ] 
     V/Main activity: Page [ 0 ] 

我们关闭后再次打开应用,刷回带有索引0的页面。

摘要

在本章中,您学习了如何使用安卓共享首选项机制来持久化应用首选项。如您所见,创建应用首选项并在您的应用中使用它们非常容易。在下一章中,我们将关注安卓系统中的并发性。我们将了解安卓提供的机制,并给出如何使用它们的例子。