簡體   English   中英

調用onCreate()而不是onActivityResult()

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

因此,我正在使用來自瀏覽器的OAuth通過GitHub帳戶對用戶進行身份驗證。 但是在我從LoginActivity觸發了Intent LoginActivityonResume()在用戶打開瀏覽器之前得到執行,因此返回的uri值等於null

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

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();
        }
    }
}

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>

首先,您使用

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

此意圖不會返回任何結果。 它僅請求瀏覽器顯示URL。 因此,瀏覽器不會返回任何結果。 但是,在身份驗證之后,瀏覽器會觸發意圖並請求LoginActivity的新實例。 當然會調用onCreate()

就像LoginActivity(#1)-> Browser-> LoginActivity(#2)

您可以在onCreate()中調用這部分代碼,它將起作用:

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

但是出於兩個不同的目的,兩個不同的意圖(launcher和action_view)可以達到相同的活動。 您最好創建兩個不同的活動。 首先是通常的LoginActivity,然后是第二個(從第一個繼承)的BrowserActivity,它具有redifine onCreate。 到目前為止,您的清單將看起來像

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

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 

}

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