具有不同数据替代功能的新警报已设置为警报

时间:2018-07-28 17:33:30

标签: android android-intent alarmmanager clock android-pendingintent

我正在创建一个简单的应用,该应用会在将来的指定时间关闭/打开我的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个)

最佳

1 个答案:

答案 0 :(得分:1)

检查您放入Uri中的Intent,并确保对于两个不同的呼叫,两个Uri不同。另外,请绝对确保您传递给AlarmManager的时间是正确的。

您可以做的另一件事是,在设置每个警报后,执行adb shell dumpsys alarm并检查是否已使用正确的值设置了警报。如果您需要帮助来了解如何阅读adb shell dumpsys alarm

的信息,请参见this question