【问题标题】:Send recieving messages to email when app is not active当应用程序不活动时将接收消息发送到电子邮件
【发布时间】:2019-10-28 10:20:59
【问题描述】:

在我的项目中,我想将所有接收消息发送到email address。当app 打开时,我成功地做到了。但是当app 关闭时,我无法发送mail。 如何检测app 关闭时收到的消息。 我使用工作人员发送电子邮件。 另外,我想获取消息数据给工人类发送电子邮件。

工人阶级

public class MessageSenderWorker extends Worker {
    @NonNull
    @Override
    public Result doWork() {
        try {
           new Thread(new Runnable() {
                @Override
                public void run() {
                    GMailSender sender = new GMailSender("emailaddredd",
                            "password");
                    try {
                        sender.sendMail("datafrom mesaage", "datafrom mesaage",
                                "emailaddress", "emailaddress");
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }).start();

            return Result.SUCCESS;

        } catch (Exception e) {
            return Result.FAILURE;
        }

    }
}

我的广播接收器

public class MessageReceiver extends BroadcastReceiver {

private static MessageListener mListener;

@Override
public void onReceive(Context context, Intent intent) {

    Bundle data = intent.getExtras();
    Object[] pdus = (Object[]) data.get("pdus");
    for(int i=0; i<pdus.length; i++){
        SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdus[i]);
        String message = "Sender : " + smsMessage.getDisplayOriginatingAddress()
                + "Email From: " + smsMessage.getEmailFrom()
                + "Emal Body: " + smsMessage.getEmailBody()
                + "Display message body: " + smsMessage.getDisplayMessageBody()
                + "Time in millisecond: " + smsMessage.getTimestampMillis()
                + "Message: " + smsMessage.getMessageBody();
        mListener.messageReceived(message);

        NotificationWorker notificationWorker = new NotificationWorker();
        PeriodicWorkRequest.Builder dataCheckBuilder = new PeriodicWorkRequest.Builder(notificationWorker.getClass(), 1, TimeUnit.MINUTES).setConstraints(networkConstraints());
        PeriodicWorkRequest dataCheckWork = dataCheckBuilder.build();
        WorkManager.getInstance().enqueue(dataCheckWork);

    }
}

【问题讨论】:

  • "App is closed" - 有两种不同的任务:激活手机和休眠手机(需要唤醒手机等)。
  • @Style-7 我所说的“APP已关闭”是指,每当收到手机的消息。 (如果应用程序正在后台运行,从最近的应用程序中删除并且手机屏幕处于打开/关闭状态)

标签: android broadcastreceiver android-workmanager


【解决方案1】:

如果用户关闭屏幕,那么您必须在 30 分钟内仅使用 AlarmManager(根据我的实践)不超过 1 次。例如,您可以使用自定义广播接收器并由 AlarmManager 调用它。自定义广播接收器设置新警报等。您还必须创建引导广播接收器才能启动警报。

【讨论】:

  • 我已经在用Worker了,不用AlarmManager了吧?
  • 不,工人不能“唤醒设备”。
【解决方案2】:

要“唤醒”设备,由于打盹模式和应用程序待机,唯一可靠(且对电池友好)是使用高优先级 Firebase 云消息 (FCM)。

然后,您的应用可以处理此消息以检索您发送的电子邮件。一个选项是,当您收到 FCM 时,您将一个工作人员排入队列,然后该工作人员将下载消息/电子邮件。

其他一切都会受到 Android 中的打盹模式和其他电池优化系统的影响。此外,对于这些情况,使用 FCM 是对电池最友好的解决方案。

【讨论】:

    【解决方案3】:

    Workers 已经在后台线程上运行 - 您不应该在其中创建自己的线程。它们也用于同步工作 - 这意味着当您返回结果时,您的工作应该已经完成​​。取出所有“新线程”代码,将线程的内容直接放入Worker中。您还需要阅读以下内容:https://developer.android.com/topic/libraries/architecture/workmanager/advanced/threading

    【讨论】:

      猜你喜欢
      • 2017-12-05
      • 1970-01-01
      • 2013-04-13
      • 2019-09-21
      • 2020-01-04
      • 1970-01-01
      • 2020-11-27
      • 2018-11-27
      • 1970-01-01
      相关资源
      最近更新 更多