简体   繁体   English

调用onCreate()而不是onActivityResult()

[英]onCreate() gets called instead of onActivityResult()

So I am authenticating the user via GitHub account using OAuth from browser. 因此,我正在使用来自浏览器的OAuth通过GitHub帐户对用户进行身份验证。 But after I fire the Intent from LoginActivity , the onResume() gets executed before the user opens the browser, thus returning the value of uri equals null . 但是在我从LoginActivity触发了Intent LoginActivityonResume()在用户打开浏览器之前得到执行,因此返回的uri值等于null

Here is the LoginActivity : 这是LoginActivity

public class LoginActivity extends AppCompatActivity {

    Button loginButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        loginButton = findViewById(R.id.button);
        final String url = "oauth url...";
        Log.d("called","oncreate");
        loginButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d("called","onclick");
                attemptLogin(url);
            }
        });
    }

    private void attemptLogin(String url){
        Log.d("called","onattempt");
        Intent intent = new Intent(this, BrowserActivity.class);
        intent.putExtra("URL", url);
        startActivityForResult(intent, 1);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        Uri uri = data.getData();
        String code = uri.getQueryParameter("code");
        Log.d("called",code);
    }
}

BrowserActivity : BrowserActivity

public class BrowserActivity extends AppCompatActivity {

    public static String CALLBACK_URL = "callback url..";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_browser);
        Intent intent = getIntent();
        if(intent != null){
            String url = intent.getStringExtra("URL");
            Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            startActivity(i);
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        Uri uri = getIntent().getData();
        if(uri != null && uri.toString().startsWith(CALLBACK_URL)) {
            String code = uri.getQueryParameter("code");
            Intent intent = new Intent();
            intent.putExtra("code",code);
            setResult(RESULT_OK, intent);
            finish();
        }
    }
}

LoginActivity in AndroidManifest.xml : AndroidManifest.xml LoginActivity

<activity
    android:name=".ui.activities.LoginActivity"
    android:label="@string/app_name"
    android:theme="@style/AppTheme.NoActionBar">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
<activity android:name=".ui.activities.BrowserActivity"
          android:label="@string/app_name"
          android:theme="@style/AppTheme.NoActionBar">
    <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="app"
            />
    </intent-filter>
</activity>

First, you start the browser with 首先,您使用

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
    startActivityForResult(intent, 1);

this intent does not return any result. 此意图不会返回任何结果。 It only request the browser to show the url. 它仅请求浏览器显示URL。 So the browser does not returning any result. 因此,浏览器不会返回任何结果。 However, after authentification, the browser trigger an intent and request for a new instance of LoginActivity. 但是,在身份验证之后,浏览器会触发意图并请求LoginActivity的新实例。 onCreate() is called of course 当然会调用onCreate()

It is like LoginActivity(#1) -> Browser -> LoginActivity(#2) 就像LoginActivity(#1)-> Browser-> LoginActivity(#2)

you can call this portion of code inside onCreate() it will work: 您可以在onCreate()中调用这部分代码,它将起作用:

Uri uri = getIntent().getData();
String code = uri.getQueryParameter("code");
Log.d("called",code);

But two different intents(launcher and action_view) can reach the same activity for two different purposes. 但是出于两个不同的目的,两个不同的意图(launcher和action_view)可以达到相同的活动。 You'd better create two different activities. 您最好创建两个不同的活动。 First your usual LoginActivity and a second one (which inherit from the first) BrowserActivity wich redifine onCreate. 首先是通常的LoginActivity,然后是第二个(从第一个继承)的BrowserActivity,它具有redifine onCreate。 So far, your Manifest will look like 到目前为止,您的清单将看起来像

<activity
android:name=".ui.activities.LoginActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".ui.activities.BrowserActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">

<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="app"
        />
</intent-filter>
</activity>

The LoginActivity code should look like this: LoginActivity代码应如下所示:

public class LoginActivity extends AppCompatActivity {

Button loginButton;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);
    loginButton = findViewById(R.id.button);
    final String url = "oauth url...";
    Log.d("called","oncreate");
    loginButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.d("called","onclick");
            attemptLogin(url);
        }
    });
}

private void attemptLogin(String url){
    Log.d("called","onattempt");

        // open the browser with url

        Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        startActivity(i);
}

// no onResult 

}

And this is the BrowserActivityCode: 这是BrowserActivityCode:

public class BrowserActivity extends LoginActivity {

// this will be triggered after authentification
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    processIntent();
}


protected void processIntent() {
    Intent intentFromBrowser = getIntent();
    if (intentFromBrowser != null) {
        Uri uri = intentFromBrowser.getData();
    if(uri != null && uri.toString().startsWith(CALLBACK_URL)) {
        String code = uri.getQueryParameter("code");
        Log.d("code value", code);
    }
    }
}
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM