0

管理者がメッセージを投稿するとすぐに通知を送信したいと考えました。メッセージがAndroidに投稿されたときに通知をユーザーに送信する方法

私が現在直面している:

  • 私はアプリを開くたびに、通知音は全く新しいメッセージがないにもかかわらず到着する(コードはonCreate()方法で書かれているので、それはありますか?)
  • 通知をクリックすると、MainActivityに正しくリダイレ​​クトされ、通知音が再び表示されます。迷惑なのは、その種:(

私はaddChildEventListenerに通知コードを書きました。誰もが、上記のものを固定で私を導くことができる。私の次のコードを確認してください。

コードを私のアプリのMainActivityため。

public class MainActivity extends AppCompatActivity { 

    ... 

    // [Start of onCreate Method] 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     ... 

     // NOTIFICATIONS 
     mBuilder = 
       (NotificationCompat.Builder) new NotificationCompat.Builder(MainActivity.this) 
         .setSmallIcon(R.drawable.bcm_logo) 
         .setContentTitle("BCM") 
         .setDefaults(Notification.DEFAULT_SOUND) 
         .setContentText("You have a new message") 
         .setAutoCancel(true); // clear notification when clicked 

     Intent intent = new Intent(this, MainActivity.class); 
     PendingIntent pi = PendingIntent.getActivity(this, 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK); 
     mBuilder.setContentIntent(pi); 

     messagesDatabaseReference.addChildEventListener(new ChildEventListener() { 
      @Override 
      public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
       Log.d(TAG, "Child ADDED !"); 

       Log.d(TAG, "D: " + dataSnapshot); 

        mNotifyMgr = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 
        mNotifyMgr.notify(mNotificationId, mBuilder.build()); 

      } 

      @Override 
      public void onChildChanged(DataSnapshot dataSnapshot, String s) { 
       Log.d(TAG, "Child Changed"); 
      } 

      @Override 
      public void onChildRemoved(DataSnapshot dataSnapshot) { 
       Log.d(TAG, "CHILD REMOVED!"); 
      } 

      @Override 
      public void onChildMoved(DataSnapshot dataSnapshot, String s) { 
       Log.d(TAG, "Child Moved"); 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 
       Log.d(TAG, "Child Cancelled"); 
      } 
     }); 
    } // [End of onCreate Method] 


    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

     if (requestCode == RC_SIGN_IN) { 
      if (resultCode == RESULT_OK) { 

       Log.d(TAG, "User Signed in"); 

      } else if (resultCode == RESULT_CANCELED) { 
       finish(); 
      } 

     } 
    } 

    ... 

    // WHAT IF SIGNED IN 
    private void onSignedInitialize(String userDisplayName) { 
     mUserName = userDisplayName; 
     Message.setSenderName(mUserName); 
     attachDatabaseReadListener(); 
    } 

    // ATTACH AND DETACH THE DATABASE READ LISTENERS 
    private void attachDatabaseReadListener() { 
     if (childEventListener == null) { 
      childEventListener = new ChildEventListener() { 
       @Override 
       public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
        Message message = dataSnapshot.getValue(Message.class); 
        mMessageAdapter.add(message); 
       } 

       public void onChildChanged(DataSnapshot dataSnapshot, String s) { 

       } 

       public void onChildRemoved(DataSnapshot dataSnapshot) { 
       } 

       public void onChildMoved(DataSnapshot dataSnapshot, String s) { 
       } 

       public void onCancelled(DatabaseError databaseError) { 
       } 
      }; 
      messagesDatabaseReference.addChildEventListener(childEventListener); 
     } 
    } 
    ... 
} // [END of Main Activity] 

答えて

0

ここで問題となるのは、リスナーをDatabaseReferenceにアタッチするとすぐに、データベースからのすべてのメッセージとともにonChildAdded()が呼び出されるということです。データベースからのDatastreamの開始または終了がないため、どのような場合にメッセージは「新規」で、通知をいつ表示するか。

1.使用ValueEventListener:

