В настоящее время я пытаюсь реализовать многократно используемый статус Twitter «постер». Часть статуса Твиттера работает, но многоразовый - нет. Вот что я делаю:
Действие SummaryDisplay импортирует класс TweetStatus и вызывает функцию sendStatus. Он также реализует прослушиватель, который вызывается, когда TweetStatus может подтвердить, что статус был успешно отправлен. Пока все хорошо.
TweetStatus отправляет намерение другому действию, OAUTH, , которое вернется с токеном пользователя и секретом , позволяя нам «войти» в Twitter.
Если OAUTH не может найти какие-либо сохраненные токены и секреты, она отправляет намерение в браузер, чтобы пользователь мог войти в Twitter и подтвердить, что нашему приложению разрешено отправлять твиты от их имени. Twitter использует обратный вызов для возврата в приложение OAUTH (используя фильтр намерений в манифесте, мы создаем собственную схему android: схему и хост):
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="my-app" android:host="twitter-login-success" />
</intent-filter>
Тогда URI обратного вызова:
private static final Uri CALLBACK_URI = Uri.parse("my-app://twitter-login-success");
Именно из-за того, что этот обратный вызов является намерением, класс OAUTH должен расширять активность (чтобы он мог получать эти намерения).
Так что проблема в OAUTH, возвращающемся с токеном и секретом (показано жирным шрифтом выше). В настоящее время OAUTH отправляет намерение SummaryDisplay, которое затем отправляет данные в TweetStatus. Проблема в том, что намерение SummaryDisplay жестко закодировано:
Intent i = new Intent(this, SummaryDisplay.class);
так что класс OAUTH больше не может использоваться повторно, так как для каждого действия, которое хочет отправить статус Twitter, необходимо будет создать новый класс.
Один из вариантов заключается в том, чтобы обратный вызов из Twitter был изменен на SummaryDisplay вместо OAUTH, но тогда для этого требуется изменить обратный вызов на один из ваших вариантов (один не зарегистрирован в Twitter, и мне нужно проверить, разрешено ли это). Другой вариант, который я пытаюсь использовать, - использовать StartActivityForResult.
Итак:
TweetStatus вызывает OAUTH с помощью StartActivityForResult,
OAUTH вызывает браузер,
Затем браузер вызывает OAUTH обратно, используя URI обратного вызова,
OAUTH возвращает результат тому, кто его запустил.
Поэтому многоразового использования. Однако URI обратного вызова, полученный от браузера, по-видимому, создает новый экземпляр OAUTH, который не имеет представления, кому необходимо выполнить обратный вызов, поэтому ничего не делает. Я попытался установить для android: launchMode значение singleInstance, но это отключает отправку результата (с отчетом LogCat):
09-08 10:22:00.742: WARN/ActivityManager(563): Activity is launching as a new task, so cancelling activity result.
Есть ли другие способы сделать это? Есть ли, например, способ отправить «класс» себя в намерении, который затем может быть использован в
Intent i = new Intent(this, myClassVariableSetUsingAnIntent);
Так что я могу использовать
android:launchMode="singleInstance"
Спасибо за любую помощь.