设置PnedingIntent时使用getApplicationContext或get 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,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,pi);
    }
}

解决方法

context中的PendingIntent用于启动class的对象。因此,我不认为使用任何类型的context都会有所不同,因为一旦启动class中的PendingIntentcontext对象将被收集垃圾收集器。

当然,在某些情况下,context被保留以备将来使用。但是,每个警报都带有一个context似乎并不会引起内存问题。请注意,通过调用getContext(),我们使用了context,但我们没有创建它。这意味着pointer对象仅还有一个context,这是一个相当昂贵的object。不管您将object用作自己的生命周期,除非您将其保存为Field或长时间运行的过程中的class