android - 使用 PreferenceActivity 的小部件未添加到主屏幕

标签 android widget preferenceactivity

我正在编写一个使用 PreferenceActivity 配置的小部件。该小部件需要配置一次 - 它依赖于使用 oauth 身份验证的 api。流程如下:

  1. 将小部件拖到主屏幕
  2. PreferenceActivity 出现,请求一个请求 token 并重定向到浏览器
  3. 用户通过网站进行身份验证,然后我回调到 PreferenceActivty
  4. Widget 请求访问 token 并保存
  5. Widget 刷新并关闭 PreferenceActivty

问题出在第 5 步 - 关闭发生但小部件未添加到主屏幕!问题是,如果我执行此过程,然后将另一个小部件添加到主屏幕,代码会发现我们已经通过身份验证,并且它会调用相同的函数来刷新/关闭 PreferenceActivity。这次成功了,并且被添加到了主屏幕!!

我不知道问题出在哪里。我确实使用普通 Activity 而不是 PreferenceActivity 进行了此工作,但我不明白为什么这会成为问题。我在想我应该在 PreferenceActivity 结束时调用 setResult(RESULT_OK...) 以在步骤 2 中启动浏览器,但它不起作用。我想是因为它在 onCreate 中起作用,但在回调中不起作用(当异步任务完成时),这是因为它没有在 UI 线程上运行,但是通过调用 runOnUiThread 强制它运行也不起作用...

第 5 步的代码是:

    private static void refreshWidgetAndShowHomeScreen(final Activity activity, int appWidgetId) {
// ... code that does refresh

Intent showHome = new Intent(Intent.ACTION_MAIN);
showHome.addCategory(Intent.CATEGORY_HOME);
showHome.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);

activity.setResult(RESULT_OK, showHome);
activity.finish();
activity.startActivity(showHome);
}

该函数是静态的,因为我正在为 android API 7+ 编写小部件,因此它是从 Activity 本身和高于 Honeycomb 的版本的 Fragment 中调用的。

最佳答案

在多次尝试说服它工作之后,我最终在第一次运行小部件时在 onCreate 中执行了以下操作,因此它会立即添加到屏幕上。代码关闭 Activity 然后立即重新启动它。

从视觉上看,它看起来还不错。但这很糟糕,因为如果用户无法进行身份验证或不想再进行身份验证,他们的屏幕上就会留下一个死的小部件。欢迎提出建议...

解决方法:

final Intent intent2 = getIntent();
intent2.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
setResult(RESULT_OK, intent2);
finish();
startActivity(intent2);

关于android - 使用 PreferenceActivity 的小部件未添加到主屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17512281/

相关文章:

android - 通用布局,不同资源

java - Android Socket 连接(权限被拒绝)

Django 自定义表单字段错误地呈现值

android - 如何最小化我的 Android 应用程序的内存使用率

android - 在 SQLite 中更改表后未更新表列

python - 如何在 Panel Fileinput 小部件中访问选定的文件名?

python - 更改 tk.optionmenu 小部件的颜色

android - 为什么 Kit Kat 需要使用 isValidFragment?

android - PreferenceActivity 可以自定义它处理触摸的方式吗?

android - 用于在 PreferenceActivity 中选择百分比数字的对话框