在我的项目中,我想将所有接收消息发送到email address
。 app
打开时,我成功完成了此操作。但是当app
关闭时,我无法发送mail
。
app
关闭时如何接收消息。
我用工人来发送电子邮件。
另外,我想将消息数据发送到worker类以发送电子邮件。
工人阶级
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);
}
}
答案 0 :(得分:0)
如果用户关闭屏幕,则您只能在30分钟内(根据我的实践)使用AlarmManager最多不超过1次。例如,您可以使用自定义的广播接收器并通过AlarmManager对其进行调用。自定义广播接收器设置了新的警报等。此外,您还必须创建启动广播接收器才能启动警报。
答案 1 :(得分:0)
由于“打“模式”和应用待机,要“唤醒”设备,唯一可靠(且对电池友好)是使用高优先级Firebase Cloud Message(FCM)。
您的应用程序随后可以处理此消息,以检索您发送的电子邮件。一种选择是,当您收到FCM时,请工作人员加入队列,该工作人员随后将下载消息/电子邮件。
Android的Doze模式和其他电池优化系统都会对其他一切产生影响。此外,对于这些情况,使用FCM是最省电的解决方案。
答案 2 :(得分:0)
工作人员已经在后台线程上运行-您不应在后台线程中创建自己的线程。它们也用于同步工作-意味着当您返回结果时,您的工作应该已经完成。取出所有“新线程”代码,然后将线程的内容直接放在Worker中。您还需要阅读以下内容:https://developer.android.com/topic/libraries/architecture/workmanager/advanced/threading