2013-07-07 2 views
1

Я пишу виджет, который настроен с использованием PreferenceActivity. Виджет необходимо настроить один раз - он опирается на api, который использует аутентификацию oauth. Поток выглядит следующим образом:Виджет с использованием PreferenceActivity, не добавляющий на главный экран

  1. Перетащите виджет на главный экран появляется
  2. PreferenceActivity, делает запрос для запроса маркеров и перенаправляет браузер
  3. Пользователя аутентифицирует с сайтом, а затем у меня есть обратный вызов к PreferenceActivty
  4. Widget запрашивает маркер доступа и сохраняет его
  5. Виджет освежает и закрывает PreferenceActivty

Проблема заключается в шаге 5 - закрытие происходит, но виджет не добавляется на главный экран! Дело в том, что если я сделаю этот процесс, а затем добавлю еще один виджет на главный экран, код увидит, что мы уже прошли аутентификацию, и он вызывает ту же функцию, что и для обновления/закрытия PreferenceActivity. На этот раз он работает и добавляется на главный экран!

Я не могу решить, где проблема здесь. У меня это работало с использованием обычной Activity, а не PreferenceActivity, но я не понимаю, почему это было проблемой. Думал, что я должен вызвать setResult (RESULT_OK ...), когда PreferenceActivity закончит запуск браузера на шаге 2, но он не работает. Я думал, потому что он работает от onCreate, но не от обратного вызова (когда асинктас завершен), потому что он не работал в потоке пользовательского интерфейса, но заставлял его звонить по вызову 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); 
} 

функция является статической, потому что я пишу виджет для андроид API 7+, так это называется как от самой деятельности и от фрагмента для версий более Honeycomb.

ответ

1

После многих попыток убедить это работать, я закончил делать следующее в onCreate при первом запуске виджета, поэтому он сразу же добавляется на экран. Код закрывает действие и сразу же перезапускает его.

Визуально, все выглядит хорошо. Но это отстой, потому что если пользователь не может пройти аутентификацию или не хочет больше, на их экране останется мертвый виджет. Предложения приветствуются ...

Обход:

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

Не могли бы вы добавить это к OnDestroy() в PreferenceActivity вместо этого? – Merkidemis