0

Hy каждый, я разрабатываю приложение, где я использую Firebase Cloud Messaging. Но у меня есть ситуация, когда я не хочу, чтобы пользователь видел, когда получено уведомление с сообщениями данных. Я решил, что с удалением функции sendNotification из myFirebaseMessagingService, но это работает только тогда, когда мое приложение находится на переднем плане. Мой вопрос: когда приложение находится в фоновом режиме, и уведомление появляется в системном трее, как установить код, чтобы значок уведомления не отображался?Как отключить показ уведомления, когда дело доходит до системного трея?

Вот мой MainActivity:

public class MainActivity extends AppCompatActivity { 
Button dugme, dugme2, dugmeBaza, dugmeToken; 
DataBaseHelper db; 
Cursor c; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Log.d("onCreate", "ONCREATE"); 
    db=new DataBaseHelper(this); 
    final Intent intent=getIntent(); 
    setContentView(R.layout.activity_main); 
    String msg = getIntent().getStringExtra("click_action"); 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 

    if (msg != null) 
    { 
     Log.d("MSG", msg); 
     if (msg.equals("goToFragment1")) { 
      Fragment1 fragment1 = new Fragment1(); 
      fragmentTransaction.replace(R.id.myFragment, fragment1); 
      Log.d("FragmentTransaction", "Fragment je promenjen u onCreate!"); 
      fragmentTransaction.commit(); 
      Log.d("Create", "Kraj onCreatea"); 

     } 
    } 

    dugme = (Button) findViewById(R.id.dugme1); 
    dugme2 = (Button) findViewById(R.id.subscribe); 
    dugme.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Fragment fragment = null; 
      if (view == dugme) { 
       fragment = new Fragment1(); 
      } 
      FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
      transaction.replace(R.id.myFragment, fragment); 
      transaction.addToBackStack(null); 
      transaction.setTransition(FragmentTransaction.TRANSIT_NONE); 
      transaction.commit(); 
     } 
    }); 


    dugme2.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      FirebaseMessaging.getInstance().subscribeToTopic("android"); 
      Log.d("Log", "Uspesno ste se pretplatili"); 
     } 
    }); 
    dugmeBaza=(Button)findViewById(R.id.dugmeZabazu); 
    viewAll(); 
    dugmeToken=(Button)findViewById(R.id.TokenButton); 
    dugmeToken.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      String refreshedToken = FirebaseInstanceId.getInstance().getToken(); 
      Log.d("TOKEN", "Refreshed token: " + refreshedToken); 
     } 
    }); 


@Override 
protected void onPause() { 
    super.onPause(); // Always call the superclass method first 

    Log.d("onPause", "Pauza"); 
} 
public void viewAll(){ 

    dugmeBaza.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Cursor res= db.getAlldata(); 
      if(res.getCount()==0) { 
       //show message 
       showMessage("Error", "Nothing found"); 


       return; 

      } 
      StringBuffer buffer=new StringBuffer(); 
      while (res.moveToNext()){ 
       buffer.append("Id: " + res.getString(0) + "\n"); 
       buffer.append("poruka: " + res.getString(1)); 

      } 
      showMessage("Data", buffer.toString()); 
     } 
    }); 
} 
public void showMessage(String title, String message){ 
    AlertDialog.Builder builder=new AlertDialog.Builder(this); 
    builder.setCancelable(true); 
    builder.setTitle(title); 
    builder.setMessage(message); 
    builder.show(); 
} 
public void Ubaci(){ 
    String msg=getIntent().getStringExtra("poruka"); 
    db.insertMsg(msg); 
} 

А вот myFirebaseMessagingService:

public class myFirebaseMessagingService extends FirebaseMessagingService { 

private static final String TAG="MyFirebaseMsgService"; 
@Override 
public void onMessageReceived(RemoteMessage remoteMessage) { 
    super.onMessageReceived(remoteMessage); 
    Log.d("onMessageReceived", "Pozvana funkcija onMessageReceived"); 
    Log.d(TAG, "From " + remoteMessage.getFrom()); 
    Log.d(TAG, "Body " + remoteMessage.getNotification().getBody()); 
    Log.d(TAG, "Location " + remoteMessage.getNotification().getClickAction()); 
    Log.d(TAG, "Value " + remoteMessage.getData().get("click_action")); 

ответ

3

Это фактически контролируемый отправителем нажимной уведомления. Согласно current documentation:

Извещение:GCM автоматически отображает сообщение для конечных пользовательских устройств от имени приложения клиента. Уведомления содержат предопределенные набор видимых пользователем клавиш. Установите полезную нагрузку уведомления. Может иметь дополнительную полезную нагрузку . Всегда разборный.

Данные:Клиентское приложение отвечает за обработку сообщений данных. Данные сообщений имеют только настраиваемые пары ключ/значение. Установите только полезную нагрузку данных. Может быть разборным или нескладным.

Чтобы отключить автоматическое отображение уведомлений, когда приложение находится в фоновом режиме, сделать отправитель не отправлять «уведомление» часть полезной нагрузки и отправить все в «данных» часть полезной нагрузки. Таким образом, код приложения всегда будет обрабатывать входящее сообщение. Затем он может выбрать для отображения уведомление об этом или нет.

+0

Итак, если я правильно понял, отправитель (в моем случае сервер приложений) решает, будет ли отображаться значок уведомления, а не я на Android (моя задача - обеспечить соединение для FCM на устройстве Android)? – Atenica

+0

Так оно и есть. Это дополнительная функция, предоставляемая серверу отправителя. Вы можете заставить сервер отправлять только «данные», тогда вы можете решить в приложении, показывать ли уведомление или нет. –

+0

Хорошо, но как я мог решить в приложении, если я хочу показать уведомление, если сервер отправляет только данные? – Atenica

0

Отключить уведомление в системном трее. Я изменил структуру сообщения.

Я использовал python для отправки уведомлений на стороне сервера. Таким образом, я изменил message_body на data_message (это объяснение в python), это все, что я изменил, это нормально!

+1

не могли бы вы подробно объяснить, как я могу архивировать это? –

+0

Пожалуйста, добавьте примерный код – kilokahn

0

Вы можете добиться этого, переопределив handleIntent метод и комментируя/удаляя super.handleIntent (намерение) в FirebaseMessagingService;

Что в основном будет вызываться, если приложение находится в фоновом режиме и уведомление тег присутствует в полезной нагрузке.

+0

Можете ли вы поделиться некоторым примером кода, чтобы помочь мне лучше понять? – kilokahn