3

我有一个移动优化的网络应用程序,并想制作一个 Android 应用程序(一个简单的 WebView,它加载网络应用程序),以便发送 GCM 推送通知。

我的代码(没有不重要的行)。

public class MainActivity extends Activity {

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Webview 
        WebView webView = (WebView) findViewById(R.id.webView);
        webView.loadUrl("http://" + HOST + "?type=android&registrationId=" + REGISTRATIONID);       

        // GCM Registration                   
        GCMRegistrar.checkDevice(this);
        GCMRegistrar.checkManifest(this);
        final String regId = GCMRegistrar.getRegistrationId(this);
        if (regId.equals("")) {
          GCMRegistrar.register(this, "SENDERID");
          Log.i("TAG", "Registered! ");
        } else {
          Log.i("TAG", "Already registered");
        }
    }
}

比我实现(复制粘贴) GCMIntentService 类

public class GCMIntentService extends GCMBaseIntentService {

    public GCMIntentService() {
        super("SENDERID");
    }

    protected void onRegistered( Context arg0, String registrationId ) {
        Log.i( "TAG", "Registration id is: " + registrationId );
    }    

    protected void onError( Context arg0, String errorId ) {}
    protected void onMessage( Context arg0, Intent intent ) {}
    protected void onUnregistered( Context arg0, String registrationId ) {} 
}

到目前为止它工作正常。WebView加载正确的内容,调用onRegistered方法,将registrationId显示给LogCat。

不幸的是,我不知道如何从这里开始。我最终需要的是我们的 UserId(在 Native App 中不可用)和 registrationId 之间的关联。

对我来说,最好的解决方案是在每次 onRegistered 调用后重新加载 WebView,并将 registrationId 作为参数添加到 URL。但是由于我在此方法中没有对 MainActivity 的引用,所以我不知道如何重新加载 WebView。我需要用 BroadcastManager 做这些事情还是有其他方法?

4

1 回答 1

2

您可以分两步完成此操作,而无需重新加载 web 视图:

  1. 在 webview 活动中,您应该有一个名为的成员变量mWebView,它被分配给onCreate.

  2. 在 webview 活动中,动态注册一个基于类的 BroadcastReceiver,该类是您的 webview 活动的内部类。内部类将允许您访问mWebView上面#1 中定义的成员变量。

  3. 在服务中,用于sendBroadcast发送registrationId到 WebView 活动中的 BroadcastReceiver。

  4. 从 webview 活动中的 BroadcastReceiver,您可以将信息发送到 webview 而无需使用重新加载页面mWebView.loadUrl("javascript:myJavascriptRegistrationReceiver('<registrationId>')");

下面的链接解释sendBroadcast()BroadcastReceiver在应用程序组件之间传输信息: http ://www.cs.umd.edu/class/fall2011/cmsc436/CMSC436/Lectures_Labs_files/BroadcastReceivers.pdf

如果您喜欢冒险和/或想要最新的“热度”,那么您可以使用像 Square 的 Otto [1] 或 GreenRobot 的 EventBus [2] 这样的事件总线在您的服务和活动之间传递消息。这些是广播接收器的替代品,通常会减少样板代码的数量。

[1] https://github.com/square/otto

[2] https://github.com/greenrobot/EventBus

于 2013-02-15T22:36:06.010 回答