2016-10-11 59 views
5

我在多個活動中使用AlarmManager在我的應用中設置了警報。我是否在泄漏上下文?

,爲了避免重複代碼,我創建了以下類:

public class CustomAlarmManager { 

    private static final String SHARED_PREF_REQUEST_CODE = "requestCode"; 
    private static final String KEY_REQUEST_CODE = "kRequestCode"; 

    private CustomAlarmManager() { 
    } 

    public static void setNewAlarm(Context context, long timeInMillis) { 
     Intent intent = new Intent(SomeOtherClass.ALARM_ACTION); 
     intent.putExtra(SomeOtherClass.KEY_ALARM_TIME, timeInMillis); 

     PendingIntent pendingIntent = PendingIntent.getBroadcast(
       context.getApplicationContext(), 
       getNewCode(context), 
       intent, 
       PendingIntent.FLAG_ONE_SHOT); 
     AlarmManager am = (AlarmManager) context.getSystemService(ALARM_SERVICE); 

     if (Build.VERSION.SDK_INT >= 23) { 
      am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, 
       timeInMillis, pendingIntent); 
     } else if (Build.VERSION.SDK_INT >= 19) { 
      am.setExact(AlarmManager.RTC_WAKEUP, timeInMillis, pendingIntent); 
     } else { 
      am.set(AlarmManager.RTC_WAKEUP, timeInMillis, pendingIntent); 
     } 
    } 

    // this method is for generating unique int values 
    // for the requestCode param of PendingIntent.getBroadcast() 
    private static int getNewCode(Context context) { 
     SharedPreferences prefs = context.getSharedPreferences(
      SHARED_PREF_REQUEST_CODE, MODE_PRIVATE); 
     int oldCode = prefs.getInt(KEY_REQUEST_CODE, Integer.MIN_VALUE); 
     int newCode = ++oldCode; 
     prefs.edit().putInt(KEY_REQUEST_CODE, newCode).apply(); 

     return newCode; 
    } 
} 

所以,當我想設置報警,我可以叫從我的應用程序的任何地方執行以下操作:

CustomAlarmManager.setNewAlarm(aContext, someTimeInMillis); 

我的問題:

我是否應該擔心在這裏泄漏Context

我不存儲對它的引用,所以我認爲我很好,但我不確定。

這是一個很好的方法嗎?

+0

你甚至使用的applicationContext以防萬一;)多數民衆贊成真棒;)做得很好。 –

回答

2

我認爲沒有任何問題。

泄漏問題通常發生在您將來需要完成某項任務時,並且您持有對可用對象的引用(可能在該任務發生前被殺死)。

如果將一個非靜態內部類對象作爲將來在特定時間使用的參數發送,也會發生這種情況。由於非靜態內部類持有對其父親的引用,它將成爲一個大的內存泄漏。

1 - 你沒有抱到您的上下文任何參考爲你的未來任務

2 - 你沒有使用一個內部類和製造類作爲一個單獨的文件和方法都是靜態的。

所以要確保你安然無恙;)

2

我應該擔心在這裏泄漏上下文嗎?

絕對不是。

您將context傳遞給該方法,並在其中完成您的工作。你甚至不存儲它或稍後使用它,這可能是在這種情況下邪惡的根源。