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