首页 > 解决方案 > 在 Firestore 更新上启动功能

问题描述

这个问题就像标题所暗示的那样简单。

多解释一点,我是 android 编程的初学者,每次更新我的 firestore 时,我都需要我的应用程序运行某个功能。

protected void onStart(){
    super.onStart();
    mDocRef.addSnapshotListener(new EventListener<DocumentSnapshot>() {
        @Override
        public void onEvent(DocumentSnapshot documentSnapshot, FirebaseFirestoreException e) {
                Map<String,Object> SMSFlag = new HashMap<String, Object>();
                String quotenum = documentSnapshot.getString(NUM_KEY);
                String quotemsg = documentSnapshot.getString(SMS_KEY);

                state = documentSnapshot.getString(STATE_KEY);
                if (state.equals("tosend")) {
                    try {
                        SmsManager smsManager = SmsManager.getDefault();
                        smsManager.sendTextMessage(quotenum, null, quotemsg, null, null);
                        Toast.makeText(MainActivity.this, "SMS Sent!", Toast.LENGTH_LONG).show();
                    } catch (Exception e1) {
                        Toast.makeText(MainActivity.this, "Error sending SMS: " + e, Toast.LENGTH_LONG).show();
                    }
                    SMSFlag.put(STATE_KEY, "sent");
                    mDocRef.set(SMSFlag);
                    state = documentSnapshot.getString(STATE_KEY);
                }
        }
    });
}

这应该发送一条消息。正如您在代码中看到的那样,我使用了状态键,这是因为它发送了 3 条有时 4 条相同的消息。在实现状态后,它只发送一个(如预期的那样),有时发送两个。

我想知道是否有可以替换 onStart() 的android方法,因为我认为问题在于方法本身。

我希望我已经很好地解释了自己。预先感谢任何愿意提供帮助的人

标签: androidfirebasegoogle-cloud-firestore

解决方案


根据您提到的内容,我建议您将代码放入onCreate生命周期回调方法中:

protected void onCreate(){
    super.onCreate();
    mDocRef.addSnapshotListener(new EventListener<DocumentSnapshot>() {
        @Override
        public void onEvent(DocumentSnapshot documentSnapshot, FirebaseFirestoreException e) {
                Map<String,Object> SMSFlag = new HashMap<String, Object>();
                String quotenum = documentSnapshot.getString(NUM_KEY);
                String quotemsg = documentSnapshot.getString(SMS_KEY);

                state = documentSnapshot.getString(STATE_KEY);
                if (state.equals("tosend")) {
                    try {
                        SmsManager smsManager = SmsManager.getDefault();
                        smsManager.sendTextMessage(quotenum, null, quotemsg, null, null);
                        Toast.makeText(MainActivity.this, "SMS Sent!", Toast.LENGTH_LONG).show();
                    } catch (Exception e1) {
                        Toast.makeText(MainActivity.this, "Error sending SMS: " + e, Toast.LENGTH_LONG).show();
                    }
                    SMSFlag.put(STATE_KEY, "sent");
                    mDocRef.set(SMSFlag);
                    state = documentSnapshot.getString(STATE_KEY);
                }
        }
    });
}

如果您查看有关生命周期的文档,您会发现 onStart 在您的活动生命周期内可能会被多次调用,这会将多个侦听器附加到mDocRef引用。这可能是您接到多个电话的原因。


推荐阅读