2013-07-01 6 views
0

Я пытаюсь написать приложение для Android, которое будет отключать телефон в определенное время, и для этого я использую комбинацию AlarmManager и BroadcastReceiver согласно this tutorial. Я использую отдельный класс, который будет содержать метод для настройки события с использованием AlarmManager, чтобы я мог использовать этот метод в нескольких своих действиях. Код для этого класса выглядит следующим образом:Android AlarmManager и BroadcastReceiver clarfications

public class EventScheduler { 

    public static void schedule(Event event) { 
     Calendar start = event.getStartTime(); 
     Calendar end = event.getEndTime(); 
     String status = event.getStatus(); 

     Context ctx; 

     Intent intent = new Intent(ctx, AlarmReceiver.class); 
     intent.putExtra("start_time", start); 
     intent.putExtra("end_time", end); 
     intent.putExtra("status", status); 

     PendingIntent sender = PendingIntent.getBroadcast(); 
     AlarmManager am = (AlarmManager) getSystemSerivce(ALARM_SERVICE); 


    } 

    public static void unschedule(Event event) { 

    } 
} 

Мой первый вопрос - инициализировать объект намерения. Поскольку этот метод определен в классе, который не расширяет Activity, он не имеет контекста (ctx), но этот метод будет использоваться в классах, которые расширяют Activity, поэтому как бы получить контекст этих классов для использования в инициализация намерения?

Мой второй вопрос - инициализировать PendingIntent. PendingIntent.getBroadcast() должен принимать 4 параметра, так как еще раз, как бы получить контекст класса, вызывающего этот метод для использования в качестве первого параметра? Также в документации говорится, что второй параметр, requestCode не используется, означает ли это, что это может быть 0?

Мой третий вопрос касается инициализации AlarmManager. Опять же поле ALARM_SERVICE связано с объектом контекста, и какой контекстный объект я бы использовал в этом случае?

ответ

1

Вы должны передать свой Context в каждый метод (в вашем случае, скорее всего, ваш Activity):

public static void schedule(Context ctx, Event event) { 
    // ... 
} 
public static void unschedule(Context ctx, Event event) { 
    // ... 
} 

И да, requestCode для PendingIntent.getBroadcast() всегда может быть равен нулю.

+0

Могу ли я использовать контекст, который я передаю для каждого экземпляра контекста в этом методе, похоже, что в учебнике они используют два разных контекста, один - это 'ctx', а другой - контекст класса? – azrosen92

+0

@ azrosen92 - да, любой 'Context' будет делать в случае связанных с AlarmManager действий. Как правило, для создания компонентов пользовательского интерфейса требуется определенный тип «Контекст» (для которого требуется «Активность»). Вот хороший пример того, что «Context» делает: http://www.doubleencore.com/2013/06/context/ – ianhanniballake

+0

Спасибо! Эта статья очистила много вещей до – azrosen92

2

Отвечая на ваш вопрос в контексте, вы должны передать ApplicationContext, а не непосредственно Activity, если вам нужен контекст на протяжении всего жизненного цикла приложений. Если вы передадите свой Activity, GarbageCollector не сможет удалить его из памяти, когда он больше не нужен, что может привести к утечке памяти. Вы можете получить контекст приложения, используя context.getApplicationContext().

Надеюсь, что помогает.

+0

Привет, В моем приложении я передаю контекст своей деятельности (через это) в PendingIntent.getBroadcast, используемую через AlarmManager.setRepeating ... Это приведет к утечке памяти? –

Смежные вопросы