我是否泄漏了上下文信息?

5
我使用AlarmManager在多个Activity中设置闹钟。
为了避免重复的代码,我创建了以下类:
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吗?

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

这是一个好方法吗?


你甚至使用了applicationContext,这太棒了,干得好。 - Amir Ziarati
2个回答

2

在这里我需要担心上下文泄漏吗?

绝对不需要。

你将context传递给方法,并在那里进行操作。你甚至不会存储它或稍后使用它,这可能是此情况的根源。


2

我认为没有任何问题。

泄漏问题通常发生在您需要在未来完成某些任务并且您保留对当前可用对象的引用(该对象可能会在该任务发生之前被删除)。

如果将非静态内部类对象作为参数发送以在将来的特定时间使用,则也会发生这种情况。由于非静态内部类持有对其父类的引用,因此会导致大量的内存泄漏。

1- 您没有保留上下文的引用以供未来任务使用

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接