使用PreferenceActivity的小部件不会添加到主屏幕

时间:2013-07-07 12:48:04

标签: android widget preferenceactivity

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

  1. 将小部件拖到主屏幕
  2. 出现PreferenceActivity,请求令牌并重定向到浏览器
  3. 用户通过网站进行身份验证,然后我回复了PreferenceActivty
  4. 窗口小部件请求访问令牌并将其保存
  5. 小部件刷新并关闭PreferenceActivty
  6. 问题在于第5步 - 关闭发生但小部件未添加到主屏幕!问题是,如果我执行此过程然后将另一个小部件添加到主屏幕,则代码会看到我们已经过身份验证,并且它调用相同的函数来刷新/关闭PreferenceActivity。这次它可以工作并添加到主屏幕!!

    我无法解决问题所在。我确实使用普通的Activity而不是PreferenceActivity,但我不明白为什么这会是一个问题。当PreferenceActivity结束以在步骤2中启动浏览器时,我想我应该调用setResult(RESULT_OK ...),但它不起作用。我认为因为它可以从onCreate而不是来自回调(当asynctask完成时),这是因为它没有在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本身和Fragment中调用大于Honeycomb的版本。

1 个答案:

答案 0 :(得分:1)

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

视觉上看起来没问题。但这很糟糕,因为如果用户无法进行身份验证或不想再进行身份验证,则屏幕上会有一个死小部件。建议欢迎......

解决方法:

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