3

みなさん、私は 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"));
4

3 に答える 3

9

これは、プッシュ通知の送信者が実際に制御できます。現在のドキュメントに従って:

通知: GCM は、クライアント アプリに代わってエンド ユーザー デバイスにメッセージを自動的に表示します。通知には、事前に定義されたユーザーに表示されるキーのセットがあります。通知ペイロードを設定します。オプションのデータ ペイロードがある場合があります。常に折りたたみ可能。

データ: クライアント アプリは、データ メッセージの処理を担当します。データ メッセージには、カスタム キーと値のペアのみが含まれます。データ ペイロードのみを設定します。折りたたみ可能または折りたたみ不可のいずれかです。

アプリがバックグラウンドにあるときに通知の自動表示を無効にするには、送信者がペイロードの「通知」部分を送信せず、ペイロードの「データ」部分ですべてを送信するようにします。そうすれば、アプリ コードは常に着信メッセージを処理します。次に、通知を表示するかどうかを選択できます。

于 2016-06-22T11:28:03.963 に答える
-1

システム トレイの通知を無効にします。メッセージの構造を変更しました。

サーバー側で通知を送信するためにPythonを使用しました。だから私はdata_messageによってmessage_bodyを変更しました(これはpythonの辞書です)、それは私が変更したすべてです、それはうまくいきます!!

于 2016-11-16T20:56:21.330 に答える