2010-09-08 5 views
2

Actuellement, j'essaie de mettre en place un «poster» réutilisable sur Twitter. Le statut Twitter fonctionne, mais le bit réutilisable ne l'est pas. Voici ce que je suis en train de faire:Android StartActivityForResult pour le code réutilisable - d'autres façons de le faire? (à propos de Twitter)

Une activité appelée SummaryDisplay importe une classe TweetStatus et appelle une fonction sendStatus. Il implémente également un écouteur qui est appelé lorsque TweetStatus peut confirmer que le statut a été envoyé avec succès. Jusqu'ici tout va bien. TweetStatus envoie une intention à une autre activité, OAUTH, qui renverra avec le jeton utilisateur et le code secret nous permettant de nous 'connecter' à Twitter. Si OAUTH ne trouve pas de jetons et de secrets enregistrés, il envoie une intention au navigateur afin que l'utilisateur puisse se connecter à Twitter et confirmer que notre application est autorisée à envoyer des tweets en son nom. Twitter que utilise un rappel pour revenir à l'application OAuth (en utilisant un filtre intention dans le manifeste que nous faisons notre propre Android: système et hôte):

<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> 

L'URI rappel est alors:

private static final Uri CALLBACK_URI = Uri.parse("my-app://twitter-login-success"); 

C'est parce que ce rappel est une intention que la classe OAUTH doit étendre l'activité (afin qu'elle puisse recevoir ces intentions). Donc le problème est dans le retour d'OAUTH avec le jeton et le secret (montré en gras ci-dessus). Actuellement, OAUTH envoie une intention à SummaryDisplay qui envoie ensuite les données à TweetStatus. Le problème est que l'intention de SummaryDisplay est hardcoded:

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

si la classe OAuth n'est plus réutilisable comme nouveau devra être fait pour chaque activité qui veut envoyer un statut Twitter. Une option est que le callback de Twitter soit changé pour SummaryDisplay au lieu d'OAUTH, mais cela nécessite de changer le callback pour celui de votre choix (un non enregistré avec Twitter et j'ai besoin de vérifier si c'est autorisé). Une autre option que j'essaie est d'utiliser StartActivityForResult.

Alors:

TweetStatus appelle OAuth avec startActivityForResult,

OAuth appelle le navigateur,

navigateur appelle ensuite OAuth arrière à l'aide d'un URI rappel,

retourne OAuth résultat à qui a commencé .

Par conséquent, réutilisable. Cependant, l'URI de rappel reçue du navigateur semble créer une nouvelle instance d'OAUTH qui n'a aucune idée de qui appeler, donc ne fait rien. J'ai essayé de placer l'androïde: launchMode à SingleInstance mais cela désactive le résultat d'être envoyé (avec rapport LogCat):

09-08 10:22:00.742: WARN/ActivityManager(563): Activity is launching as a new task, so cancelling activity result. 

Existe-t-il d'autres façons de le faire?Y at-il, par exemple, une façon d'envoyer une « classe » de vous-même dans une intention qui peut ensuite être utilisé dans

Intent i = new Intent(this, myClassVariableSetUsingAnIntent); 

Je peux alors utiliser

android:launchMode="singleInstance" 

Merci pour toute aide.

Répondre

0

est-il, par exemple, une façon d'envoyer une « classe » de vous-même dans une intention ...

Vous pouvez utiliser createPendingResult() pour passer un objet dans un Intent supplémentaire qui peut être utilisé plus tard pour déclencher onActivityResult(). Ou, vous pouvez effectuer une "diffusion" privée, en spécifiant une action et un package pour restreindre l'étendue à revenir uniquement à l'application d'origine. Voici un exemple client et remote service qui démontrent l'utilisation de ces deux - dans votre cas, vous ne seriez pas les utiliser à partir d'un service, bien sûr, mais c'est le seul exemple de code que j'ai à portée de main. L'un d'entre eux devrait, en principe, vous permettre de récupérer vos données dans l'activité d'origine. De là, c'est une question de finish()-tout ce qui existe entre l'endroit où vous êtes et cette activité.

+0

Merci pour l'aide ... jamais même createPendingResult() existé. Va donner un coup de feu et voir comment ça se passe quand le temps le permet. –

Questions connexes