【问题标题】:Reschedule inexactRepeating alarm with pendingIntent from sharedPreferenceChange使用 sharedPreferenceChange 中的 pendingIntent 重新安排不准确的重复警报
【发布时间】:2014-06-25 11:03:22
【问题描述】:

我正在开发一个测试应用程序来学习 Android,我需要定期启动一个服务来更新一些数据。我正在使用AlarmManagerBroadcastReceiver 来设置警报,它使用默认间隔成功更新了数据,但我希望将此间隔作为用户定义的值。
我目前有以下代码来注册警报:

在清单中:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<receiver android:name=".BootReceiver">
    <intent-filter>
         <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>

接收者:

public class BootReceiver extends BroadcastReceiver {
    private static final String TAG = BootReceiver.class.getSimpleName();

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG,"onReceive method");
        AlarmCreator.setAlarm(context, intent);

    }
}

实际报警:

public static void setAlarm(Context context, Intent intent){
    Log.d(TAG, "Setting alarm");
    // I need the context here
    context.startService(new Intent(context, RefreshService.class));

    SharedPreferences prefs = PreferenceManager
            .getDefaultSharedPreferences(context);
    long interval = Long.parseLong(prefs.getString("interval",
            Long.toString(DEFAULT_INTERVAL)));
    // Here
    PendingIntent operation = PendingIntent.getService(context, -1,
            new Intent(context, RefreshService.class),
            PendingIntent.FLAG_UPDATE_CURRENT);

    // And here
    AlarmManager alarmManager = (AlarmManager) context
            .getSystemService(Context.ALARM_SERVICE);

    if (interval == 0) {
        alarmManager.cancel(operation);
        Log.d(TAG, "Cancelling alarm");
    } else {
        alarmManager.setInexactRepeating(AlarmManager.RTC,
                System.currentTimeMillis(), interval, operation);
        Log.d(TAG, "Setting alarm with interval: " + interval);
    }
}


我尝试过的

我知道使用onSharedPreferenceChanged 我可以在更新首选项时执行代码,问题是为了设置警报我需要有一个 Preference 类不提供的Context。我知道getActivity().getApplicationContext() 的问题是它们可以根据 Preference 活动的生命周期返回 null。

public class SettingsFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener{
    private SharedPreferences prefs;
    @Override 
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.settings);
    }

    @Override
    public void onStart() {
        super.onStart();
        prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
        prefs.registerOnSharedPreferenceChangeListener(this);
    }
    @Override
    public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
        if (key.equals("interval")){
                // Since I'm not using the intent I can just simply pass null.
                AlarmCreator.setAlarm(??,null);
            }

    }

}

问题

我应该将什么传递给AlarmCreator.setAlarm(Content,intent) 以便正确取消或更新警报?甚至可能吗?也许我缺少更好的方法。

其他信息

我刚开始学习 Android 开发,但我花了很多时间阅读文档,但我不知道该怎么做。 有 a similar question 帮助我走上正轨,但我发现答案太模糊,目前我无法理解。

任何想法将不胜感激。
干杯。

【问题讨论】:

    标签: android settings alarm android-pendingintent


    【解决方案1】:

    自从我发布这个问题以来已经有一段时间了,现在我觉得很愚蠢,因为答案很明显。
    调用 getActivity() 并将其传递给上下文。
    如果您需要 Activity 中的上下文,您可以在任何 fragmentthis 中调用 getActivity()
    请记住,您传递的上下文类型很重要,如果在某些情况下使用 Activity 的上下文而不是应用程序上下文 (getActivity().getApplicationContext()),您可能会得到不同的结果。
    查看this link 了解更多信息。

    【讨论】:

      猜你喜欢
      • 2020-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-01
      • 1970-01-01
      相关资源
      最近更新 更多