intent.putExtras(String key, Message object) throws 无法跨进程编组非 Parcelable 对象
intent.putExtras(String key, Message object) throws Can't marshal non-Parcelable objects across processes
这是我的 WebChromeClient
我的默认 activity:
@Override
public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
Intent intent = new Intent(mActivty, PopUpActivity.class);
intent.putExtra("MESSAGE", resultMsg);
mActivity.startActivity(intent);
return true;
这就是我在 PopUpActivity
中的处理方式:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_webpage);
getWindow().setBackgroundDrawable(null);
mCloseButton = (ImageButton) findViewById(R.id.close_button);
// we don't care about getting a warmed webview in this case, just create a new one
mWebView = WebViewConstructor.constructWebView(this);
mWebViewContainer = (RelativeLayout) findViewById(R.id.webview_container);
// add the webview to the container layout
WebViewManager.attachWebViewToParentContainer(mWebView, mWebViewContainer);
Intent intent = getIntent();
if (intent.getExtras() != null) {
Message resultMsg = intent.getExtras().getParcelable("MESSAGE");
WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
transport.setWebView(mWebView);
resultMsg.sendToTarget();
}
基本上,我想将作为 resultMsg.obj 传入的 WebView.WebViewTransport 传递给 PopUpActivity,以便他可以构建 webview 并处理消息。但是,我收到此错误,由该行引起
intent.putExtra("MESSAGE", resultMsg)
:
Can't marshal non-Parcelable objects across processes.
即使 resultMsg 是实现 Parcelable 的消息 class ?
我在这里错过了什么?
根据你的代码,你使用intent.getExtras()
来获取值。而intent.getExtras()
的return是Bundle
,所以你应该使用Bundle
传输数据。
改变
Intent intent = new Intent(mActivty, PopUpActivity.class);
intent.putExtra("MESSAGE", resultMsg);
mActivity.startActivity(intent);
至
Intent intent = new Intent(mActivty, PopUpActivity.class);
Bundle bundle = new Bundle();
bundle.putParcelable("MESSAGE", resultMsg);
intent.putExtras(bundle);
mActivity.startActivity(intent);
另一种方式
你用intent.putExtra
转Message
,Message
是Parcelable
,所以你可以用intent.getParcelableExtra
取值。
改变
Intent intent = getIntent();
if (intent.getExtras() != null) {
Message resultMsg = intent.getExtras().getParcelable("MESSAGE");
WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
transport.setWebView(mWebView);
resultMsg.sendToTarget();
至
Intent intent = getIntent();
Message resultMsg = intent.getParcelableExtra("MESSAGE")
WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
transport.setWebView(mWebView);
resultMsg.sendToTarget();
备注
如果使用Bundle
传输数据,则必须使用Bundle
获取数据并进行处理。
如果使用普通的putExtra
方法传输数据,可以使用对应的get方法获取数据。
这是我的 WebChromeClient
我的默认 activity:
@Override
public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
Intent intent = new Intent(mActivty, PopUpActivity.class);
intent.putExtra("MESSAGE", resultMsg);
mActivity.startActivity(intent);
return true;
这就是我在 PopUpActivity
中的处理方式:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_webpage);
getWindow().setBackgroundDrawable(null);
mCloseButton = (ImageButton) findViewById(R.id.close_button);
// we don't care about getting a warmed webview in this case, just create a new one
mWebView = WebViewConstructor.constructWebView(this);
mWebViewContainer = (RelativeLayout) findViewById(R.id.webview_container);
// add the webview to the container layout
WebViewManager.attachWebViewToParentContainer(mWebView, mWebViewContainer);
Intent intent = getIntent();
if (intent.getExtras() != null) {
Message resultMsg = intent.getExtras().getParcelable("MESSAGE");
WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
transport.setWebView(mWebView);
resultMsg.sendToTarget();
}
基本上,我想将作为 resultMsg.obj 传入的 WebView.WebViewTransport 传递给 PopUpActivity,以便他可以构建 webview 并处理消息。但是,我收到此错误,由该行引起
intent.putExtra("MESSAGE", resultMsg)
:
Can't marshal non-Parcelable objects across processes.
即使 resultMsg 是实现 Parcelable 的消息 class ?
我在这里错过了什么?
根据你的代码,你使用intent.getExtras()
来获取值。而intent.getExtras()
的return是Bundle
,所以你应该使用Bundle
传输数据。
改变
Intent intent = new Intent(mActivty, PopUpActivity.class);
intent.putExtra("MESSAGE", resultMsg);
mActivity.startActivity(intent);
至
Intent intent = new Intent(mActivty, PopUpActivity.class);
Bundle bundle = new Bundle();
bundle.putParcelable("MESSAGE", resultMsg);
intent.putExtras(bundle);
mActivity.startActivity(intent);
另一种方式
你用intent.putExtra
转Message
,Message
是Parcelable
,所以你可以用intent.getParcelableExtra
取值。
改变
Intent intent = getIntent();
if (intent.getExtras() != null) {
Message resultMsg = intent.getExtras().getParcelable("MESSAGE");
WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
transport.setWebView(mWebView);
resultMsg.sendToTarget();
至
Intent intent = getIntent();
Message resultMsg = intent.getParcelableExtra("MESSAGE")
WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
transport.setWebView(mWebView);
resultMsg.sendToTarget();
备注
如果使用
Bundle
传输数据,则必须使用Bundle
获取数据并进行处理。如果使用普通的
putExtra
方法传输数据,可以使用对应的get方法获取数据。