我是一名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?
答案 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调用第一个方法。这将接受上下文,对于我们的情况,它是this
或FireBaseWatchMessages.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
的意图。