如何正确处理我的应用程序中的自定义URL方案(避免多次处理)?

时间:2018-11-14 14:17:23

标签: android android-activity

我已在我的Android 4+应用程序中添加了自定义URL方案,以便能够深度链接到某些视图/活动:

// AndroidManifest.xml
...
<activity
    android:name=".MainActivity"
    android:label="@string/app_name" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    <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="myapp"/>
        <data android:host="webservice"/>
    </intent-filter>
</activity> 



// MainActivity
protected void onCreate(Bundle savedInstanceState) {
    Intent intent = getIntent();
    if (intent != null && Intent.ACTION_VIEW.equals(intent.getAction())) {
        Uri uri = intent.getData();
        if (uri.getScheme().equalsIgnoreCase("myapp") && uri.getHost().equalsIgnoreCase("webservice")) {
            Intent settingsIntent = new Intent(MainActivity.this, WebServiceSettingsActivity.class);
            startActivity(settingsIntent);
        }
    }
}

这很好用,当使用诸如myapp://webservice/something之类的链接时,我的应用程序启动了,并且显示了WebServiceSettingsActivity

但是::按返回按钮时,将再次显示WebServiceSettingsActivity。看来MainActivity是按照与以前相同的意图重新启动的,因此设置会再次显示...

这可以无限期地重复。该如何解决?

1 个答案:

答案 0 :(得分:0)

您的MainActivity正在打开您的WebServiceSettingsActivity,但您永远都无法完成。这给您两个选择:

  1. 致电this.finish();后立即致电startActivity(settingsIntent);

这会杀死您的MainActivity,因此在完成WebServiceSettingsActivity之后将没有任何返回值。

2(更好)。使用startActivityForResult()而不是startActivity()打开WebServiceSettingsActivity,并在且仅当从WebServiceSettingsActivity返回时才完成MainActivity:

private static final int REQUEST_CODE_WEB = 1;

public void onCreate(Bundle savedInstance) {
    ...
    if (...) {
        startActivityForResult(settingsIntent, REQUEST_CODE_WEB);
    }
}

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_CODE_WEB) {
        finish(); // Or do whatever you want, such as load your main content
    }
}