用于可重用代码的Android StartActivityForResult - 执行此操作的任何其他方法? (关于推特)

时间:2010-09-08 09:25:35

标签: android twitter oauth

目前我正在尝试实施可重复使用的Twitter状态“海报”。 Twitter的状态部分正在运行,但可重用的部分不是。这就是我正在做的事情:

名为SummaryDisplay的活动导入类TweetStatus并调用函数sendStatus。它还实现了一个侦听器,当TweetStatus可以确认状态已成功发送时,该侦听器被调用。到目前为止一切都很好。

TweetStatus将意图发送给另一个活动OAUTH ,该活动将返回用户令牌和秘密,允许我们“登录”Twitter。

如果OAUTH无法找到任何已保存的令牌和机密,它会向浏览器发送一个意图,以便用户可以登录Twitter并确认我们的应用程序可以代表他们发送推文。 Twitter使用回调来返回OAUTH应用程序(通过使用清单中的intent过滤器,我们制作自己的android:scheme和host):

<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发送一个intent,然后将该数据发送到TweetStatus。问题是SummaryDisplay意图是硬编码的:

Intent i = new Intent(this, SummaryDisplay.class);

所以OAUTH类不再可重用,因为需要为每个想要发送Twitter状态的活动制作一个新类。

一个选项是将Twitter的回调更改为SummaryDisplay而不是OAUTH,但是这需要将回调更改为您选择的一个(一个未在Twitter注册,我需要检查是否允许)。我正在尝试的另一个选择是使用StartActivityForResult。

所以:

TweetStatus使用StartActivityForResult调用OAUTH,

OAUTH调用浏览器

然后,浏览器使用回调URI

重新调用OAUTH

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"

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

  

例如,是否存在一种在意图中发送自己“阶级”的方式......

您可以使用createPendingResult()传递Intent额外内容中的对象,以后可以使用该对象来触发onActivityResult()。或者,您可以执行私有“广播”,指定操作和包以限制范围仅返回到原始应用程序。下面是一个示例clientremote service示例使用这两个 - 在您的情况下,您不会在服务中使用它们,当然,这是我拥有的唯一示例代码便利。原则上,其中一个应该让您将数据恢复到原始活动。从那里开始,问题就在于finish() - 在你和活动之间的所有事情。

答案 1 :(得分:0)

可能的替代方法是通过为意图设置标志来重用活动。详情请见http://caguilartech.blogspot.com/2010/07/android-intent-switching-reusing.html