如何处理Android应用程序的多个深度链接

里特什

我已经创建了一个Android应用。每当有人通过该应用程序打开网站时,都会转到确切的链接。但是,如果用户打开另一个链接,则该应用程序仍在先前打开的链接上。您可以在以下位置检查应用程序:https : //play.google.com/store/apps/details?id=app.freeairdrop.io

通过Telegram或Whatsapp将这2个链接发送给自己:

  1. https://freeairdrop.io/airdrop/morpher.html
  2. https://freeairdrop.io/airdrop/simbcoin.html

现在,当系统提示您选择应用程序时,打开我的应用程序中的第一个链接。切换回Telegram / whatsapp,然后单击第二个链接。我的应用程序将打开,但仍在该页面(第一个链接)上。没有任何反应,除非关闭应用程序,否则该应用程序将无法加载第二个链接。

MainActivity.java代码:

package app.freeairdrop.io;

import...    

public class MainActivity extends Activity{
    private ProgressBar progressBar;
    private WebView webView;
    private SwipeRefreshLayout mySwipeRefreshLayout;
    private boolean mShouldPause;

    @SuppressLint("SetJavaScriptEnabled")
    @Override
    public void onCreate(Bundle savedInstanceState) {


        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        progressBar = (ProgressBar) findViewById(R.id.progressBar);
        progressBar.setMax(100);
        webView = (WebView) findViewById(R.id.webView);
        webView.setWebViewClient(new WebViewClientDemo());
        webView.setWebChromeClient(new WebChromeClientDemo());
        mySwipeRefreshLayout = (SwipeRefreshLayout) this.findViewById(R.id.swipeContainer);


        mySwipeRefreshLayout.setOnRefreshListener(
                new SwipeRefreshLayout.OnRefreshListener() {
                    @Override
                    public void onRefresh() {
                        webView.reload();
                        mySwipeRefreshLayout.setRefreshing(false);
                    }
                }
        );

        // ATTENTION: This was auto-generated to handle app links.
        Intent appLinkIntent = getIntent();
        String appLinkAction = appLinkIntent.getAction();
        Uri appLinkData = appLinkIntent.getData();

        if (getIntent().getExtras() != null) {
            if (appLinkData == null){
                webView.loadUrl("https://freeairdrop.io/");
            }else
            webView.loadUrl(String.valueOf(appLinkData));

        } else if (getIntent().getExtras() == null){
            webView.loadUrl("https://freeairdrop.io/");

        }webView.reload();
    }

    private class WebViewClientDemo extends WebViewClient {

        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            super.onReceivedError(view, errorCode, description, failingUrl);
            Toasty.error(getApplicationContext(), "No Internet, pull down to refresh when you're connected to internet", Toast.LENGTH_LONG, true).show();
        }


        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            Uri uri = Uri.parse(url);
            if (uri.getHost() != null && (url.startsWith("https://freeairdrop.io/") || url.startsWith("https://www.freeairdrop.io/"))) {
                return false;
            }

            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            view.getContext().startActivity(intent);
            return true;
        }
        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            progressBar.setVisibility(View.GONE);
            progressBar.setProgress(100);
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
            progressBar.setVisibility(View.VISIBLE);
            progressBar.setProgress(0);
        }
    }


    private class WebChromeClientDemo extends WebChromeClient {

        public void onProgressChanged(WebView view, int progress) {
            progressBar.setProgress(progress);
        }
    }
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) {
            webView.goBack();
            return true;
        }
        else {
        }
        return super.onKeyDown(keyCode, event);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        return true;
    }

    @Override
    // This method is used to detect back button
    public void onBackPressed() {
        if (this.webView.canGoBack()) {
            this.webView.goBack();
            return;
        }

        else {
            // Let the system handle the back button
           super.onBackPressed();
        }
    }


}

AndroidManifest代码:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="app.freeairdrop.io">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

    <application
        android:appCategory="productivity"
        android:hardwareAccelerated="true"
        android:allowBackup="true"
        android:fullBackupContent="true"
        android:icon="@mipmap/ic_launcher"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:label="@string/app_name"
        android:theme="@style/AppTheme"
        android:name=".ApplicationClass"
        tools:ignore="GoogleAppIndexingWarning">
        <activity
            android:name="app.freeairdrop.io.MainActivity"
            android:label="@string/app_name"
            android:configChanges="orientation|screenSize|screenLayout"
            android:resizeableActivity="false"
            android:supportsPictureInPicture="false"
            android:launchMode="singleInstance"
            >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <intent-filter android:autoVerify="true">
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data
                    android:scheme="https"
                    android:host="freeairdrop.io" />
            </intent-filter>


        </activity>
    </application>


