我是否泄露了上下文?

jus*_*oob 5 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,当我想设置闹钟时,我可以从我的应用中的任何位置调用以下内容:

CustomAlarmManager.setNewAlarm(aContext, someTimeInMillis);
Run Code Online (Sandbox Code Playgroud)

我的问题:

我应该担心泄漏Context吗?

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

这是一个好方法吗?

Ami*_*ati 2

我认为没有任何问题。

当您需要将来完成某些任务并且您持有对当前可用对象的引用(该对象可能会在该任务发生之前被杀死)时,通常会发生泄漏问题。

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

1-你没有为你未来的任务提供任何参考资料

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

所以请确保您安全无恙;)