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