Android Java在其他类的MainActivity中访问WebView
我有public class MyFirebaseInstanceIdService
在应用程序处于后台时处理Firebase通知。Android Java在其他类的MainActivity中访问WebView
public class MyFirebaseInstanceIdService extends FirebaseInstanceIdService {
@Override
public void onTokenRefresh() {
MainActivity.sendRegToken();
}
}
MainActivity
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 例子可以在这里找到:对在MainActivity LocalBroadcastManager Example 1.注册广播。 2.从onTokenRefesh()
发送广播,您需要在意图发送时使用参数。
即使这解决了通信问题('Service' - >'Activity'),正如我在我的评论中所说的,可能不是最好的方法。 –
请不要这样做。
如果您有此通信的API,只要使用普通的HTTP请求,如果你没有一个API看到this
顺便说一句,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+"');");
}
}
你真的需要一个'WebView'送令牌?一个'WebView'主要是一块用户界面,绑定到一个'Activity'。即使有方法可以将它用作非UI元素,也可能不是最好的方法,并且可能实现将代码作为本机发送的代码将是更好的解决方案。 –