使用sharedPreferenceChange中的pendingIntent重新计划不准确的重复警报(Reschedule inexactRepeating alarm with pendingIntent from sharedPreferenceChange)
我正在开发一个测试应用程序来学习Android,我需要定期启动服务来更新一些数据。 我正在使用带有
BroadcastReceiver
的AlarmManager
来设置警报,并且它使用默认间隔成功更新数据,但我希望将此间隔作为用户定义的值。
我目前有以下代码来注册警报:在清单中:
<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()
的问题是它们可以返回null,具体取决于Preference活动的生命周期。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开发,但我花了很多时间阅读文档,而我却无法弄清楚如何去做。 有一个类似的问题有助于我走上正轨,但我发现答案对我目前的理解来说太模糊了。
任何想法,将不胜感激。
干杯。I'm developing a test app to learn Android in which I need to fire up a service periodically to update some data. I'm using the
AlarmManager
with aBroadcastReceiver
to set the alarm and it successfully updates the data with the default interval but I'd like to have this interval as a user defined value.
I currently have the following code to register the alarm:In the manifest:
<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>
The 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); } }
The actual alarm:
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); } }
What I've tried
I know that using the
onSharedPreferenceChanged
I can execute code when a preference is updated, the problem is that in order to set the alarm I need to have aContext
which the Preference class doesn't provide. I am aware ofgetActivity().getApplicationContext()
the problem is that they can return null depending on the life cycle of the Preference activity.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); } } }
The question
What should I pass to
AlarmCreator.setAlarm(Content,intent)
so that the alarm gets correctly canceled or updated? Is it even possible? Maybe there's a better approach that I'm missing.Additional info
I just started learning Android development but I've spent a good amount of time reading the documentation and I just couldn't figure out how to do it. There was a similar question which helped to get me on track but I found the answer too vague for my understanding at the moment.
Any Ideas would be appreciated.
Cheers.
原文:https://stackoverflow.com/questions/24406899
相关问答
更多-
以下代码可能会执行您的操作: Sub LoadIntoPayrollTemplate() Dim currRowIn As Long Dim currColIn As Long Dim currRowOut As Long Dim wb As Workbook Dim wb2 As Workbook Set wb = ActiveWorkbook '"Expense Report" Set wb2 = Workbooks.Open(Filename: ...
-
我会使用这种方法来获取行数和列数,这将返回非空单元格的结果。 // Find the last real row lastUsedRow = worksheet.Cells.Find("*",System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value, ...
-
在B1放: =INDEX($A:$A,ROW(1:1)+(COLUMN(A:A)-1)*200) 复制超过25列和向下200行。 In B1 put: =INDEX($A:$A,ROW(1:1)+(COLUMN(A:A)-1)*200) Copy over 25 columns and down 200 rows.
-
Excel Interop - 使用行和列调整大小的停止图表(Excel Interop - Stop Chart from resizing with rows and columns)[2023-10-21]
您可以使用Placement属性: excelChart.Placement = xlMove 我只想把它放在这里以备将来使用。 如果您想知道要通过Interop操作Excel / Word的方法的属性。 在Excel / Word中,启用功能区上的开发人员工具栏。 单击“ 录制宏” 以编程方式执行任何操作,但通过Excel / Word UI执行此操作。 单击停止录制 单击宏 - >编辑 (打开VBA) 查看您录制的宏的代码。 它将在VBA中,但您将能够轻松地移植到C#或VB。 You can u ... -
使用变量数组(动态数组)既简单又快速。 Sub test() Dim wsThis As Worksheet, wsThat As Worksheet Dim vDB As Variant, vR() As Variant Dim r As Long, i As Long, n As Long Dim c As Integer, j As Integer, k As Integer Set wsThis = Sheet1: Set wsThat = Sheet2 ...
-
我想你可能在寻找RowHeight ...... http://msdn.microsoft.com/en-us/library/microsoft.office.tools.excel.namedrange.rowheight(v=vs.80).aspx I think you may be looking for RowHeight... http://msdn.microsoft.com/en-us/library/microsoft.office.tools.excel.namedrange.row ...
-
比较excel中的两列,插入移动相关数据的空白行(Comparing two columns in excel, inserting blank rows moving associated data)[2022-09-26]
如果你想/可以直接使用Excel: 在“D”列的单元格中放入这个公式: =IFERROR(MATCH(A2;$B$2:$B$8;);"") 在“E”列的单元格中输入以下公式: =IF(D2<>"";INDEX($B$2:$C$8;D2;1);"") 在Col“F”的单元格中放入这个公式: =IF(D2<>"";INDEX($B$2:$C$8;D2;2);"") 复制并粘贴所有单元格。 好的认为它是自动的......或者当完成复制并粘贴值时。 If you want / can use directly ... -
如何在pandas DataFrame中存储行和列索引的名称?(How to store the name of rows and column index in pandas DataFrame?)[2024-04-06]
你可以使用hdf。 import numpy as np import pandas as pd I = pd.Index(["a", "b", "c", "d"], name="rows") C = pd.Index(["col0", "col1", "col2"], name="columns") df = pd.DataFrame(data=np.random.rand(4,3), index=I, columns=C) print(df) columns col0 col1 ... -
您的问题有点过于宽泛,因此答案是通用的:为了删除整个工作表列,您可以使用VBA语句,如: Columns("C").Delete, or Columns(3).EntireColumn.Delete或Columns("F:K").Delete 。 类似的语法可能适用于: Rows(3).Delete 。 为了隐藏行/列,请使用如下所示的VBA语句: Rows("3:10").EntireRow.Hidden = True Columns("C").Hidden = True 希望这可能有所帮助。 Your ...
-
我认为你可以使用pandas.read_csv中的skiprows和nrows参数来挑选要读入的各行。 使用skiprows,您可以为它提供一个不导入的长列表(0索引),例如[0,5,6,10]。 这可能最终成为一个巨大的名单。 如果您提供一个整数,它将跳过该行数并开始读取。 将nrows设置为任何可以在您启动它的位置获取所需行数的任何内容。 如果我误解了这个问题,请告诉我。 I think you can use the skiprows and nrows arguments in pandas.rea ...