gpt4 book ai didi

android - 调度任务时,警报管理器无法按预期工作

转载 作者:行者123 更新时间:2023-11-29 02:42:22 27 4
gpt4 key购买 nike

我目前正在使用 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 类使用消息“SERVICE_TEMPORARY_STOPPED”向我的主 Activity 发送广播。我已经通过 registerReceiver(broadcastReceiver, new IntentFilter("SERVICE_TEMPORARY_STOPPED")); 在我的 MainActivity 中注册了该消息。但是,当我添加另一种方法时,让我们在 broadcastReceiver 中说 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");
}

有什么线索吗?

最佳答案

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

试试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 和变量(基于偏好),并通过使用 repeatCount * System.currentTimeMillis() 计算 nextAlarmTime 在您的 AlarmReceiver 中再次增加它并安排警报;

关于android - 调度任务时,警报管理器无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43206308/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com