后台Firebase推送通知数据处理

时间:2017-09-23 20:03:14

标签: android firebase webview push

我是一名Web开发人员,我正在尝试开发一个基本上是Webview的应用程序,该应用程序可以通过推送请求接收指令,以将用户重定向到特定页面。它已经正常运行,我只需要纠正一个问题:

我尝试在接收和处理更新Webview内容的推送信息的类中创建一个函数。但是存在一些冲突并且不可能这样做,因为一个类是静态的而另一个类不是由于它们的继承。

我找到的方法是在我的"观看消息类"中创建一个字符串变量。以" EMPTY"开始接收推送请求中特定字段中发送的值的值' date'单击通知时。我的公共类FireBaseWatchMessages扩展了FirebaseMessagingService:

   public void onMessageReceived(RemoteMessage remoteMessage) {
        Log.d("LOG_ONRECEIVE_1", "From: " + remoteMessage.getFrom());
        if (remoteMessage.getData().size() > 0) {
            Log.d("LOG_VALID_DATA", "Message data payload: " + remoteMessage.getData());
        }
        if (remoteMessage.getNotification() != null) {
            Log.d("LOG_NULL_NOTIFICATION", "Message Notification Body: " + remoteMessage.getNotification().getBody());
        }
        Map<String, String> data = remoteMessage.getData();
        sendNotification(remoteMessage);
        if (data.containsKey("appReportedAction")) {
            Log.d("SET_ACTION", "/appReportedAction/" + data.get("appReportedAction"));
            NEW_URL_FROM_ACTION = MainActivity.SSLPROTOCOL + "://" + MainActivity.MAIN_URL +"/appReportedAction/" + data.get("appReportedAction");
        }
    }

在我的MainActivity中,有一项功能可以更改webview内容。它的工作原理如下:

public void changeViewContent(String actionView){
        setContentView(R.layout.activity_main);
        mWebView = (WebView) findViewById(R.id.activity_main_webview);
        WebSettings webSettings = mWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        if(FireBaseWatchMessages.NEW_URL_FROM_ACTION != "EMPTY"){
            mWebView.loadUrl(FireBaseWatchMessages.NEW_URL_FROM_ACTION);
        } else {
            mWebView.loadUrl( SSLPROTOCOL + "://" + MAIN_URL + actionView);
        }
        mWebView.setWebViewClient(new HelloWebViewClient());
    }

因此,当应用程序打开时,它会检查此变量是否具有&#34; EMPTY&#34;以外的值,如果是这样,Webview会根据其值而不是默认URL打开修改后的URL。

当应用程序关闭时,当点击推送发送的消息时,URL不会以适当的修改打开,就好像变量没有真正接收推送发送的值。

使用app调试器我注意到它的日志命令在未打开时没有出现在控制台上,这让我相信在应用程序关闭时该功能并没有真正运行。

知道如何纠正这种行为吗?如何单击通知的操作将参数发送到webview?

1 个答案:

答案 0 :(得分:0)

我想首先说你的方法并不常见,我不建议以这种方式存储网址,因为服务可以被杀死/停止(由用户或设备),因此你丢失数据或设备被关闭所以你丢失了你的数据。因此,我没有使用变量,而是使用共享首选项制作了两种方法,即使您的应用未被使用,存储也会永久存储在设备中!

以下: 第一种方法是:

    public boolean addNewUrl(Context context, String url) {
    SharedPreferences sharedPref = context.getSharedPreferences("SHARED URL", Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPref.edit();
    editor.putString("url", url);
    return editor.commit();
}

定义FireBaseWatchMessages中的第一个方法,它存储URL并在成功存储后返回true

第二个是:

    public String getUrlAndSetEmpty(Context context) {
    SharedPreferences sharedPref = context.getSharedPreferences("SHARED URL", Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPref.edit();
    String current_url = sharedPref.getString("url", "EMPTY");
    editor.putString("url", "EMPTY");
    editor.apply();
    return current_url;
}

MainActivity中定义此内容以获取返回的Url,并将网址设置为&#34; EMPTY&#34;拿它之后!

将从Service FireBaseWatchMessages调用第一个方法。这将接受上下文,对于我们的情况,它是thisFireBaseWatchMessages.this,它也会接受字符串形式的网址,因此将您的网址更改为String。然后,它会将其作为url存储在您的应用内部存储中!

所以请致电:

    addNewUrl(this,your_url_string);

第二种方法将在MainActivity或您希望其工作的任何活动中调用。所以在MainActivity中定义它。它做了什么检查存储中是否存有url如果找不到它返回String "EMPTY"并且如果找到它则返回它作为当前url并且还改变它的值存储的String为空,因为它已经有一个。所以请致电:

    String url= getUrlAndSetEmpty(this);

欢呼返回的网址可以是一个真正的URL STRING或者只是一个字符串&#34; EMPTY&#34;。处理逻辑。

这是您案例中最好的方法!它随时都可以使用!它不依赖于应用程序是否在前景中可见!

如果您在创建活动时正确处理了意图,请检查您的代码!

但是当我们比较对象(包括String)时,我们使用(Object1.equals(Object2))代替(=)符号。因此,更改您调用的行:

     if(FireBaseWatchMessages.NEW_URL_FROM_ACTION != "EMPTY")

更改为:

     if(!((FireBaseWatchMessages.NEW_URL_FROM_ACTION).equals("EMPTY")))

不要忘记条件中的!标志!

如果不起作用,请检查您用来启动Activity的意图。