我是否泄露了上下文?

时间:2016-10-11 09:12:19

标签: android android-context android-alarms

我正在使用多个活动中的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

我没有存储对它的引用,所以我觉得我很好,但我不确定。

这是一个好方法吗?

2 个答案:

答案 0 :(得分:2)

  

我是否应该担心泄露上下文?

绝对没有。

您将context传递给方法并在那里完成工作。在这种情况下,你甚至不存储或使用它可能是邪恶的根源。

答案 1 :(得分:2)

我认为没有任何问题。

泄密问题通常发生在您将来需要执行某项任务并且您持有对当前可用对象的引用时(可能在该任务发生之前被杀死)。

如果将非静态内部类对象作为将来在特定时间内使用的参数发送,也会发生这种情况。由于非静态内部类具有对其父亲的引用,因此它将是一个很大的内存泄漏。

1-你没有对你未来的任务提及你的背景

2-你没有使用内部类,并将你的类作为一个单独的文件,方法是静态的。

因此,请确保您的安全和健康;)