正在打开来自应用的 android 个深层链接

Opening android deep links from app

我正在我的应用程序中实施深度 links,但无法找到一种方法,也找不到从我自己的应用程序中打开它们的示例。例如:我希望打开某个横幅会打开 myapp://game/1 link,这会导致我的应用程序中出现另一个 activity。我该怎么做?

您应该在清单中注册深度 linking 方案。

    <activity android:name=".DeepLinkingActivity"
        android:configChanges="orientation|screenSize" >
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.BROWSABLE" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="myapp" />
        </intent-filter>
    </activity>

有了这个,DeepLinkingActivity 将在单击具有已定义方案的 link 时打开。并在 activity 句柄中做什么:

private final String GAME_LINK = "game";
private final String VIDEO_LINK = "video";

private static String PASSED_LINK = "PassedLink";

public static Intent createIntent(String link, Context context) {
    Intent intent = new Intent(context, DeepLinkingActivity.class);
    intent.putExtra(PASSED_LINK, link);
    return intent;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
    String host;
    String link = getIntent().getStringExtra(PASSED_LINK);
    if(TextUtils.isEmpty(link)) {
       Intent intent = getIntent();
        if (intent.getData() != null) {
            Uri data = intent.getData();
            host = data.getHost();
        } else {
           // No links
        }
    } else {
          Uri data = Uri.parse(link);
          host = data.getHost();
    }

    if(host.equals(GAME_LINK))  {
        // myapp://game/
        // Do something
    } else if(host.equals(VIDEO_LINK)){
        // myapp://video/
        // Do something
    } else {
        // Do something
    }
 ...
 }

然后您可以从您的小部件调用:

widget.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            startActivity(DeepLinkingActivity.createIntent("linik_for_this_wiget"), getContext());
        }
    });

如果您在 WebView 中有 links,您也可以覆盖 shouldOverrideUrlLoading