【发布时间】:2014-06-25 11:03:22
【问题描述】:
我正在开发一个测试应用程序来学习 Android,我需要定期启动一个服务来更新一些数据。我正在使用AlarmManager 和BroadcastReceiver 来设置警报,它使用默认间隔成功更新了数据,但我希望将此间隔作为用户定义的值。
我目前有以下代码来注册警报:
在清单中:
<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