簡體   English   中英

有沒有辦法阻止我的應用在特定時間范圍內發送通知?

[英]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 studio 的新手,在網上找不到任何東西來幫助我解決這個問題。

這只是應用程序知道發送通知的方式。 如果我可以繼續使用它,那將是理想的,但如果有更好的方法,我願意改變它。

 //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()並且如果它返回 false,則距上次運行還不到 10 分鍾,如果返回 true,則距上次運行已超過 10 分鍾(或已從不運行)。

要在您的代碼中使用它,在構建notify對象的方法的頂部,只需調用它,如果它返回 false,則返回:

if(!YourClass.shouldSendNotification(context)){
    return;
}

只需確保根據您的喜好調整值(雙關語)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM