有没有办法阻止我的应用程序在特定时间范围内发送通知?
Is there a way to prevent my app from sending notifications for a certain time frame?
我正在尝试制作一个应用程序,当该应用程序接收到的数据不正常时会通知用户(假设蒸汽温度低于 212 华氏度)。如果用户在应用程序中,该应用程序还会显示信息。只要是这种情况,我就能够收到要发送的通知。唯一的问题是信息需要实时更新,因此每 10 秒更新一次。如果数据持续不正确,这会使应用程序每 10 秒发送一次通知。有没有办法在指定时间内防止重复通知? (大约 10 - 15 分钟)
我曾尝试在 for
循环中使用 thread.sleep(1000)
使其等待 10 分钟,但这会使整个更新系统暂停 10 分钟,因此没有信息会传送到应用程序。我是 android 工作室的新手,在网上找不到任何可以帮助我解决这个问题的东西。
这就是应用知道发送通知的方式。如果我能继续使用它,那就太理想了,但如果有更好的方法,我愿意改变它。
//ERROR Notification
if (map.get("steamTemp") < 212 || map.get("steamTemp") > 500 ||
map.get("waterTemp") < 40 || map.get("waterTemp") > 150||
map.get("dieselFlow") < 50 || map.get("dieselFlow") > 100 ||
map.get("waterFlow") < 50 || map.get("waterFlow") > 100||
map.get("waterFeederLevel") < 10 || map.get("waterFeederLevel") > 150) {
NotificationManager notif = (NotificationManager)
getSystemService(Context.NOTIFICATION_SERVICE);
Notification notify = new Notification.Builder
(getApplicationContext())
.setContentTitle("ERROR: Device Error")
.setContentText("Please see app for more information.")
.setSmallIcon(R.drawable.error_notif)
.setSound(soundUri)
.build();
notify.flags |= Notification.FLAG_AUTO_CANCEL;
notif.notify(0, notify);
}
我希望在出现问题时发送通知,但之后要等待 10 分钟再发送另一个通知。我上面解释的 thread.sleep(1000)
示例的问题是它暂停了整个应用程序,而不仅仅是通知。这是不行的,因为应用需要在用户查看时显示更新的信息。
正如 carlosgub 提到的,您可以使用自己硬编码或用户输入的首选项来确定何时发送它们。这是一些示例代码:
import android.content.Context;
import android.content.SharedPreferences;
import java.util.Date;
public class YourClass {
//Key in Shared Preferences to use
private static final String LAST_UPDATE = "lastUpdate";
//10 minutes, adjust to your preferences
private static final long NUMBER_MILLISECONDS_BETWEEN_UPDATES = (1000L * 60L * 10L);
//Your Shared Preferences name
private static final String SP_NAME = "yourSPName";
private static void saveLastUpdateTime(Context context) {
SharedPreferences sharedPref = context.getSharedPreferences(SP_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
long x = new Date().getTime();
editor.putLong(LAST_UPDATE, x);
editor.commit();
}
private static long getLastUpdateTime(Context context) {
SharedPreferences sharedPref = context.getSharedPreferences(SP_NAME, Context.MODE_PRIVATE);
return sharedPref.getLong(LAST_UPDATE, -1);
}
public static boolean shouldSendNotification(Context context) {
long lastUpdate = getLastUpdateTime(context);
if (lastUpdate == -1) {
saveLastUpdateTime(context);
//This means it has yet to run
return true;
}
long now = new Date().getTime();
if ((now - lastUpdate) > NUMBER_MILLISECONDS_BETWEEN_UPDATES) {
saveLastUpdateTime(context);
return true;
} else {
return false;
}
}
}
在此处的代码中,您调用 shouldSendNotification()
,如果它 return 为假,则距上次 运行 还不到 10 分钟,如果 return是真的,自从上次运行(或者根本没有运行)以来已经超过 10 分钟了。
要在您的代码中使用它,在构建 notify
对象的方法顶部调用它,如果它 return 为假,则 return 输出:
if(!YourClass.shouldSendNotification(context)){
return;
}
只需确保根据您的喜好调整值(双关语)。
我正在尝试制作一个应用程序,当该应用程序接收到的数据不正常时会通知用户(假设蒸汽温度低于 212 华氏度)。如果用户在应用程序中,该应用程序还会显示信息。只要是这种情况,我就能够收到要发送的通知。唯一的问题是信息需要实时更新,因此每 10 秒更新一次。如果数据持续不正确,这会使应用程序每 10 秒发送一次通知。有没有办法在指定时间内防止重复通知? (大约 10 - 15 分钟)
我曾尝试在 for
循环中使用 thread.sleep(1000)
使其等待 10 分钟,但这会使整个更新系统暂停 10 分钟,因此没有信息会传送到应用程序。我是 android 工作室的新手,在网上找不到任何可以帮助我解决这个问题的东西。
这就是应用知道发送通知的方式。如果我能继续使用它,那就太理想了,但如果有更好的方法,我愿意改变它。
//ERROR Notification
if (map.get("steamTemp") < 212 || map.get("steamTemp") > 500 ||
map.get("waterTemp") < 40 || map.get("waterTemp") > 150||
map.get("dieselFlow") < 50 || map.get("dieselFlow") > 100 ||
map.get("waterFlow") < 50 || map.get("waterFlow") > 100||
map.get("waterFeederLevel") < 10 || map.get("waterFeederLevel") > 150) {
NotificationManager notif = (NotificationManager)
getSystemService(Context.NOTIFICATION_SERVICE);
Notification notify = new Notification.Builder
(getApplicationContext())
.setContentTitle("ERROR: Device Error")
.setContentText("Please see app for more information.")
.setSmallIcon(R.drawable.error_notif)
.setSound(soundUri)
.build();
notify.flags |= Notification.FLAG_AUTO_CANCEL;
notif.notify(0, notify);
}
我希望在出现问题时发送通知,但之后要等待 10 分钟再发送另一个通知。我上面解释的 thread.sleep(1000)
示例的问题是它暂停了整个应用程序,而不仅仅是通知。这是不行的,因为应用需要在用户查看时显示更新的信息。
正如 carlosgub 提到的,您可以使用自己硬编码或用户输入的首选项来确定何时发送它们。这是一些示例代码:
import android.content.Context;
import android.content.SharedPreferences;
import java.util.Date;
public class YourClass {
//Key in Shared Preferences to use
private static final String LAST_UPDATE = "lastUpdate";
//10 minutes, adjust to your preferences
private static final long NUMBER_MILLISECONDS_BETWEEN_UPDATES = (1000L * 60L * 10L);
//Your Shared Preferences name
private static final String SP_NAME = "yourSPName";
private static void saveLastUpdateTime(Context context) {
SharedPreferences sharedPref = context.getSharedPreferences(SP_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
long x = new Date().getTime();
editor.putLong(LAST_UPDATE, x);
editor.commit();
}
private static long getLastUpdateTime(Context context) {
SharedPreferences sharedPref = context.getSharedPreferences(SP_NAME, Context.MODE_PRIVATE);
return sharedPref.getLong(LAST_UPDATE, -1);
}
public static boolean shouldSendNotification(Context context) {
long lastUpdate = getLastUpdateTime(context);
if (lastUpdate == -1) {
saveLastUpdateTime(context);
//This means it has yet to run
return true;
}
long now = new Date().getTime();
if ((now - lastUpdate) > NUMBER_MILLISECONDS_BETWEEN_UPDATES) {
saveLastUpdateTime(context);
return true;
} else {
return false;
}
}
}
在此处的代码中,您调用 shouldSendNotification()
,如果它 return 为假,则距上次 运行 还不到 10 分钟,如果 return是真的,自从上次运行(或者根本没有运行)以来已经超过 10 分钟了。
要在您的代码中使用它,在构建 notify
对象的方法顶部调用它,如果它 return 为假,则 return 输出:
if(!YourClass.shouldSendNotification(context)){
return;
}
只需确保根据您的喜好调整值(双关语)。