2017-09-23 12 views
0

私はウェブ開発者であり、基本的にはユーザーを特定のページにリダイレクトするためのプッシュリクエストによって指示を受け取ることができるWebviewであるアプリケーションを開発しようとしています。すでに機能していますが、問題を修正するだけです:Backgound Firebaseプッシュ通知のデータ処理

Webviewの内容を更新するプッシュ情報を受け取って処理するクラスで関数を作成しようとしました。しかし、いくつかの矛盾があり、それは不可能です。なぜなら、1つのクラスは静的であり、もう1つは継承のためではないからです。

通知のクリック時に、プッシュリクエスト内の特定のフィールドで送信された値を受け取る「EMPTY」値で開始される「ウォッチメッセージクラス」内に文字列変数を作成していました。私のMainActivityで

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

WebViewの内容を変更する機能があります:FirebaseMessagingServiceを拡張し、私のパブリッククラスFireBaseWatchMessagesがあります。それは次のように機能します。

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

アプリケーションが開いたときにWebViewのは、その値ではなく、デフォルトのURLに応じて変更されたURLを開く場合、この変数は、「EMPTY」以外の値を持っているのであれば、それはチェックします。

プッシュによって送信されたメッセージをクリックしてアプリケーションを閉じると、URLが適切な変更で開かれず、変数が実際にプッシュによって送信された値を受信して​​いないように見えます。

アプリデバッガを使用すると、開いていないときにログコマンドがコンソールに表示されないことがわかりました。これは、アプリケーションが閉じられたときにその関数が実際には実行されないと考えています。

どのように私はこの動作を修正できますか?通知をクリックするアクションを実行して、パラメータをWebviewに送信するにはどうすればよいですか?

+0

通知のクリックを処理しましたか?インテントの使用? – Xenolion

+0

質問を明確にしてください!より多くのコードを表示しますか? – Xenolion

答えて

0

あなたのアプローチが珍しいと言いたいのですが、サービスが(ユーザーやデバイスによって)強制終了/停止される可能性があり、データが失われたり、デバイスがオンになったりするので、データを失うことになります。そのため、変数を使用する代わりに、共有環境設定を使用する2つの方法を簡単に作成できました。アプリが使用されていなくても、ストレージはデバイス内に永久保存されます。 HERE

方法: 第1の方法は次のとおりです。

​​

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

は、URLを取得するにはMainActivityでこれを定義して、それを取る後に戻っても、「EMPTY」にURLを設定します!

最初のメソッドは、サービスFireBaseWatchMessagesから呼び出されます。これは、私たちのケースではthisまたはFireBaseWatchMessages.thisであり、URLの文字列形式を受け入れますので、URLをStringに変更します。それをurlとしてアプリの内部ストレージに保存します。

だから呼び出す:

addNewUrl(this,your_url_string); 

を第2の方法は、あなたはそれが仕事をしたいMainActivityまたは任意の活動に呼び出されます。したがって、MainActivityに定義してください。それが何かを見つけることができない場合は、ストレージに格納されているURLがあるかどうかチェックしますString "EMPTY"それを見つけると、それは現在のURLとしてそれを返し、すでに1つを持っています。だからちょうど呼び出し:

String url= getUrlAndSetEmpty(this); 

返されるURLは本当にURL STRINGまたは単に文字列 "EMPTY"にすることができます返されます。ロジックを処理します。

これはあなたのケースに最適なアプローチです!それはいつでも動作します!アプリがフォアグラウンドで表示されているかどうかには依存しません。

アクティビティ作成時にインテントを正しく処理したかどうかを確認してください。

でも、JavaではObject(Stringが含まれています)を比較すると(=)の代わりに(Object1.equals(Object2))を使用します。だからと呼ばれる行を変更:へ

 if(FireBaseWatchMessages.NEW_URL_FROM_ACTION != "EMPTY") 

変更:

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

は、条件にあっ!記号を忘れないでください!

それが動作しない場合は、Activityの起動に使用したインテントを確認してください。

+0

だから、私は物事を明確にしよう:文字列のチェックとURLの変更はOKです(まだチップのおかげで)。問題は、アプリケーションが終了した場合、変数(NEW_URL_FROM_ACTION)は、Firebaseで送信しているパラメータの値を取得せず、アプリケーションが通知のクリックアクションで開かれても発生しません。 –

+0

私は答えを更新しましたトップ部分を読む! – Xenolion

関連する問題