如何编辑/重置Alarm Manager?

7
我已经设置了一个首选项界面,其中我有一个列表首选项,允许用户选择通知他们的时间间隔。他们可以选择每2、4、8、10或12小时通知一次。以下是我的列表首选项:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<ListPreference
            android:title="Notification Timer"
            android:summary="Select when to Notify"
            android:dialogTitle="Show Notification after every:"
            android:positiveButtonText="OK"
            android:negativeButtonText="Cancel"
            android:entries="@array/entries"
            android:entryValues="@array/entries"
            android:key="listPrefs" />
</PreferenceScreen>

这是我的Settings.class 文件:

public class Settings extends PreferenceActivity implements OnPreferenceChangeListener{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.settings);

        ListPreference listPreference = (ListPreference) findPreference("listPrefs");
        listPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {

            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {

                return false;
            }
        });
        @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        // TODO Auto-generated method stub
        return false;
    }
}

我希望在用户更改通知时间间隔时更新或重置警报。例如,如果用户选择4个小时,则必须在4个小时后通知他/她;如果用户选择10个小时,则必须在10个小时后通知他/她!


1
请查看AlarmManager文档。如果你在使用API时遇到了特定问题或应用崩溃,请提供更多信息。 - Larry Schiefer
4
大家请写下投反对票的原因。 - Biraj Zalavadia
2个回答

5

请按以下步骤操作:

  1. Copy the following methods to your Setting.java file:

    private final int NOTIFICATION_TIMER = 11;
    
    public void setAlarm(Context mContext,int requestCode,long time) {
    
        Intent myIntent = new Intent(mContext, AlarmReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, requestCode, myIntent,0);
    
        cancelAlarmIfExists(mContext,requestCode,myIntent);
    
        AlarmManager alarmManager = (AlarmManager)mContext.getSystemService(ALARM_SERVICE);
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, (System.currentTimeMillis()+time), time, pendingIntent);
    }
    
    public void cancelAlarmIfExists(Context mContext,int requestCode,Intent intent){
        try {
            PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, requestCode, intent,0);
            AlarmManager am=(AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE);
            am.cancel(pendingIntent);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
  2. Call them from the onPreferenceChange() method. Like so:

    listPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
        @Override
        public boolean onPreferenceChange(Preference preference, Object newValue) {
    
            long time = 34352355253; // calculate millisecons from change value by user.
            setAlarm(Settings.this,NOTIFICATION_TIMER,time);
            return false;
        }
    });
    

谢谢你的回答,但这里出现了一个错误:setAlarm(this,NOTIFICATION_TIMER,time); 错误是:类型“Settings”中的方法“setAlarm(Context, int, long)”对于参数(new Preference.OnPreferenceChangeListener(){}, int, long)不适用。 - Hammad Nasir
老兄,这只是一个静态值。当用户从列表中选择它时,您必须计算该值。如果用户点击2小时,则需要计算2小时的毫秒数并将其分配给时间变量。 - Biraj Zalavadia
1
请将以下与编程相关的内容从英语翻译成中文。仅返回翻译后的文本:请阅读其中的注释,并尝试用自己的话表达。// This function takes in an array of numbers and returns the sum of all the even numbers // 这个函数接收一个数字数组,并返回所有偶数的总和 - Biraj Zalavadia

2

FLAG_CANCEL_CURRENT和上面的答案具有相同的效果

PendingIntent pi = PendingIntent.getService(this, 0, notifIntent, PendingIntent.FLAG_CANCEL_CURRENT);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接