onNewIntent(intent)不能正常工作

我正在build立这个twitter应用程序,其中浏览器被调用来从我的主要活动进行身份validation..在线程中运行以下代码(AsyncTask)

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)).setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_FROM_BACKGROUND); context.startActivity(intent); 

这里

 context is the context of main activity..the uri is returned through `intent`.. 

authentication后,它要做的是回到我的主要活动,到现在的状态。现在发生的是,它创build了另一个主要活动的实例。

我在用

 @Override public void onNewIntent(Intent intent) { super.onNewIntent(intent); SharedPreferences prefs = getSharedPreferences("twitter", 0); final Uri uri = intent.getData(); if (uri != null && uri.getScheme().equals(Constants.OAUTH_CALLBACK_SCHEME)) { setLoggedIn(true, tlogout); tstatus=true; new RetrieveAccessTokenTask(this,consumer,provider,prefs,tstring).execute(uri); } } 

但仍然,问题仍然存在..另一件事是,一切工作正常在模拟器(2.3)..不工作在我的设备..在Android 2.3.6

我的清单是

 <activity android:name=".mainActivity" android:launchMode="singleTask" android:label="@string/title_activity_main" > <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="x-oauthflow-twitter" android:host="callback" /> </intent-filter> </activity> 

Solutions Collecting From Web of "onNewIntent(intent)不能正常工作"

我不熟悉Twitter身份validation过程,但您可以尝试使用Intent.FLAG_ACTIVITY_SINGLE_TOP而不是Intent.FLAG_ACTIVITY_SINGLE_TOP

后者只适用于你,如果你的主要活动在堆栈顶部,另一个清除堆栈,并确保你的活动在上面。

OAuthRequestTokenTask.java

 package com.android.twit; import oauth.signpost.OAuthConsumer; import oauth.signpost.OAuthProvider; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.AsyncTask; import android.util.Log; public class OAuthRequestTokenTask extends AsyncTask<Void, Void, Void> { final String TAG = getClass().getName(); private Context context; private OAuthProvider provider; private OAuthConsumer consumer; /** * * We pass the OAuth consumer and provider. * * @param context * Required to be able to start the intent to launch the browser. * @param provider * The OAuthProvider object * @param consumer * The OAuthConsumer object */ public OAuthRequestTokenTask(Context context, OAuthConsumer consumer, OAuthProvider provider) { this.context = context; this.consumer = consumer; this.provider = provider; } /** * * Retrieve the OAuth Request Token and present a browser to the user to * authorize the token. * */ @Override protected Void doInBackground(Void... params) { try { Log.i(TAG, "Retrieving request token from Google servers"); final String url = provider.retrieveRequestToken(consumer, ConstantsTwit.OAUTH_CALLBACK_URL); Log.i(TAG, "Popping a browser with the authorize URL : " + url); Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)) .setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_FROM_BACKGROUND); context.startActivity(intent); } catch (Exception e) { Log.e(TAG, "Error during OAUth retrieve request token", e); } return null; } } 

