2013-08-25 2 views
3

У меня есть код, который должен быть запущен ежедневно; для этого я пытаюсь использовать AlarmManager. Это мой код для запускающих сигналов тревоги:AlarmManager в Android

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Intent i = new Intent(this, AlarmReciever.class); 
    PendingIntent pi = PendingIntent.getService(this, 0, i, 0); 
    AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 
    am.cancel(pi); // cancel any existing alarms 
    am.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, 
     SystemClock.elapsedRealtime() + AlarmManager.INTERVAL_DAY, 
     AlarmManager.INTERVAL_DAY, pi); 
} 

Эта часть кода вызова AlarmReciever класс, как и следовало ожидать, но я хочу, чтобы код в AlarmReciever класса, который будет выполняться только один раз в день. Это называется несколько раз. Как его ограничить?

Это AlarmReciever класс:

public class AlarmReciever extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     System.out.println("in alarm reciever class"); 

    } 
} 

Я пытаюсь выполнить некоторые бизнес-логики в методе onReceive().

В файле manifest.xml:

<receiver android:name="com.xyz.reciever.AlarmReciever"></receiver> 

<uses-permission android:name="com.android.alarm.permission.SET_ALARM"/> 

объявлены.

+0

Вы имеете в виду, что это постоянно тревожит? – kabuto178

+0

@ kabuto178 да его постоянно тревожит .... У меня есть sysout в классе AlarmReciever и его печать постоянно ... не один раз, как ожидалось. –

+1

Вы пытались использовать объект календаря как ссылку на время? – kabuto178

ответ

0

Я считаю, что код, который вы должны использовать, чтобы установить сигнал тревоги будет таким:

Intent i = new Intent(this, AlarmReciever.class); 
PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0);  // <- HERE!! 
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 
am.cancel(pi); // cancel any existing alarms 
am.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, 
    SystemClock.elapsedRealtime() + AlarmManager.INTERVAL_DAY, 
    AlarmManager.INTERVAL_DAY, pi); 

, так как ваш AlarmReciever является BroadcastReceiver. Используйте PendingIntent.getBroadcast().

Если у вас есть много работы в методе onReceive() вашего приемника, вы также можете делегировать его IntentService. See this answer, если вы решите это сделать.

+0

, когда используется 'PendingIntent.getBroadcast()', класс 'AlarmReciever' не вызывается. –

+1

@AnilM, вам необходимо убедиться, что ресивер указан в файле AndroidManifest.xml. Например, ''. Вы можете [увидеть это для более полного руководства по использованию AlarmManager таким образом] (http://www.javacodegeeks.com/2012/09/android-alarmmanager-tutorial.html) – Nate

+0

@AnilM также убедитесь, что орфография в файле манифеста xml соответствует написанию кода. Вы на самом деле неправильно задали 'AlarmReceiver' (i <-> e) ... но важно то, что написания совпадают, конечно. – Nate