首页 > 解决方案 > getApplicationContext 或设置 PnedingIntent 时获取 Context

问题描述

设置警报时应该使用哪个上下文与 PendintIntent?ApplicationContext 还是活动上下文?

这还重要吗?(性能和内存方面)设置警报时使用哪一个有什么区别吗?

更多细节:我在某处读到,当您持有对活动上下文的引用时,垃圾收集器永远不会清理该活动。因此,如果我想每天设置 5 个警报,并且每个警报都有自己的上下文,如果我传入活动上下文,这不会导致内存泄漏吗?因为对上下文的引用永远不会被清除,因为警报总是在使用中。使用最低内存的最佳实践(上下文)是什么?

这是我已经创建 PendingIntent 的方式:

 public static void setAlarm(Context context, Activity activity){

    AlarmManager am =( AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(activity, AlarmReceiver.class);
    intent.setAction("android.intent.action.NOTIFY");
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_ONE_SHOT);
    
    Calendar time = getTime();

    //set Alarm for different API levels
    if (Build.VERSION.SDK_INT >= 23){
        am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,time.getTimeInMillis(),pi);
    }
    else{
        am.set(AlarmManager.RTC_WAKEUP,time.getTimeInMillis(),pi);
    }
}

标签: androidalarmmanager

解决方案


contextinPendingIntent用于启动 a 的对象class。所以我不相信使用任何类型的有区别,context因为一旦启动classin ,垃圾收集器就会收集对象。PendingIntentcontext

当然,在某些情况下context会保留以供进一步使用。但是,每个警报都有多个警报context似乎不会导致内存问题。请注意,通过调用getContext()我们使用 a context,并且我们不创建它。这意味着该对象只有一个相当昂贵pointer的对象。不管你用它做什么,它本身都会有自己的循环,除非你把它保存在一个或一个长期运行的过程中。contextobjectobjectFieldclass


推荐阅读