在Android应用中,实现Android与JavaScript的交互,以实现从WebView中打开原生页面并传递参数,可以通过以下详细步骤完成:
1. 准备工作
- 添加WebView至布局:在你的Activity或Fragment的XML布局文件中加入WebView控件。
2. 配置WebView
- 启用JavaScript:在Java代码中设置WebView的属性,启用JavaScript支持。
WebView webView = findViewById(R.id.webView);
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
- 添加JavaScriptInterface:创建一个Java类作为桥梁,供JavaScript调用,用来打开原生页面。
3. 创建JavaScriptInterface
public class WebAppInterface {
Context mContext;
WebAppInterface(Context c) {
mContext = c;
}
@JavascriptInterface
public void openNativePage(String url) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
mContext.startActivity(intent);
}
}
确保在AndroidManifest.xml中注册所有可能被启动的Activity。
4. 注册URL Scheme
在目标Activity的AndroidManifest.xml中,通过Intent Filter注册自定义URL Scheme。
<activity android:name=".NativeActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="myapp" android:host="native" />
</intent-filter>
</activity>
5. 交互逻辑
- 在WebView中嵌入JavaScript:在网页中编写JavaScript代码,通过调用WebAppInterface中的方法来打开原生页面。
<button onclick="openNativePage('myapp://native?key=value')">打开原生页面</button>
<script>
function openNativePage(url) {
window.Android.openNativePage(url);
}
</script>
- 传递参数:通过URL的查询参数(如?key=value)来传递数据。
6. 接收参数
在被启动的原生Activity中,通过Intent获取传递的参数。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_your_layout);
// 获取Intent
Intent intent = getIntent();
if (intent != null && intent.getData() != null) {
// 解析Intent中的Uri
Uri data = intent.getData();
// 从Uri中获取"key"参数的值
String Key = data.getQueryParameter("key");
// 使用codeValue进行后续操作
if (Key != null) {
Log.d("Key ", "key: " + Key );
// 进行你需要的操作,比如显示在TextView上,或者作为请求参数等
} else {
Log.w("Key ", "key parameter was not found in the Intent's Uri.");
}
} else {
Log.e("Intent Error", "Intent or Intent Data is null.");
}
}