databaseReference.addValueEventListener(new ValueEventListener() { 

      Boolean showNotification = false; 

      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 

       if(showNotification) { 
        mNotifyMgr = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 
        mNotifyMgr.notify(mNotificationId, mBuilder.build()); 
       } 
       //use your Data here 
       showNotification = true; 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 

この方法の欠点は、あなたがメッセージの全リストを取得することで、毎回新しいメッセージがある2つの解決策があります。

2.データ構造にタイムスタンプを使用してください。 メッセージ内に作成のタイムスタンプを保存します。

messagesDatabaseReference.addChildEventListener(
new ChildEventListener() { 

    //set to the time when the listener is created 
    private long attachTime = System.currentTimeMillis(); 

    @Override 
    public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
     Log.d(TAG, "Child ADDED !"); 
     Message message = dataSnapshot.getValue(Message.class); 
     //if the message is newer then then the creation of the ChildEventListener -> show notification 
     if(message.getCreationTime > attachTime) { 
      mNotifyMgr = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 
      mNotifyMgr.notify(mNotificationId, mBuilder.build()); 
      attachTime = message.getCreationTime; 
     } 
     //use your Data here 
    } 

    @Override 
    public void onChildChanged(DataSnapshot dataSnapshot, String s) { 
     Log.d(TAG, "Child Changed"); 
    } 

    @Override 
    public void onChildRemoved(DataSnapshot dataSnapshot) { 
     Log.d(TAG, "CHILD REMOVED!"); 
    } 

    @Override 
    public void onChildMoved(DataSnapshot dataSnapshot, String s) { 
     Log.d(TAG, "Child Moved"); 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     Log.d(TAG, "Child Cancelled"); 
    } 
}); 

全例: はその後あなたがこのように既存のChildEventListenerを拡張することができます悲しいこと

public class MainActivity extends AppCompatActivity { 

    public static final String TAG = "MessagesActivity"; 
    private static final int mNotificationId = 1; 
    private DatabaseReference messagesDatabaseReference; 
    private ChildEventListener childEventListener; 
    private NotificationCompat.Builder mBuilder; 
    private NotificationManager mNotifyMgr; 

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

     mBuilder = (NotificationCompat.Builder) new NotificationCompat.Builder(this) 
         .setSmallIcon(R.drawable.bcm_logo) 
         .setContentTitle("BCM") 
         .setDefaults(Notification.DEFAULT_SOUND) 
         .setContentText("You have a new message") 
         .setAutoCancel(true); // clear notification when clicked 

     Intent intent = new Intent(this, MainActivity.class); 
     PendingIntent pi = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
     mBuilder.setContentIntent(pi); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     messagesDatabaseReference = FirebaseDatabase.getInstance().getReference(); 
     attachDatabaseReadListener(); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     detachDatabaseReadListener(); 
    } 

    private void attachDatabaseReadListener() { 
     if (childEventListener == null) { 
      childEventListener = new ChildEventListener() { 
       @Override 
       public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
        Log.d(TAG, "Child ADDED !"); 
        Message message = dataSnapshot.getValue(Message.class); 
        //if the message is newer then then the creation of the ChildEventListener -> show notification 
        if(message.getCreationTime > attachTime) { 
         mNotifyMgr = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 
         mNotifyMgr.notify(mNotificationId, mBuilder.build()); 

        } 
        mMessageAdapter.add(message); 
       } 

       public void onChildChanged(DataSnapshot dataSnapshot, String s) { 

       } 

       public void onChildRemoved(DataSnapshot dataSnapshot) { 
       } 

       public void onChildMoved(DataSnapshot dataSnapshot, String s) { 
       } 

       public void onCancelled(DatabaseError databaseError) { 
       } 
      }; 
      messagesDatabaseReference.addChildEventListener(childEventListener); 
     } 
    } 

    private void detachDatabaseReadListener() { 
     messagesDatabaseReference.removeEventListener(childEventListener); 
    } 
} 
+0

、それは(、第二の場合:(message.getCreationTimeをうまくいかなかった)であります私の** LogCat **: 'In Model TIME IN MS:1499297543427; MSでのアタッチ時間:1499297696644' – Chip

+0

それはうまくいかなかったのですが、何が起こっているのですか?あなたが参照しているデータ?この行について '//ここにあなたのデータを使用する ' – Chip

+0

もっとデータを提供できるなら何が機能していないのかについての情報があります。たとえば、コメントをあなたのコードに置き換えることができます: 'mMessageAdapter.add(message);' – arnoduebel

関連する問題