</manifest>
j

设置android:launchMode="singleInstance"为活动将仅导致该活动的一个实例运行。这意味着当您通过Deeplink打开一次活动后,该实例正在运行。当您打开第二个链接时,您希望您的UI得到更新,但是由于实例仍在运行,因此onCreate不会调用活动的UI ,这就是为什么您从较早的链接中看到视图的原因。(另一点是,在设置singleInstance时不会允许堆栈中进行其他任何活动。)

您可以在官方文档中获取更多信息

现在,即使onCreate是从来没有所谓,但onResumeonNewIntent方法都被调用时singleInstance是集。尽管onNewIntent通常提到可以使用singleTop,但是根据我的经验,当设置三个单个标志中的任何一个时,确实会调用它。

因此,您需要覆盖两者中的任何一个,并编写代码以更新其中的UI。还要注意,onResume在第一次创建活动后确实会调用它,onCreate因此,如果在那儿放置代码,则可能需要优化以避免重复加载同一件事,并且每次onResume都会被调用,就像从后台返回后一样。在这种情况下onNewIntent(),似乎是一个更好的选择。

希望这对您有所帮助。

更新:根据要求,您可以在下面找到修改后的代码

package app.freeairdrop.io;

        import...

public class MainActivity extends Activity{
    private ProgressBar progressBar;
    private WebView webView;
    private SwipeRefreshLayout mySwipeRefreshLayout;
    private boolean mShouldPause;

    @SuppressLint("SetJavaScriptEnabled")
    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        progressBar = (ProgressBar) findViewById(R.id.progressBar);
        progressBar.setMax(100);
        webView = (WebView) findViewById(R.id.webView);
        webView.setWebViewClient(new WebViewClientDemo());
        webView.setWebChromeClient(new WebChromeClientDemo());
        mySwipeRefreshLayout = (SwipeRefreshLayout) this.findViewById(R.id.swipeContainer);

        mySwipeRefreshLayout.setOnRefreshListener(
                new SwipeRefreshLayout.OnRefreshListener() {
                    @Override
                    public void onRefresh() {
                        webView.reload();
                        mySwipeRefreshLayout.setRefreshing(false);
                    }
                }
        );
        // call your method here to manage the intent
        manageIntent(getIntent());
    }

    /* Simply moved your code which handles the intent to a common method
     * Call this method from onCreate so that when first instance of activity gets created it handles it
     * Similarly call it from onNewIntent to manage the new link you get
     * You just need to pass the respective intents from the methods
     */
    public void manageIntent(Intent intent) {
        // ATTENTION: This was auto-generated to handle app links.
        Intent appLinkIntent = intent;
        String appLinkAction = appLinkIntent.getAction();
        Uri appLinkData = appLinkIntent.getData();

        if (getIntent().getExtras() != null) {
            if (appLinkData == null){
                webView.loadUrl("https://freeairdrop.io/");
            }else
                webView.loadUrl(String.valueOf(appLinkData));

        } else if (getIntent().getExtras() == null){
            webView.loadUrl("https://freeairdrop.io/");

        }
    }

    // override to get the new intent when this activity has an instance already running
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        // again call the same method here with the new intent received
        manageIntent(intent);
    }

    private class WebViewClientDemo extends WebViewClient {

        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            super.onReceivedError(view, errorCode, description, failingUrl);
            Toasty.error(getApplicationContext(), "No Internet, pull down to refresh when you're connected to internet", Toast.LENGTH_LONG, true).show();
        }


        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            Uri uri = Uri.parse(url);
            if (uri.getHost() != null && (url.startsWith("https://freeairdrop.io/") || url.startsWith("https://www.freeairdrop.io/"))) {
                return false;
            }

            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            view.getContext().startActivity(intent);
            return true;
        }
        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            progressBar.setVisibility(View.GONE);
            progressBar.setProgress(100);
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
            progressBar.setVisibility(View.VISIBLE);
            progressBar.setProgress(0);
        }
    }


    private class WebChromeClientDemo extends WebChromeClient {

        public void onProgressChanged(WebView view, int progress) {
            progressBar.setProgress(progress);
        }
    }
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) {
            webView.goBack();
            return true;
        }
        else {
        }
        return super.onKeyDown(keyCode, event);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        return true;
    }

    @Override
    // This method is used to detect back button
    public void onBackPressed() {
        if (this.webView.canGoBack()) {
            this.webView.goBack();
            return;
        }

        else {
            // Let the system handle the back button
            super.onBackPressed();
        }
    }

}

