我们如何控制Android同步适配器偏好?

在试图写一个自定义的Android同步适配器我跟着这个 。 在上述示例中,我成功地在“ 常规”设置中显示了一个条目(“帐户设置”),其中包含以下代码段。

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategory android:title="General Settings" /> <PreferenceScreen android:key="account_settings" android:title="Account Settings" android:summary="Sync frequency, notifications, etc."> <intent android:action="fm.last.android.activity.Preferences.ACCOUNT_SETUP" android:targetPackage="fm.last.android" android:targetClass="fm.last.android.activity.Preferences" /> </PreferenceScreen> </PreferenceCategory> </PreferenceScreen> 

代码导致我在常规设置中input( 帐户设置 ):

点击帐户设置后,我收到如下错误信息,设备不必要的重启。

ERROR / AndroidRuntime(30057):android.util.AndroidRuntimeException:从Activity上下文外部调用startActivity()需要FLAG_ACTIVITY_NEW_TASK标志。 这真的是你想要的吗?

我知道这个错误可以通过代码来解决。 由于“帐户设置”首选项是基于XML的代码,我坚持与错误。

  1. 任何人都可以帮助解决这个问题?

  2. 我们如何通过代码来控制这种偏好?

我不会完全回答你的两个问题,但我通过使用以下3个步骤来解决这个问题:

  1. 设置帐户首选项XML
  2. 创build一个活动来pipe理首选项
  3. 从“首选项编辑”Intent中提取帐户信息

设置帐户首选项XML

我使用了一个与SDK示例和c99 Last.fm应用程序非常相似的account_preferences.xml。 考虑下面的代码片段:

 <PreferenceScreen android:key="account_settings" android:title="Account Preferences" android:summary="Misc account preferences"> <intent android:action="some.unique.action.name.account.EDIT" android:targetPackage="com.example.preferences" android:targetClass="com.example.preferences.PreferencesActivity"> </intent> </PreferenceScreen> 

考虑到这一点,我发现了一些重要的观点:(请注意,我已经通过实验发现了这些,而不是通过任何特定的Android文档 – 如果这个问题的未来读者有这些引用,这将是很好的把这些链接起来。)

  • 此PreferenceScreen的android:键必须是“account_settings”,否则Android将无法find并显示您的首选项
  • 通过使用明确的Intent并指定targetPackage和targetClass,android将直接启动您的Activity,您不必担心Intentfilter。
  • Android在当前选中的帐户中存储了这个Intent的Extras中的Account对象 – 这在接收端非常重要,所以你可以知道你正在pipe理的是哪个帐户。 更多关于这个下面。

创build首选项pipe理活动

接下来,我创build了一个Activity来对应上述XML中指定的包和类。 请注意,据我所知,活动的select取决于你 – 子类android.preference.PreferenceActivity是最常见的,但我也直接subclassed活动。 标准活动开发指南适用于此…

从“偏好编辑”获取帐户意图

当您的活动启动时,您可以从Extras Bundle(使用this.getIntent()。getExtras())和“account”键提取相应的Account对象。 回想一下,这个Intent将会是你最初在首选项XML文件中指定的那个。 (同样,我也找不到doc,因此通过转储使用我的Intent传递的Extras Bundle的内容来find它。)一旦拥有了Account,就可以直接使用SharedPreferences加载/保存该帐户的首选项,数据库,或其他你喜欢的方法。

希望有帮助…

上面提到的文件/资源​​不在独立软件包中:这是作者忘记调整的唯一的东西,我猜测:你必须创build你自己的喜好类。 这是我的class级:

 public class AccountPreferences extends PreferenceActivity { public static final String TAG = "AccountPreferences"; private boolean shouldForceSync = false; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); Log.i(TAG, "onCreate"); addPreferencesFromResource(R.xml.preferences_resources); @Override public void onPause() { super.onPause(); if (shouldForceSync) { AccountAuthenticatorService.resyncAccount(this); } } Preference.OnPreferenceChangeListener syncToggle = new Preference.OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference preference, Object newValue) { shouldForceSync = true; return true; } }; 

这里是首选项文件:preferences_resources.xml

  <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategory android:title="@string/privacy_preferences"> <CheckBoxPreference android:key="privacy_contacts" android:defaultValue="true" android:summary="@string/privacy_contacts_summary" android:title="@string/privacy_contacts_title"/> </PreferenceCategory> <PreferenceCategory android:title="@string/outgoing_preferences"> <CheckBoxPreference android:key="allow_mail" android:defaultValue="true" android:summary="@string/allow_mail" android:title="@string/allow_mail_text"/> </PreferenceCategory> 

你将不得不去适应这些,或者更深入地了解他的last.fm项目中的文件。

希望这有帮助,祝你好运。