onNewIntent() not getting called in some devices

非 Y 不嫁゛ 提交于 2019-11-30 18:24:34

问题


I am implementing Oauth (twitter, google) for an Android application and some users have complained because they cannot log in; after analysing the problem I saw that in some devices sometimes the onNewIntent() is not called and onCreate() method is called instead. So it seems that there is something wrong with activities' tasks, instances,..

Here is my code:

AndroidManifest.xml

<activity
            android:name="LoginActivity"
            android:launchMode="singleTask" 
            android:screenOrientation="portrait">
            <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-oauthflow" />
            </intent-filter>
        </activity>
        <activity
            android:name="FirstActivity"
            android:label="@string/app_name"
            android:noHistory="true"
            android:screenOrientation="portrait" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

FirstActivity.java

    btnGoogle = (Button)findViewById(R.id.btnGoogle);
    btnGoogle.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            if (Utils.bInternetConnection(getApplicationContext())) {
                Intent intentGoogle = new Intent(getApplicationContext(), LoginActivity.class);

                Bundle b = new Bundle();
                b.putInt(Constants.SOCIAL_NETWORK, Constants.SOCIAL_NETWORK_GOOGLE);
                intentGoogle.putExtras(b);
                startActivity(intentGoogle);
            } else {
                Utils.showDialog(FirstActivity.this, R.string.no_internet_title, R.string.no_internet_msg);
            }
        }
    });
    btnTwitter = (Button)findViewById(R.id.btnTwitter);
    btnTwitter.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            if (Utils.bInternetConnection(getApplicationContext())) {
                Intent intentTwitter = new Intent(getApplicationContext(), LoginActivity.class);

                Bundle b = new Bundle();
                b.putInt(Constants.SOCIAL_NETWORK, Constants.SOCIAL_NETWORK_TWITTER);
                intentTwitter.putExtras(b);
                startActivity(intentTwitter);
            } else {
                Utils.showDialog(FirstActivity.this, R.string.no_internet_title, R.string.no_internet_msg);
            }
        }
    });

LoginActivity.java

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    // Async Load
    new loadPage(this).execute("");

}

/**
 * The callback URL will be intercepted here.
 */
@Override
public void onNewIntent(Intent intent) {
    super.onNewIntent(intent);

    ....
    ....

}


private class loadPage extends AsyncTask<String, Integer, Void> {

    private Context context;

     public loadPage(Context context) {
            this.context = context;
     }

    private ProgressDialog pdia;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pdia = new ProgressDialog(LoginActivity.this);
        pdia.setMessage(getString(R.string.loading));
        pdia.setCanceledOnTouchOutside(false);
        pdia.show();
    }

    @Override
    protected Void doInBackground(String... arg0) {
        try {
            Bundle b = getIntent().getExtras();
            int socialNetwork = b.getInt(Constants.SOCIAL_NETWORK);
            _socialNetwork = socialNetwork;

            switch (_socialNetwork) {
            case Constants.SOCIAL_NETWORK_GOOGLE:
                consumer_key = Constants.CONSUMER_KEY_GOOGLE;
                consumer_secret = Constants.CONSUMER_SECRET_GOOGLE;
                url_request_token = Constants.URL_REQUEST_TOKEN_GOOGLE
                        + "?scope="
                        + URLEncoder
                                .encode(Constants.SCOPE_GOOGLE, "utf-8");
                url_access_token = Constants.URL_ACCESS_TOKEN_GOOGLE;
                url_authorize_token = Constants.URL_AUTHORIZE_TOKEN_GOOGLE;
                break;
            case Constants.SOCIAL_NETWORK_TWITTER:
                consumer_key = Constants.CONSUMER_KEY_TWITTER;
                consumer_secret = Constants.CONSUMER_SECRET_TWITTER;
                url_request_token = Constants.URL_REQUEST_TOKEN_TWITTER;
                url_access_token = Constants.URL_ACCESS_TOKEN_TWITTER;
                url_authorize_token = Constants.URL_AUTHORIZE_TOKEN_TWITTER;
                break;
            }

            // Google & Twitter

                consumer = new CommonsHttpOAuthConsumer(consumer_key,
                        consumer_secret);

                provider = new CommonsHttpOAuthProvider(url_request_token,
                        url_access_token, url_authorize_token);

                // Get authUrl
                String authUrl = provider.retrieveRequestToken(consumer,
                        callBack.toString());

                // Bring the user to authUrl
                Intent intent = new Intent(Intent.ACTION_VIEW,
                        Uri.parse(authUrl))
                        .setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP
                                | Intent.FLAG_ACTIVITY_NO_HISTORY
                                | Intent.FLAG_FROM_BACKGROUND);
                context.startActivity(intent);


        } catch (Exception e) {
            Log.e(Constants.TAG, "Oauth error", e);
            // Redirect to Login Page
            Intent intentFirst = new Intent(getApplicationContext(),
                    FirstActivity.class);
            startActivity(intentFirst);
            finish();
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void unused) {
        if (pdia.isShowing()){
            pdia.dismiss();
        }           
    }
}

Any ideas?

来源:https://stackoverflow.com/questions/17546819/onnewintent-not-getting-called-in-some-devices

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!