大家好,我正在开发一个使用Firebase云消息传递的应用程序。但我有这样的情况,我不希望用户看到何时收到带有数据消息的通知。我已经通过从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"));
答案 0 :(得分:4)
这实际上可以由推送通知的发件人控制。根据{{3}}:
通知: GCM会代表客户端应用自动向最终用户设备显示消息。通知已预先定义 一组用户可见的键。设置通知负载。可以选择 数据负载。总是可折叠的。
数据: 客户端应用负责处理数据消息。数据消息只有自定义键/值对。仅设置数据有效负载。能够 要么是可折叠的,要么是不可折叠的。
要在应用处于后台时禁用通知的自动显示,请使发件人不发送"通知"有效载荷的一部分并将所有内容发送到"数据"有效载荷的一部分。这样,应用程序代码将始终处理传入的消息。然后它可以选择是否显示通知。
答案 1 :(得分:0)
我在系统托盘中禁用了通知。我改变了信息的结构。
我使用python在服务器端发送通知。所以我通过data_message(它是python中的dictonary)更改了message_body,这就是我改变的一切,它工作得很好!!
答案 2 :(得分:0)
您可以通过覆盖 handleIntent 方法并在FirebaseMessagingService中注释/删除super.handleIntent(intent)来实现此目的;
如果应用程序处于后台并且有效负载中存在通知标记,则基本上会调用该文件。
扩展 FirebaseMessagingService 类,您将拥有
tc
一旦到此,你可以自定义你自己的NoificationManager
此方法只能在fcm 11.0.6之前覆盖