AlarmManager не повторяется
Я не могу заставить повторять AlarmManager. Я перепробовал много примеров, но для меня они не работают. Сигнализация всегда срабатывает только один раз, тогда ничего не происходит. Я запустил все примеры на моем устройстве (Android 4.4.2), и все примеры работают полностью одинаково. Всего один огонь, а потом ничего. Кто-нибудь может сказать мне, что я делаю не так? Вот код последнего примера: Receiver:
package net.desme.alarmtest;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.PowerManager;
import android.widget.Toast;
public class Alarm extends BroadcastReceiver {
public void onReceive(Context context, Intent intent)
{
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
wl.acquire();
Toast.makeText(context, "Alarm !!!!!!!!!!", Toast.LENGTH_SHORT).show(); // For example
wl.release();
}
public void setAlarm(Context context)
{
AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(context, Alarm.class);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 6, pi); // Millisec * Second * Minute
}
public void cancelAlarm(Context context)
{
Intent intent = new Intent(context, Alarm.class);
PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(sender);
}
}
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.desme.alarmtest" >
<uses-permission android:name="android.permission.WAKE_LOCK" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".AlarmManagerActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".Alarm" android:process=":remote" />
</application>
</manifest>
Деятельность:
package net.desme.alarmtest;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
public class AlarmManagerActivity extends Activity {
Alarm alarm = new Alarm();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_alarm_manager);
findViewById(R.id.start_repeating).setOnClickListener(mStartRepeatingListener);
findViewById(R.id.stop_repeating).setOnClickListener(mStopRepeatingListener);
}
private View.OnClickListener mStartRepeatingListener = new View.OnClickListener() {
public void onClick(View v) {
alarm.setAlarm(getApplicationContext());
}
};
private View.OnClickListener mStopRepeatingListener = new View.OnClickListener() {
public void onClick(View v) {
alarm.cancelAlarm(getApplicationContext());
}
};
}
Также я попробовал это:
https://developer.android.com/training/scheduling/alarms.html http://www.coderzheaven.com/2011/07/31/how-to-setup-a-repeating-alarm-in-android/
и многое другое, но я не могу опубликовать это, потому что красный совет говорит, что мне нужно по крайней мере 10 репутации
РЕДАКТИРОВАТЬ
Проблема была в том, что в API 19+ все тревоги неточны. Вот что говорится в документации:
Примечание. Начиная с API 19 все повторяющиеся сигналы тревоги являются неточными. Если вашему приложению требуется точное время доставки, оно должно использовать одноразовые точные сигналы тревоги, каждый раз меняя расписание, как описано выше. Устаревшие приложения, у которых targetSdkVersion более ранний, чем API 19, будут по-прежнему обрабатывать все свои тревоги, включая повторяющиеся, как точные.
И возможные решения:
Примечание: для операций синхронизации (тики, тайм-ауты и т. Д.) > Проще и гораздо эффективнее использовать обработчик
Если ваше приложение хочет, чтобы время доставки изменялось, чтобы гарантировать, что между сигналами тревоги всегда будет хотя бы определенный промежуток времени, то подход состоит в том, чтобы использовать одноразовые сигналы тревоги, самостоятельно планируя следующий при обработке каждой доставки сигналов тревоги.,
2 ответа
Ваш код прекрасно работает в Android 4.4.2 API 22. Может быть, AlarmManager
на вашем устройстве /API действует по-другому; возможно, переопределение частоты, так как она такая короткая. Вам действительно нужен интервал 6 секунд? Попробуйте увеличить частоту за минуту, то есть> 60000.
Это решение для запуска тревоги для повторения с интервалом в 10 секунд, но его ожидаемое намерение отличается, потому что я использовал этот метод, чтобы запустить службу после интервала 10 секунд, поэтому используйте его в соответствии с вашими требованиями,
Calendar cal = Calendar.getInstance();
cal.add(Calendar.SECOND, 10);
Intent intent = new Intent(Main.this, Service_class.class);
Intent i = new Intent(context, Alarm.class);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
36000 * 1000, pintent);
Спасибо