【发布时间】:2017-04-04 20:03:03
【问题描述】:
我目前正在使用 Android Alarm Manager 并找到了一个工作示例。但在我的情况下它不能正常工作。让我解释。基本上我的目标是每 5 分钟从 MainActivity 执行一个方法。为此,我使用警报管理器来安排该任务。
基本上这是工作的东西:
AlarmReceiver.java
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
context.sendBroadcast(new Intent("SERVICE_TEMPORARY_STOPPED"));
}
}
MainActivity.java
public class MainActivity extends Activity{
private PendingIntent pendingIntent;
private AlarmManager manager;
BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "I'm running", Toast.LENGTH_SHORT).show();
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent alarmIntent = new Intent(this, AlarmReceiver.class);
pendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent, 0);
registerReceiver(broadcastReceiver, new IntentFilter("SERVICE_TEMPORARY_STOPPED"));
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startAlarm();
}
});
}
public void startAlarm() {
manager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
int interval = 300000;
manager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, pendingIntent);
Log.d(TAG, "Alarm Set");
}
}
一切都很好。 “我正在跑步” Toast 每 300000 毫秒(5 分钟)执行一次。 AlarmReceiver 类向我的主 Activity 发送一个带有消息“SERVICE_TEMPORARY_STOPPED”的广播。我已经通过registerReceiver(broadcastReceiver, new IntentFilter("SERVICE_TEMPORARY_STOPPED")); 在我的 MainActivity 中注册了该消息。但是,当我添加另一种方法时,假设在广播接收器中stopAlarm(),它将在 5 分钟后停止警报,不再应用时间间隔(5 分钟)。在大约 10 秒内,它会调用广播接收器并停止警报。这就是问题所在。看看stop() 方法以及我如何在broadcastReceiver 上调用它:
BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "I'm running", Toast.LENGTH_SHORT).show();
stopAlarm();
}
};
public void stopAlarm() {
Intent alarmIntent = new Intent(this, AlarmReceiver.class);
pendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent, 0);
manager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
manager.cancel(pendingIntent);
Log.d(TAG, "Alarm Cancelled");
}
有什么线索吗?
【问题讨论】:
标签: android alarmmanager