【问题标题】:Android Java access WebView in MainActivity from other classAndroid Java 从其他类访问 MainActivity 中的 WebView
【发布时间】:2017-08-15 15:21:07
【问题描述】:

我有public class MyFirebaseInstanceIdService 在应用程序处于后台时处理 Firebase 通知。

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。我该如何解决这个问题?

【问题讨论】:

  • 您真的需要WebView 来发送令牌吗? WebView 主要是一段 UI,绑定到 Activity。即使有办法将其用作非 UI 元素,也可能不是最好的方法,并且可能实现代码以将令牌作为本机发送将是更好的解决方案。

标签: java android firebase firebase-notifications


【解决方案1】:

使用类LocalBroadcastManager 示例可以在这里找到:LocalBroadcastManager Example 1.在MainActivity上注册广播。 2.从onTokenRefesh()发送广播,并在Intent发送中包含您需要的参数。

【讨论】:

  • 即使这解决了沟通问题 (Service -> Activity),正如我在评论中所说的,这可能不是最好的方法。
【解决方案2】:

请不要那样做。

如果您有此通信的 API,只需使用普通的 Http 请求,如果您没有 API,请参阅this

顺便说一句,Greenrobot/EventBus 比 LocalBroadCastManager 更好更简单。

【讨论】:

    【解决方案3】:

    免责声明:没有尝试过,但理论上它应该可以工作......

    使用观察者模式。

    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);
    } 
    

    而在Activity中,你需要实现那个接口

    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+"');");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多