0

안녕하세요, 저는 Firebase Cloud Messaging을 사용중인 앱을 개발 중입니다. 그러나 나는 데이터 메시지가있는 알림을받을 때 사용자가보고 싶지 않은 상황이 있습니다. 나는 myFirebaseMessagingService에서 sendNotification 함수를 삭제하는 것으로 해결했지만 내 앱이 포 그라운드에있는 경우에만 작동합니다. 내 질문은 : 응용 프로그램이 백그라운드에서 알림을 시스템 트레이에 오면 알림 아이콘이 표시되지 않도록 코드를 설정하는 방법은 무엇입니까?시스템 트레이에서 알림 표시를 비활성화하는 방법은 무엇입니까?

여기 내 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

이 푸시 알림의 보낸 사람에 의해 실제로 제어 할 수 있습니다.

알림 :GCM가 자동으로 클라이언트 응용 프로그램을 대신하여 사용자 장치를 종료 할 수있는 메시지를 표시 current documentation에 따라. 알림에는 미리 정의 된 개의 사용자가 볼 수있는 키가 있습니다. 알림 페이로드를 설정합니다. 선택적 데이터 페이로드가있을 수 있습니다. 항상 접을 수 있습니다.

데이터 :클라이언트 응용 프로그램은 데이터 메시지 처리를 담당합니다. 데이터 메시지에는 사용자 지정 키/값 쌍만 있습니다. 데이터 페이로드 만 설정하십시오. 을 접을 수 있거나 접을 수 없게 할 수 있습니다. 응용 프로그램이 백그라운드에있을 때

은 보낸 사람이 페이로드의 "통지"부분을 보내 페이로드의 "데이터"부분에 모든 것을 보낼 수 있도록, 알림 자동 표시를 해제합니다. 그렇게하면 앱 코드가 항상 수신 메시지를 처리합니다. 그런 다음 알림을 표시할지 여부를 선택할 수 있습니다.

+0

올바르게 이해하면 발신자 (내 경우 앱 서버)가 안드로이드에서 나 아닌 알림 아이콘이 표시 될지 결정합니다. 내 작업은 안드로이드 장치에서 FCM 연결을 제공하는 것입니다. – Atenica

+0

그것이 지금 그것이 어떻게되었는지입니다. 발신자 서버에 제공하는 추가 기능입니다. 서버가 "데이터"만 보내면 알림을 표시할지 여부를 앱에서 결정할 수 있습니다. –

+0

그래도 서버에서 데이터 만 보내는 경우 알림을 표시하려면 앱에서 어떻게 결정할 수 있습니까? – Atenica

0

시스템 트레이에서 알림을 비활성화합니다. 나는 메시지의 구조를 바꿨다.

파이썬을 사용하여 서버 측에서 알림을 보냈습니다. 그래서 message_body를 data_message로 변경했습니다. (파이썬에서 dictonary입니다.) 그것은 내가 바꾼 것입니다.

+1

자세한 내용을 설명해주십시오. 어떻게 보관할 수 있습니까? –

+0

예제 코드를 추가하십시오. – kilokahn

0

handleIntent 메서드를 무시하고 FirebaseMessagingService에서 super.handleIntent (intent)를 주석 처리하거나 제거하면이 작업을 수행 할 수 있습니다.

앱이 백그라운드에 있고 알림 태그가 페이로드에있는 경우 기본적으로 호출됩니다.

+0

좀 더 잘 이해할 수 있도록 몇 가지 예제 코드를 알려주실 수 있습니까? – kilokahn