Android Java在其他类的MainActivity中访问WebView

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这样我就可以叫loadUrlsendRegToken()是一种非静态方法,我试图从静态上下文中访问它。我无法将sendRegToken()设为静态,因为它包含非静态webView。我如何解决这个问题?

+1

你真的需要一个'WebView'送令牌?一个'WebView'主要是一块用户界面,绑定到一个'Activity'。即使有方法可以将它用作非UI元素,也可能不是最好的方法,并且可能实现将代码作为本机发送的代码将是更好的解决方案。 –

使用类LocalBroadcastManager 例子可以在这里找到:对在MainActivity LocalBroadcastManager Example 1.注册广播。 2.从onTokenRefesh()发送广播,您需要在意图发送时使用参数。

+0

即使这解决了通信问题('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+"');"); 
    } 
}