我正在创建一个简单的应用,该应用会在将来的指定时间关闭/打开我的wifi。例如,我打开了wifi,我想在晚上10点切换其状态(将其关闭),然后再切换回8 AM(打开)。 为此,我编写了一些代码块,其中有一个错误。 好吧,当我在晚上10点设置第一个警报(与上面的示例一致)时,在上午8点设置第二个警报时,只有第二个警报会触发。 根据这里的答案: Editing scheduled pending intends 关于挂起的意图,我在设置警报时检查了那些警报的挂起的意图,它们是不同的。
好的,我将提供一些代码,因为该bug不存在,所以我不会提供全部代码来设置日历。
WiFi.class
//This class also stores and loads scheduled alarm from database,
//that's why here is variable Uri = mUri.
private void setAlarm(){
ContentValues values = new ContentValues();
values.put(AlarmReminderEntry.KEY_TITLE, title);
values.put(AlarmReminderEntry.KEY_DATE, mDate);
values.put(AlarmReminderEntry.KEY_TIME, mTime);
values.put(AlarmReminderEntry.KEY_REPEAT, repeat);
values.put(AlarmReminderEntry.KEY_YEAR, mYear);
values.put(AlarmReminderEntry.KEY_MONTH, mMonth);
values.put(AlarmReminderEntry.KEY_DAY, mDay);
values.put(AlarmReminderEntry.KEY_HOUR, mHour);
values.put(AlarmReminderEntry.KEY_MINUTE, mMinute);
values.put(AlarmReminderEntry.KEY_REPEAT_NO, mRepeatNo);
if (mUri == null) {
Uri newUri =
getContentResolver().insert(AlarmReminderEntry.CONTENT_URI, values);
if (newUri == null) {
Toast.makeText(context, "error saving alarm",
Toast.LENGTH_SHORT).show();
} else {
//WiFiScheduler() is an instance of another class, see code below
//setAlarm(Context context, long timeInMilis, Uri uri)
new WiFiScheduler().setAlarm(getApplicationContext(),
calendar.getTimeInMillis(), mUri);
Toast.makeText(context, "Alarm will fire one time
only", Toast.LENGTH_SHORT).show();
Log.v("Alarm time",
String.valueOf(calendar.getTime()));
}
WifiScheduler.class->调用setAlarm方法的类。 公共类WiFiScheduler {
public void setAlarm(Context context, long alarmTime, Uri
reminderTask) {
AlarmManager alarmManager = (AlarmManager)
context.getSystemService(Context.ALARM_SERVICE);
Log.v("AlarmManager", "Initializing AM");
//Here in PendingIntent instance there is another class called called
// WiFiService
PendingIntent operation =
WiFiService.getReminderPendingIntent
(context,reminderTask);
if (Build.VERSION.SDK_INT >= 23) {
assert alarmManager != null;
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,
alarmTime, operation);
} else {
assert alarmManager != null;
alarmManager.setExact(AlarmManager.RTC_WAKEUP,
alarmTime,operation);
}
}
}
最后是WiFiService.class
public class WiFiService extends IntentService {
private static final String TAG = WiFiService.class.getSimpleName();
public static PendingIntent getReminderPendingIntent(Context context,
Uri uri) {
Intent action = new Intent(context, WiFiService.class);
action.setData(uri);
Log.v(TAG, "uri passed into intent");
String pi = String.valueOf(PendingIntent.getService(context, 0,
action, PendingIntent.FLAG_UPDATE_CURRENT));
Log.v(TAG, pi); <--
我将在本文结尾处给出2条警报的输出,但它们是不同的
return PendingIntent.getService(context, 0, action,
PendingIntent.FLAG_UPDATE_CURRENT);
}
public WiFiService() {
super(TAG);
}
@Override
protected void onHandleIntent(@Nullable Intent intent) {
WifiManager wifiManager = (WifiManager)
getApplicationContext().getSystemService(WIFI_SERVICE);
if (wifiManager.isWifiEnabled()) {
wifiManager.setWifiEnabled(false);
Log.v(TAG, "Wifi is turning off");
} else {
wifiManager.setWifiEnabled(true);
Log.v(TAG, "Wifi is turning on");
}
Calendar calendar = Calendar.getInstance();
int h = calendar.get(Calendar.HOUR_OF_DAY);
int m = calendar.get(Calendar.MINUTE);
int ms = calendar.get(Calendar.SECOND);
Log.v("Time", String.valueOf(h) + ":" + String.valueOf(m) + ":" +
String.valueOf(ms));
}
}
WiFiService.class在清单中定义为:
service android:name =“。WiFiScheduler.WiFiService”
android:exported =“ false”
上面没有方括号,page不想接受它们,在代码中显然是这样。
现在PendingIntent.getBroadcast的输出被读取两次, 首先设置了第一个警报,然后设置了第二个。
V/WiFiService: PendingIntent{d3aacca: android.os.BinderProxy@dd4e3b}
V/WiFiService: PendingIntent{3acdbb: android.os.BinderProxy@d5ac2d8}
那么,我在哪里可能出错?
最后,请问在哪里可以找到Oreo股票警报应用程序源代码或类似的应用程序? (它必须是为棉花糖和更高版本编写的,GitHub上的大多数应用程序都是为Lollipop和更高版本编写的,我发现Nougat只有2个)
最佳
答案 0 :(得分:1)
检查您放入Uri
中的Intent
,并确保对于两个不同的呼叫,两个Uri
不同。另外,请绝对确保您传递给AlarmManager
的时间是正确的。
您可以做的另一件事是,在设置每个警报后,执行adb shell dumpsys alarm
并检查是否已使用正确的值设置了警报。如果您需要帮助来了解如何阅读adb shell dumpsys alarm