Отправлять получающие сообщения на электронную почту, когда приложение не активно - PullRequest
0 голосов
/ 28 октября 2019

В моем проекте я хочу отправить все полученные сообщения на 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;
        }

    }
}

My Broadcast Reciever

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);

    }
}

Ответы [ 3 ]

0 голосов
/ 29 октября 2019

Чтобы «разбудить» устройство из-за режима ожидания и ожидания приложения, единственно надежным (и безопасным для батареи) является использование высокоприоритетного сообщения Firebase Cloud ( FCM ).

Ваше приложение может обработать это сообщение, получая отправленное вами электронное письмо. Возможен вариант, когда при получении FCM вы ставите в очередь работника, который затем загружает сообщение / электронную почту.

Все остальное будет зависеть от режима ожидания и других систем оптимизации батареи в Android. Кроме того, использование FCM является наиболее дружественным к аккумуляторам решением для этих случаев.

0 голосов
/ 29 октября 2019

Рабочие уже работают в фоновом потоке - вы не должны создавать свои собственные внутри них. Они также предназначены для синхронной работы - то есть к тому времени, как вы вернете результат, ваша работа должна была быть завершена. Извлеките весь код «нового потока» и поместите содержимое потока прямо в рабочий. Вы также хотите прочитать это: https://developer.android.com/topic/libraries/architecture/workmanager/advanced/threading

0 голосов
/ 28 октября 2019

Если пользователь выключил экран, то вы должны использовать только AlarmManager (основываясь на моей практике) не чаще 1 раза в 30 минут. Например, вы можете использовать собственный Broadcast Reciever и вызывать его с помощью AlarmManager. Пользовательский Broadcast Reciever устанавливает новый сигнал тревоги и т. Д. Также вам нужно создать Boot Broadcast Reciever для запуска сигнала тревоги.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...