看看这是否对您有用,让我知道。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何处理Phonegap + JQM应用程序中的链接?

来自分类Dev

应用程序如何处理 Windows 符号链接?

来自分类Dev

你如何处理 xamarin android 项目中的多个应用程序类

来自分类Dev

从应用程序打开android深度链接

来自分类Dev

从应用程序打开android深度链接

来自分类Dev

如何处理Android应用程序中的标记双击

来自分类Dev

如何处理退出的Android应用程序?

来自分类Dev

elixir 伞形应用程序中如何处理多个应用程序配置文件

来自分类Dev

如何在android中处理多个应用程序类

来自分类Dev

如何在android中处理多个应用程序类

来自分类Dev

Firebase 2.0-如何处理Android应用程序的多种风格(环境)?

来自分类Dev

Android Gallery应用程序如何处理Picasa媒体文件?

来自分类Dev

如何处理Android Launcher应用程序中的主页按钮问题

来自分类Dev

Android NDK:应用程序完成后,使用malloc分配的内存将如何处理?

来自分类Dev

Android-如果用户卸载应用程序,该如何处理

来自分类Dev

如何处理WPF应用程序中未处理的应用程序级异常?

来自分类Dev

停用应用程序时如何处理后台线程

来自分类Dev

opa如何处理桌面和移动应用程序

来自分类Dev

该应用程序应如何处理延迟的SKPaymentTransaction?

来自分类Dev

如何处理Django应用程序CI中的迁移

来自分类Dev

商业应用程序如何处理更新?

来自分类Dev

商业应用程序如何处理更新?

来自分类Dev

停用应用程序时如何处理后台线程

来自分类Dev

如何处理您的Windows应用程序被强制关闭?

来自分类Dev

应用程序关闭时如何处理localNotifications

来自分类Dev

如何处理 Azure 逻辑应用程序中的异常

来自分类Dev

Python Dropbox应用程序,我应该如何处理应用程序密钥和应用程序机密?

来自分类Dev

Android深度链接:对应用程序和Play商店使用相同的链接

来自分类Dev

如何处理 Meteor 登录后深度链接

Related 相关文章

  1. 1

    如何处理Phonegap + JQM应用程序中的链接?

  2. 2

    应用程序如何处理 Windows 符号链接?

  3. 3

    你如何处理 xamarin android 项目中的多个应用程序类

  4. 4

    从应用程序打开android深度链接

  5. 5

    从应用程序打开android深度链接

  6. 6

    如何处理Android应用程序中的标记双击

  7. 7

    如何处理退出的Android应用程序?

  8. 8

    elixir 伞形应用程序中如何处理多个应用程序配置文件

  9. 9

    如何在android中处理多个应用程序类

  10. 10

    如何在android中处理多个应用程序类

  11. 11

    Firebase 2.0-如何处理Android应用程序的多种风格(环境)?

  12. 12

    Android Gallery应用程序如何处理Picasa媒体文件?

  13. 13

    如何处理Android Launcher应用程序中的主页按钮问题

  14. 14

    Android NDK:应用程序完成后,使用malloc分配的内存将如何处理?

  15. 15

    Android-如果用户卸载应用程序,该如何处理

  16. 16

    如何处理WPF应用程序中未处理的应用程序级异常?

  17. 17

    停用应用程序时如何处理后台线程

  18. 18

    opa如何处理桌面和移动应用程序

  19. 19

    该应用程序应如何处理延迟的SKPaymentTransaction?

  20. 20

    如何处理Django应用程序CI中的迁移

  21. 21

    商业应用程序如何处理更新?

  22. 22

    商业应用程序如何处理更新?

  23. 23

    停用应用程序时如何处理后台线程

  24. 24

    如何处理您的Windows应用程序被强制关闭?

  25. 25

    应用程序关闭时如何处理localNotifications

  26. 26

    如何处理 Azure 逻辑应用程序中的异常

  27. 27

    Python Dropbox应用程序,我应该如何处理应用程序密钥和应用程序机密?

  28. 28

    Android深度链接:对应用程序和Play商店使用相同的链接

  29. 29

    如何处理 Meteor 登录后深度链接

热门标签

归档