Я работаю над аналогичным приложением типа. Я использую широковещательный приемник и службу, которая планирует его с помощью диспетчера будильника, таким образом у вас не так много накладных расходов, как запуск таймера, который должен оставаться активным.
Вот моя основная деятельность. Я запускаю последовательности с помощью кнопок.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
}
Button.OnClickListener btnOnClickListener = new Button.OnClickListener() {
@Override
public void onClick(View v) {
if (v == btn_splash) {
initiateAlarm(true);
Toast.makeText(MainActivity.this, " alarm scheduled", Toast.LENGTH_LONG).show();
}
} else if (v == btn_cancel)
{
initiateAlarm(false);
Toast.makeText(MainActivity.this, " alarm stopped", Toast.LENGTH_LONG).show();
}
}
};
}
public void initiateAlarm(Boolean bactive) {
alarmUp = false;
alarmUp = (PendingIntent.getBroadcast(getBaseContext(), 0,
new Intent(this, YourService.class),
PendingIntent.FLAG_NO_CREATE) != null);
if (alarmUp)
{
Log.d("myTag", "Alarm is already active");
Toast.makeText(this, " before scheduling Alarm is already active", Toast.LENGTH_LONG).show();
} else {
YourReceiver.scheduleAlarms(this, prefDuration, bactive);
Toast.makeText(this, "alarms were just scheduled", Toast.LENGTH_LONG).show();
}
alarmUp = false;
alarmUp = (PendingIntent.getBroadcast(getBaseContext(), 0,
new Intent(this, YourService.class),
PendingIntent.FLAG_NO_CREATE) != null);
if (alarmUp)
{
Log.d("myTag", "Alarm is already active");
Toast.makeText(this, " after scheduling Alarm is already active", Toast.LENGTH_LONG).show();
}
}
}
Это YourReceiver, который планирует службу в диспетчере будильника.
public class YourReciever extends BroadcastReceiver {
private static final String TAG = "YourReciever";
@Override
public void onReceive(Context ctxt, Intent i) {
context = ctxt;
scheduleAlarms(ctxt, (long) 3600001, true); // 1 hour - not used
}
static void scheduleAlarms(Context ctxt, Long duration, Boolean bactive) {
Log.e(TAG, " ... scheduleAlarms ");
SharedPreferences preferences;
preferences = PreferenceManager.getDefaultSharedPreferences(ctxt);
prefDuration = preferences.getLong(PREF_DURATION, 3600000); // 1 hour
Log.e(TAG, " ... onReceive ... duration: " + duration);
AlarmManager mgr=
(AlarmManager)ctxt.getSystemService(Context.ALARM_SERVICE);
Intent i=new Intent(ctxt, YourService.class);
PendingIntent pi=PendingIntent.getService(ctxt, 0, i, 0);
mgr.setInexactRepeating(AlarmManager.ELAPSED_REALTIME,
SystemClock.elapsedRealtime() + duration, duration, pi);
if (bactive == false) {
mgr.cancel(pi);
}
}
}
и, наконец, вот класса обслуживания
public class YourService extends IntentService {
public YourService() {
super("YourService");
Log.e(TAG, " ... YourService");
}
@Override
protected void onHandleIntent(Intent intent) {
//
// The action you want to perform.
//
}
}
Что-то вроде этого нужно быть в манифесте.
<service
android:name="com.yourpackagename.YourService"
android:exported="true"/>
Надеюсь, это поможет.
Удачного дня.
«если я добавить его в„на создание“метод моего метод таймера выполняется только при запуске моего приложения» и Каковы ваши намерения? Это каждые 5 минут, пока приложение работает или каждые 5 минут независимо? –
Каждые 5 минут независимо. Купить было бы нормально начать каждые 5 минут, когда мое приложение будет работать – Petrica
Если вы хотите сделать это независимо от того, работает ли приложение, вам нужна услуга и широковещательный приемник для 'android.intent.action.BOOT_COMPLETED', который запустит вашу службу всякий раз, когда телефон работает. Если вы хотите сделать это в приложении, попробуйте поиграть с onResume и onStart. –