[英]Android Java access WebView in MainActivity from other class
我有public class MyFirebaseInstanceIdService
,可在应用程序在后台处理public class MyFirebaseInstanceIdService
通知。
public class MyFirebaseInstanceIdService extends FirebaseInstanceIdService {
@Override
public void onTokenRefresh() {
MainActivity.sendRegToken();
}
}
主要活动
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
WebView webView = (WebView) findViewById(R.id.webView);
public void sendRegToken() {
String recent_token = FirebaseInstanceId.getInstance().getToken();
webView.loadUrl("javascript:sendRegToken('"+recent_token+"');");
}
}
我需要访问webView
因此可以调用loadUrl
。 sendRegToken()
是一种非静态方法,我正在尝试从静态上下文访问它。 我不能使sendRegToken()
静态,因为它包含非静态的webView
。 我该如何解决这个问题?
使用类LocalBroadcastManager示例可以在这里找到: LocalBroadcastManager示例 1.在MainActivity上注册广播。 2.使用onTokenRefesh()
发送中需要的参数从onTokenRefesh()
发送广播。
请不要这样做。
如果您有用于此通信的API,请仅使用常规的Http请求,如果没有API,请参阅此
顺便说一下,Greenrobot / EventBus比LocalBroadCastManager更好,更简单。
免责声明:尚未尝试,但从理论上讲应该可以...
使用观察者模式。
public class MyFirebaseInstanceIdService extends FirebaseInstanceIdService {
List<TokenRefreshListener> tokenListeners = new ArrayList<>();
public void addTokenListener(TokenRefreshListener listener) {
tokenListeners.add(listener);
}
// Should also add a remove method
@Override
public void onTokenRefresh() {
String token = getToken();
for (TokenRefreshListener l:tokenListeners) {
l.onTokenRefresh(token);
}
}
}
并定义该接口
public interface TokenRefreshListener {
void onTokenRefresh(String token);
}
在“活动”中,您需要实现该接口
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener,
TokenRefreshListener {
WebView webView = (WebView) findViewById(R.id.webView);
// need to call addTokenListener of the service
//... Probably do that in onStart method
@Override
public void onTokenRefresh(String token) {
webView.loadUrl("javascript:sendRegToken('"+token+"');");
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.