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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在我的应用程序中正确处理自定义URL方案(避免多次处理)?相关的知识,希望对你有一定的参考价值。

我在android 4+应用中添加了自定义网址方案,以便能够深入链接到某些视图/活动:

// 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这样的链接时,我的应用程序是startet并且显示了WebServiceSettingsActivity

但是:当按下后退按钮时,再次显示WebServiceSettingsActivity。似乎MainActivity与之前的意图重新开始,因此再次显示设置......

这可以无限期地重复。怎么解决这个?

答案

你的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
    }
}

以上是关于如何在我的应用程序中正确处理自定义URL方案(避免多次处理)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 TeamCity 中写入自定义值的共享资源?

使用 UIStoryBoard 基于自定义 URL 方案处理屏幕

在 Xcode 中,如何在我的项目设置中指定正确的库以避免链接错误?

iOS 9.3.2 自定义 URL 方案未从 Safari 启动应用程序

如何从我的 C# 代码中通过自定义 url 方案访问传递到我的应用程序的值?

如何在自定义反序列化器 Spring Boot 中读取路径变量或 URL 参数