【问题标题】:Alarm Manager does not work as expected when scheduling task调度任务时,警报管理器无法按预期工作
【发布时间】: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


    【解决方案1】:

    AlarmManager.setRepeating 在不同的安卓版本上无法正常工作。

    试试 setExact。它不会重复,但您可以实现如下所述的重复功能:

    更新了 AlarmReceiver.java

    public class AlarmReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            context.sendBroadcast(new Intent("SERVICE_TEMPORARY_STOPPED"));
    
            long repeatCount = PreferenceManager.getDefaultSharedPreferences(context).getLong("REPEAT_COUNT", 0L);
    
            repeatCount++;
    
            PreferenceManager.getDefaultSharedPreferences (context).edit().putLong("REPEAT_COUNT", repeatCount).apply()
    
            AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    
            Intent alarmIntent = new Intent(this, AlarmReceiver.class);
            pendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent, 0);
            manager.setExact(AlarmManager.RTC_WAKEUP, (repeatCount *System.currentTimeMillis()),pendingIntent);
        }
    }
    

    在这里,我们维护一个 repeatCount 和变量(基于偏好)并在您的 AlarmReceiver 中增加它并通过使用 repeatCount * System.currentTimeMillis() 计算 nextAlarmTime 再次安排警报;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-26
      • 2019-11-14
      • 1970-01-01
      相关资源
      最近更新 更多