意图锚语法描述

时间:2014-04-22 22:41:00

标签: android android-intent

我正在尝试使用意图锚来启动我的应用here。我可以使用这种语法来启动我的应用程序,

<a href="intent://#Intent;scheme=http;package=com.example.myapp;end">Launch my app</a>

但我不知道许多不同的元素是什么意思。

基于意图的URI的基本语法如下:

  

意图:

     
HOST/URI-path // Optional host 
#Intent; 
  package=[string]; 
   action=[string]; 
   category=[string]; 
   component=[string]; 
   scheme=[string]; 
end;
  
  1. 每个细分的含义是什么(所以我知道如何最好地利用它们)
  2. 我如何/在哪里可以包含任何额外数据(即我自己的参数)

2 个答案:

答案 0 :(得分:10)

以下是toUri()类的方法Intent

public String toUri(int flags) {
    StringBuilder uri = new StringBuilder(128);
    String scheme = null;
    if (mData != null) {
        String data = mData.toString();
        if ((flags&URI_INTENT_SCHEME) != 0) {
            final int N = data.length();
            for (int i=0; i<N; i++) {
                char c = data.charAt(i);
                if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')
                        || c == '.' || c == '-') {
                    continue;
                }
                if (c == ':' && i > 0) {
                    // Valid scheme.
                    scheme = data.substring(0, i);
                    uri.append("intent:");
                    data = data.substring(i+1);
                    break;
                }
                // No scheme.
                break;
            }
        }
        uri.append(data);
    } else if ((flags&URI_INTENT_SCHEME) != 0) {
        uri.append("intent:");
    }
    uri.append("#Intent;");
    if (scheme != null) {
        uri.append("scheme=").append(scheme).append(';');
    }
    if (mAction != null) {
        uri.append("action=").append(Uri.encode(mAction)).append(';');
    }
    if (mCategories != null) {
        for (String category : mCategories) {
            uri.append("category=").append(Uri.encode(category)).append(';');
        }
    }
    if (mType != null) {
        uri.append("type=").append(Uri.encode(mType, "/")).append(';');
    }
    if (mFlags != 0) {
        uri.append("launchFlags=0x").append(Integer.toHexString(mFlags)).append(';');
    }
    if (mPackage != null) {
        uri.append("package=").append(Uri.encode(mPackage)).append(';');
    }
    if (mComponent != null) {
        uri.append("component=").append(Uri.encode(
                mComponent.flattenToShortString(), "/")).append(';');
    }
    if (mSourceBounds != null) {
        uri.append("sourceBounds=")
                .append(Uri.encode(mSourceBounds.flattenToString()))
                .append(';');
    }
    if (mExtras != null) {
        for (String key : mExtras.keySet()) {
            final Object value = mExtras.get(key);
            char entryType =
                    value instanceof String    ? 'S' :
                    value instanceof Boolean   ? 'B' :
                    value instanceof Byte      ? 'b' :
                    value instanceof Character ? 'c' :
                    value instanceof Double    ? 'd' :
                    value instanceof Float     ? 'f' :
                    value instanceof Integer   ? 'i' :
                    value instanceof Long      ? 'l' :
                    value instanceof Short     ? 's' :
                    '\0';
            if (entryType != '\0') {
                uri.append(entryType);
                uri.append('.');
                uri.append(Uri.encode(key));
                uri.append('=');
                uri.append(Uri.encode(value.toString()));
                uri.append(';');
            }
        }
    }
    uri.append("end");
    return uri.toString();
}

如果您可以阅读Java代码,那么应该非常清楚这里发生了什么。在任何情况下,额外内容都可以放在URL中,它们看起来像这样:

<type>.<key>=<value>;

其中<type>是以下之一:

S = String
B = Boolean
b = Byte
c = Character
d = Double
f = Float
i = Integer
l = Long
s = Short

以下是一些例子:

启动应用:

<a href="intent://#Intent;scheme=http;package=com.example.myapp;end"> 

使用一个名为“foo”的字符串额外启动app,其中包含值“bar123”:

<a href="intent://#Intent;scheme=http;package=com.example.myapp;S.foo=bar123;end"> 

使用包含值“bar123”的名为“foo”的字符串附加项和包含值“-567”的名为“number”的整数附加项启动应用程序:

<a href="intent://#Intent;scheme=http;package=com.example.myapp;S.foo=bar123;i.number=-567;end"> 

答案 1 :(得分:0)

与android 28一样,API已更改。 toUri代码已更改为以下内容:

public String toUri(@UriFlags int flags) {
    StringBuilder uri = new StringBuilder(128);
    if ((flags&URI_ANDROID_APP_SCHEME) != 0) {
        if (mPackage == null) {
            throw new IllegalArgumentException(
                    "Intent must include an explicit package name to build an android-app: "
                    + this);
        }
        uri.append("android-app://");
        uri.append(mPackage);
        String scheme = null;
        if (mData != null) {
            scheme = mData.getScheme();
            if (scheme != null) {
                uri.append('/');
                uri.append(scheme);
                String authority = mData.getEncodedAuthority();
                if (authority != null) {
                    uri.append('/');
                    uri.append(authority);
                    String path = mData.getEncodedPath();
                    if (path != null) {
                        uri.append(path);
                    }
                    String queryParams = mData.getEncodedQuery();
                    if (queryParams != null) {
                        uri.append('?');
                        uri.append(queryParams);
                    }
                    String fragment = mData.getEncodedFragment();
                    if (fragment != null) {
                        uri.append('#');
                        uri.append(fragment);
                    }
                }
            }
        }
        toUriFragment(uri, null, scheme == null ? Intent.ACTION_MAIN : Intent.ACTION_VIEW,
                mPackage, flags);
        return uri.toString();
    }
    String scheme = null;
    if (mData != null) {
        String data = mData.toString();
        if ((flags&URI_INTENT_SCHEME) != 0) {
            final int N = data.length();
            for (int i=0; i<N; i++) {
                char c = data.charAt(i);
                if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')
                        || (c >= '0' && c <= '9') || c == '.' || c == '-' || c == '+') {
                    continue;
                }
                if (c == ':' && i > 0) {
                    // Valid scheme.
                    scheme = data.substring(0, i);
                    uri.append("intent:");
                    data = data.substring(i+1);
                    break;
                }

                // No scheme.
                break;
            }
        }
        uri.append(data);

    } else if ((flags&URI_INTENT_SCHEME) != 0) {
        uri.append("intent:");
    }

    toUriFragment(uri, scheme, Intent.ACTION_VIEW, null, flags);

    return uri.toString();
}

这表明所选答案将不再起作用。

检查this answer by David Wasser,了解有效的解决方案。