Android 如何判断loadUrl()是直接调用的还是由于接触链接而调用的?

Android 如何判断loadUrl()是直接调用的还是由于接触链接而调用的?,android,webview,android-webview,Android,Webview,Android Webview,在WebView派生类中,I重写loadUrl(): 在这个被重写的loadUrl()中,我想知道它是由于用户触摸链接(在同一个WebView中)而被调用的,还是实际上在我的程序中的某个地方被直接调用的(或者是由我直接调用的,或者是由于某些Javascript处理等而间接调用的) 我最初想通过在OnTouchListener()中设置一个标志来区分两者: 并在检查其值后在loadUrl()中重置它 这个“解决方案”的问题在于,在前面提到的onTouch()实现中,任何触摸都会设置标志,因此可能出

在WebView派生类中,I重写loadUrl():

在这个被重写的loadUrl()中,我想知道它是由于用户触摸链接(在同一个WebView中)而被调用的,还是实际上在我的程序中的某个地方被直接调用的(或者是由我直接调用的,或者是由于某些Javascript处理等而间接调用的)

我最初想通过在
OnTouchListener()
中设置一个标志来区分两者:

并在检查其值后在loadUrl()中重置它

这个“解决方案”的问题在于,在前面提到的onTouch()实现中,任何触摸都会设置标志,因此可能出现类似这样的错误情况:

  • 用户触摸屏幕(但不是链接!)
  • onTouch设置标志
  • 我的程序直接调用loadUrl()
  • loadUrl()检查该标志并认为它是由于触摸而被调用的
  • 显然,上面的onTouch()处理过于简单,无法工作

    您知道如何实现真正知道如何区分触摸触发加载URL()和非触摸触发加载URL()的代码吗

    更新:我检查了下面的堆栈跟踪建议,这是通过触摸调用loadUrl()时的堆栈跟踪:

    com.utubefan.MyWebView.loadUrl(MyWebView.java:365)
    com.utubefan.MyWebViewClient.shouldOverrideUrlLoading(MyWebViewClient.java:123)
    android.webkit.CallbackProxy.uiOverrideUrlLoading(CallbackProxy.java:216)
    android.webkit.CallbackProxy.handleMessage(CallbackProxy.java:323)
    android.os.Handler.dispatchMessage(Handler.java:99)
    android.os.Looper.loop(Looper.java:123)
    android.app.ActivityThread.main(ActivityThread.java:4627)
    java.lang.reflect.Method.invokeNative(Native Method)
    java.lang.reflect.Method.invoke(Method.java:521)
    com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
    com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
    dalvik.system.NativeStart.main(Native Method)
    
    我不确定我是否能在那里识别出一个明确的触摸事件,但以下内容看起来很有希望(它们不会出现在非触摸加载URL上):


    我不知道有什么合适的方法来满足你的要求,但我能想出一种可能有效的方法。在loadUrl()覆盖中,您可以查询调用堆栈并查看调用的例程。您的来电者将是指向您的触摸的一个位置,以及通过编程调用的任何其他位置


    包含显示如何从可丢弃文件(您将在loadUrl()方法中创建)确定堆栈跟踪的代码。

    这是一个好主意。这是否假设触摸的“堆叠距离”始终相同?当然值得一试(除非有更直接的WebView特定的现有机制)。我认为堆栈路径不会改变,因为它是直接或间接调用loadUrl()的同一个例程。风险在于不同版本的Android框架具有不同的调用特征——风险较低,但如果您需要广泛的覆盖范围,可以使用不同版本的模拟器进行研究。请参阅上面我的更新<代码>uiOverrideUrlLoading看起来很有希望,但是现在你指出了不同Android版本的可能性,这看起来很可怕。有那么多的Android版本和口味。。。
    public boolean onTouch(View v, MotionEvent event) {
      if (event.getAction() == MotionEvent.ACTION_UP) {
          // set flag !!!
      }
      return false;
    } 
    
    com.utubefan.MyWebView.loadUrl(MyWebView.java:365)
    com.utubefan.MyWebViewClient.shouldOverrideUrlLoading(MyWebViewClient.java:123)
    android.webkit.CallbackProxy.uiOverrideUrlLoading(CallbackProxy.java:216)
    android.webkit.CallbackProxy.handleMessage(CallbackProxy.java:323)
    android.os.Handler.dispatchMessage(Handler.java:99)
    android.os.Looper.loop(Looper.java:123)
    android.app.ActivityThread.main(ActivityThread.java:4627)
    java.lang.reflect.Method.invokeNative(Native Method)
    java.lang.reflect.Method.invoke(Method.java:521)
    com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
    com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
    dalvik.system.NativeStart.main(Native Method)
    
    android.webkit.CallbackProxy.uiOverrideUrlLoading(CallbackProxy.java:216)
    android.webkit.CallbackProxy.handleMessage(CallbackProxy.java:323)