首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当应用程序未激活时,将接收消息发送到电子邮件

当应用程序未激活时,将接收消息发送到电子邮件
EN

Stack Overflow用户
提问于 2019-10-28 10:20:59
回答 3查看 55关注 0票数 0

在我的项目中,我希望将所有接收消息发送到email address。当app打开时,我成功地做到了这一点。但是当app关闭时,我不能发送mail。如何在关闭app时接收到消息。我用工人发电子邮件。另外,我希望将消息数据发送到worker类以发送电子邮件。

工人阶级

代码语言:javascript
运行
复制
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;
        }

    }
}

我的广播收发器

代码语言:javascript
运行
复制
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);

    }
}
EN

回答 3

Stack Overflow用户

发布于 2019-10-28 10:55:00

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

票数 0
EN

Stack Overflow用户

发布于 2019-10-29 17:44:56

要“唤醒”设备,因为Doze模式和应用程序的备用,唯一可靠的(和电池友好型)是使用高优先级的Firebase消息(FCM)。

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

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

票数 0
EN

Stack Overflow用户

发布于 2019-10-29 19:26:58

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58589161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档