Android 在活动中获取WebView和匿名BroadcastReceiver通信时遇到问题

Android 在活动中获取WebView和匿名BroadcastReceiver通信时遇到问题,android,Android,我想要一个匿名广播接收者响应WebView内部的链接。我以为我可以用意图过滤器来做这件事,但事情不起作用。以下是我的活动代码: public class WebViewReceiverActivity extends Activity { private BroadcastReceiver mReceiver; @Override public void onCreate(Bundle savedInstanceState) { super.onCre

我想要一个匿名广播接收者响应WebView内部的链接。我以为我可以用意图过滤器来做这件事,但事情不起作用。以下是我的活动代码:

public class WebViewReceiverActivity extends Activity {

    private BroadcastReceiver mReceiver;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        WebView webView = (WebView) findViewById(R.id.webview);

        webView.loadData("<a href=\"webview-receiver:///\">This should Toast</a>", "text/html", "utf8");

        mReceiver = new BroadcastReceiver() {

            @Override
            public void onReceive(Context context, Intent intent) {
                Uri data = intent.getData();
                if (data != null && data.getScheme().equals("webview-receiver")) {
                    Toast.makeText(WebViewReceiverActivity.this, "Toasty", Toast.LENGTH_SHORT).show();
                }
            }

        };

        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(Intent.ACTION_VIEW);
        intentFilter.addCategory(Intent.CATEGORY_DEFAULT);
        intentFilter.addCategory(Intent.CATEGORY_BROWSABLE);
        intentFilter.addDataScheme("webview-receiver");

        registerReceiver(mReceiver, intentFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        unregisterReceiver(mReceiver);
    }


}
公共类WebViewReceiver活动扩展活动{
专用广播接收机;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
WebView WebView=(WebView)findViewById(R.id.WebView);
loadData(“,”text/html“,”utf8“);
mReceiver=新广播接收器(){
@凌驾
公共void onReceive(上下文、意图){
Uri data=intent.getData();
if(data!=null&&data.getScheme().equals(“webview接收器”)){
Toast.makeText(WebViewReceiverActivity.this,“Toast”,Toast.LENGTH_SHORT.show();
}
}
};
IntentFilter IntentFilter=新的IntentFilter();
intentFilter.addAction(Intent.ACTION\u视图);
intentFilter.addCategory(Intent.CATEGORY\u默认值);
intentFilter.addCategory(Intent.CATEGORY可浏览);
intentFilter.addDataScheme(“webview接收器”);
注册接收者(mReceiver,intentFilter);
}
@凌驾
受保护的空onDestroy(){
super.ondestory();
未注册接收人(mReceiver);
}
}
以下是main.xml布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <WebView
        android:id="@+id/webview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:scrollbarStyle="insideOverlay" />

</LinearLayout>


当点击WebView中的链接时,我得到一个页面未找到错误,并且没有Toast。这种方法可行吗?我正在考虑只使用WebViewClient,应该改为使用OverrideUrlLoading(),但如果我能让BroadcastReceiver方法工作,我会更愿意这样做。

我最终在BroadcastReceiver和WebViewClient之间采用了一种混合方法:

webView.setWebViewClient(new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        Uri uri = Uri.parse(url);
        if (uri.getScheme().equals("webview-receiver")) {
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setData(uri);

            sendBroadcast(intent);

            return true;    
        }

        return false;
    }
});

我这样做是因为我正在处理的当前代码库的限制。在shouldOverrideUrlLoading()方法中只执行BroadcastReceiver onReceive()方法的所有逻辑可能会简单得多。

使用javascript到java接口响应web视图中的单击