PrepareRequestTokenActivity.java

 package com.android.twit; import oauth.signpost.OAuth; import oauth.signpost.OAuthConsumer; import oauth.signpost.OAuthProvider; import oauth.signpost.basic.DefaultOAuthProvider; import oauth.signpost.commonshttp.CommonsHttpOAuthConsumer; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.preference.PreferenceManager; import android.util.Log; public class PrepareRequestTokenActivity extends Activity { final String TAG = getClass().getName(); private OAuthConsumer consumer; private OAuthProvider provider; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); try { // CommonsHttpOAuthConsumer this.consumer = new CommonsHttpOAuthConsumer( ConstantsTwit.CONSUMER_KEY, ConstantsTwit.CONSUMER_SECRET); // this.provider = new // CommonsHttpOAuthProvider(Constants.REQUEST_URL, // Constants.ACCESS_URL, Constants.AUTHORIZE_URL); this.provider = new DefaultOAuthProvider(ConstantsTwit.REQUEST_URL, ConstantsTwit.ACCESS_URL, ConstantsTwit.AUTHORIZE_URL); } catch (Exception e) { Log.e(TAG, "Error creating consumer / provider", e); } Log.i(TAG, "Starting task to retrieve request token."); new OAuthRequestTokenTask(this, this.consumer, this.provider).execute(); } /** * Called when the OAuthRequestTokenTask finishes (user has authorized the * request token). The callback URL will be intercepted here. */ @Override public void onNewIntent(Intent intent) { super.onNewIntent(intent); Log.e("", "onNewIntent() is called..."); SharedPreferences prefs = PreferenceManager .getDefaultSharedPreferences(this); final Uri uri = intent.getData(); if (uri != null && uri.getScheme().equals(ConstantsTwit.OAUTH_CALLBACK_SCHEME)) { Log.i(TAG, "Callback received : " + uri); Log.i(TAG, "Retrieving Access Token"); new RetrieveAccessTokenTask(this, consumer, provider, prefs) .execute(uri); finish(); } } public class RetrieveAccessTokenTask extends AsyncTask<Uri, Void, Void> { private Context context; private OAuthProvider provider; private OAuthConsumer consumer; private SharedPreferences prefs; public RetrieveAccessTokenTask(Context context, OAuthConsumer consumer, OAuthProvider provider, SharedPreferences prefs) { this.context = context; this.consumer = consumer; this.provider = provider; this.prefs = prefs; } /** * Retrieve the oauth_verifier, and store the oauth and * oauth_token_secret for future API calls. */ @Override protected Void doInBackground(Uri... params) { final Uri uri = params[0]; final String oauth_verifier = uri .getQueryParameter(OAuth.OAUTH_VERIFIER); try { provider.retrieveAccessToken(consumer, oauth_verifier); final Editor edit = prefs.edit(); edit.putString(OAuth.OAUTH_TOKEN, consumer.getToken()); edit.putString(OAuth.OAUTH_TOKEN_SECRET, consumer.getTokenSecret()); edit.commit(); String token = prefs.getString(OAuth.OAUTH_TOKEN, ""); String secret = prefs.getString(OAuth.OAUTH_TOKEN_SECRET, ""); consumer.setTokenWithSecret(token, secret); // context.startActivity(new Intent(context, // AndroidTwitterSample.class)); executeAfterAccessTokenRetrieval(); Log.e(TAG, "OAuth - Access Token Retrieved"); } catch (Exception e) { Log.e(TAG, "OAuth - Access Token Retrieval Error", e); } return null; } private void executeAfterAccessTokenRetrieval() { String msg = getIntent().getExtras().getString("tweet_msg"); String path = getIntent().getExtras().getString("imagePath"); try { TwitterUtils.sendTweet(prefs, msg, path); } catch (Exception e) { Log.e(TAG, "OAuth - Error sending to Twitter", e); } } } } 

ConstantsTwit.java

 package com.android.twit; public class ConstantsTwit { public static final String CONSUMER_KEY = "xxxxxxxxxxxxxxx"; public static final String CONSUMER_SECRET = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; public static final String REQUEST_URL = " https://api.twitter.com/oauth/request_token"; public static final String ACCESS_URL = "https://api.twitter.com/oauth/access_token"; public static final String AUTHORIZE_URL = "https://api.twitter.com/oauth/authorize"; public static final String OAUTH_CALLBACK_SCHEME = "x-test-oauth-twitter"; public static final String OAUTH_CALLBACK_HOST = "callback"; public static final String OAUTH_CALLBACK_URL = OAUTH_CALLBACK_SCHEME + "://" + OAUTH_CALLBACK_HOST; } 

在AndroidManifest.xml中

 <activity android:name="com.android.twit.PrepareRequestTokenActivity" android:configChanges="touchscreen|keyboard|keyboardHidden|navigation|orientation" android:excludeFromRecents="true" android:launchMode="singleTask" android:windowSoftInputMode="stateAlwaysHidden" > <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:host="callback" android:scheme="x-test-oauth-twitter" /> </intent-filter> </activity> 

TwitterUtils.java

 package com.android.twit; import oauth.signpost.OAuth; import twitter4j.Twitter; import twitter4j.TwitterException; import twitter4j.TwitterFactory; import twitter4j.http.AccessToken; import android.app.Activity; import android.content.SharedPreferences; import android.widget.Toast; public class TwitterUtils { public static Activity tmp_Add_Daily_Mood; public static boolean isAuthenticated(SharedPreferences prefs) { String token = prefs.getString(OAuth.OAUTH_TOKEN, ""); String secret = prefs.getString(OAuth.OAUTH_TOKEN_SECRET, ""); AccessToken a = new AccessToken(token, secret); Twitter twitter = new TwitterFactory().getInstance(); twitter.setOAuthConsumer(ConstantsTwit.CONSUMER_KEY, ConstantsTwit.CONSUMER_SECRET); twitter.setOAuthAccessToken(a); try { twitter.getAccountSettings(); return true; } catch (TwitterException e) { return false; } } public static void sendTweet(SharedPreferences prefs, String msg) throws Exception { String token = prefs.getString(OAuth.OAUTH_TOKEN, ""); String secret = prefs.getString(OAuth.OAUTH_TOKEN_SECRET, ""); AccessToken a = new AccessToken(token, secret); Twitter twitter = new TwitterFactory().getInstance(); twitter.setOAuthConsumer(ConstantsTwit.CONSUMER_KEY, ConstantsTwit.CONSUMER_SECRET); twitter.setOAuthAccessToken(a); twitter.updateStatus(msg); } } 

用法

 Intent i = new Intent(getApplicationContext(), PrepareRequestTokenActivity.class); i.putExtra("tweet_msg", getTweetMsg()); startActivity(i); 

看看这个…它可以帮助你