当前位置: 首页 > 知识库问答 >
问题:

具有不同数据覆盖的新警报已设置警报

魏安宁
2023-03-14

我正在创建一个简单的应用程序,将关闭我的wifi在指定的时间/在未来。例如,我打开了wifi,我想在晚上10点切换它的状态(关闭),然后在早上8点切换回来(打开)。为此,我编写了一些代码块,其中有一个bug。嗯,当我在晚上10点设置第一个闹钟(让我们根据上面的例子),在早上8点设置第二个闹钟时,只有第二个会着火。根据这里的答案:编辑预定的挂起意图关于挂起意图我检查了这些警报的挂起意图,而设置他们,他们是不同的。

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); <-- 
    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));
  }
}

上面没有括号,page不想接受它们,在代码中显然它们是。

现在pendingintent.getbroadcast的输出,读取两次,第一次在设置第一个警报之后,第二次在设置第二个警报之后。

V/WiFiService: PendingIntent{d3aacca: android.os.BinderProxy@dd4e3b}
V/WiFiService: PendingIntent{3acdbb: android.os.BinderProxy@d5ac2d8}

那么,我在哪里可能会出错呢?

最后,我可以问一下我在哪里可以找到奥利奥股票报警应用程序的源代码或类似的应用程序?(一定是为Marshmallow及以上写的,GitHub上的大多数应用程序都是为Lollipop及以上写的,我发现只有2个是为牛轧糖写的)

最好的

共有1个答案

太叔景曜
2023-03-14

检查您在意图中放置的URI,并确保对于两个不同的调用,URI是不同的。此外,请绝对确保传递给AlarmManager的时间是正确的。

您可以做的另一件事是,在设置每个警报之后,执行ADB shell dumpsys alarm并检查警报是否设置了正确的值。如果您需要帮助理解如何阅读ADB shell dumpsys alarm的输出,请参见此问题

 类似资料:
  • 我试图在。ics文件中实现警报()。其思想是,每当在系统中创建指定的记录时,就会发送带有邀请的自动电子邮件。该事件工作正常,它正在发送,我能够添加到日历(谷歌日历和iPhone/Mac日历)。 所以问题是:是谷歌和苹果忽视了这些VALARM组件,还是我做错了什么? 我是否正确理解这个带有动作的警报应该只是在浏览器(谷歌日历)和日历应用程序中向我显示一个弹出窗口? 我的文件正文: null

  • 问题内容: React Router v4 组件非常适合用于保护导航免受部分填写的表单影响的用例。 但是,如果我们想提供自己的逻辑来代替该组件使用的默认浏览器,该怎么办?React是用于创建UI的,因此这似乎是一个非常合理的用例。在github上浏览Prompt上的问题,我没有发现有人问这个问题。 有谁知道提供警报自定义行为的解决方案? 问题答案: 尽管可以在阻止通过链接在页面之间导航的同时使用自

  • 我每天上午11点使用显示通知。 当我在应用程序中设置警报时,警报会在短时间后触发。

  • 你好,我有一个应用程序有警报,在用户没有响应后,我想刷新警报/再次显示它,但由于某些原因,我没有看到第二个警报,它是空的,像: 我关闭警报,如果它显示,所以我不知道为什么下一个警报是空的。包装应用;

  • 我想取消所有设置的警报。。。。。我已经搜索了很多,尝试了很多东西,但都没有成功。。。当我将闹钟设置为2分钟后,然后取消它时,2分钟后它仍会启动。。。。。任何帮助都将不胜感激。 创建警报的方法: 这是为了取消报警:

  • 问题内容: 我已在帖子中搜索了我的问题的答案,但没有找到能解决我问题的任何东西。我正在尝试使用一个AlarmSettings类设置3种不同的警报。当我设置两个警报时,第二个警报优先于第一个警报,第一个永不熄灭。我认为这可能与我的未决意图有关……我真的是android新手,非常感谢您的帮助。这是我设置警报的代码: 问题答案: 将0属性更改为警报的ID,例如,您有三个警报, 用0,1,2重复上述代码。