我们如何控制Android同步适配器首选项?

use*_*837 7 android fatal-error accountmanager android-activity

在尝试编写自定义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>
Run Code Online (Sandbox Code Playgroud)

代码在常规设置中为我输入了一个条目(帐户设置):

单击帐户设置后,我收到如下错误,设备不必要地重新启动.

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

我知道这个错误可以通过代码解决.由于"帐户设置"首选项是基于XML的代码,因此我遇到了错误.

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

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

Jam*_*mes 7

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

  1. 设置帐户首选项XML
  2. 创建一个活动来管理首选项
  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>
Run Code Online (Sandbox Code Playgroud)

鉴于此,以下是我发现的一些重要观点:(请注意,我通过实验发现了这些,而不是通过任何特定的Android文档 - 如果这个问题的未来读者有这些参考,那么它会很棒链接那些.)

  • 此PreferenceScreen的android:键必须是"account_settings",否则Android将无法找到并显示您的首选项
  • 通过使用显式Intent并指定targetPackage和targetClass,android将直接启动您的Activity,您无需担心Intent过滤器.
  • Android在此Intent的Extras中存储当前所选帐户的Account对象 - 这在接收端非常重要,因此您可以知道您正在管理的帐户.更多关于此的信息.

创建首选项管理活动

接下来,我创建了一个Activity,以对应于上面XML中指定的包和类.请注意,据我所知,Activity的选择取决于你 - 最常见的是子类android.preference.PreferenceActivity,但我也直接将子类化为Activity.标准活动开发指南适用于此...

从"偏好编辑"意图中获取帐户

当您的Activity启动时,您可以从Extras Bundle(使用this.getIntent().getExtras())和键"account"中提取相应的Account对象.回想一下,此Intent将是您最初在首选项XML文件中指定的Intent.(再一次,我找不到这方面的文档,所以通过转储我的Intent传入的Extras Bundle的内容找到它.)一旦你有了帐户,使用SharedPreferences加载/保存该帐户的首选项应该很简单,数据库,或您喜欢的任何其他方法.

希望有帮助......


ola*_*tte 3

上面提到的文件/资源​​不在独立包中:这是作者忘记调整的唯一一件事,我猜:你必须创建自己的首选项类。这是我的课:

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;
    }
};
Run Code Online (Sandbox Code Playgroud)

这是首选项文件: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>
Run Code Online (Sandbox Code Playgroud)

您必须调整这些内容,或者更深入地查看他的 last.fm 项目中的文件。

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