【问题标题】:Multiple alarm crash多次报警崩溃
【发布时间】:2014-12-18 20:28:00
【问题描述】:

我目前正在开发一个提醒应用程序,到目前为止我已经设置了 2 个闹钟:一个每天都会响起 (AlarmX),如果日期正确,则设置另一个闹钟 (Alarm) 来唤醒屏幕。

这段代码在我的脑海中是有意义的,但它没有执行我想要的,并且 logcat 显示我不明白他是如何捕获的错误。

这是代码,也许你看到了我没有看到的东西。

AlarmX - 扩展 BroadcastReceiver 的类

    public void SetAlarm(Context context)
{
    AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(context, AlarmX.class);
    intent.putExtra(ONE_TIME, Boolean.FALSE);
    intent.setAction("com.todo.list.brodcast.ALARMX");
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
    //After after 30 seconds
    Calendar c = Calendar.getInstance();
    Calendar k = Calendar.getInstance();
    k.set(Calendar.PM, 12);
    if(c.getTimeInMillis()-k.getTimeInMillis()>0) k.setTimeInMillis(k.getTimeInMillis()+24*60*60*1000);
    am.setRepeating(AlarmManager.RTC_WAKEUP, k.getTimeInMillis() , 24*60*60*1000 , pi); }

此方法使应用程序崩溃,并且永远不会调用此类的 onReceive() 方法。 我像这样从Fragment 调用它:
AlarmX alarm = new AlarmX(); alarm.SetAlarm(getActivity().getApplicationContext()); 还有 Alarm 类 - 与 AlarmX 相同,但根据日志 cat 得到错误,即使它没有被调用。

public void onReceive(Context context, Intent intent) {
    /*acquire power service manager*/
    PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
    @SuppressWarnings("deprecation")
    PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP,"TAG");
    wl.acquire();

    //TODO creaate Notification object
    Bundle b = intent.getBundleExtra("Task");
    UUID id = UUID.fromString(b.getString("UUID"));
    Notification n = new Notification(context, id);
    n.setDescription(b.getString("Description"));
    n.setTitle(b.getString("Topic"));
    n.notifyUser();

    wl.release();
}

现在据我所知,在 AlarmX 中,am.setRepeating() 命令触发了 Alarm 中的 onReceive() 方法,即使我没有调用 alarm 并且 onReceive() 创建了一个空指针异常,因为我没有传递一个包给它。这是logcat 输出...

12-18 22:36:22.857: E/AndroidRuntime(30124): FATAL EXCEPTION: main
12-18 22:36:22.857: E/AndroidRuntime(30124): Process: com.todo.list:remote, PID: 30124
12-18 22:36:22.857: E/AndroidRuntime(30124): java.lang.RuntimeException: Unable to start receiver com.todo.list.brodcast.Alarm: java.lang.NullPointerException
12-18 22:36:22.857: E/AndroidRuntime(30124):    at android.app.ActivityThread.handleReceiver(ActivityThread.java:2856)
12-18 22:36:22.857: E/AndroidRuntime(30124):    at android.app.ActivityThread.access$1700(ActivityThread.java:156)
12-18 22:36:22.857: E/AndroidRuntime(30124):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1440)
12-18 22:36:22.857: E/AndroidRuntime(30124):    at android.os.Handler.dispatchMessage(Handler.java:102)
12-18 22:36:22.857: E/AndroidRuntime(30124):    at android.os.Looper.loop(Looper.java:157)
12-18 22:36:22.857: E/AndroidRuntime(30124):    at android.app.ActivityThread.main(ActivityThread.java:5872)
12-18 22:36:22.857: E/AndroidRuntime(30124):    at java.lang.reflect.Method.invokeNative(Native Method)
12-18 22:36:22.857: E/AndroidRuntime(30124):    at java.lang.reflect.Method.invoke(Method.java:515)
12-18 22:36:22.857: E/AndroidRuntime(30124):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
12-18 22:36:22.857: E/AndroidRuntime(30124):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:674)
12-18 22:36:22.857: E/AndroidRuntime(30124):    at dalvik.system.NativeStart.main(Native Method)
12-18 22:36:22.857: E/AndroidRuntime(30124): Caused by: java.lang.NullPointerException
12-18 22:36:22.857: E/AndroidRuntime(30124):    at com.todo.list.brodcast.Alarm.onReceive(Alarm.java:29)
12-18 22:36:22.857: E/AndroidRuntime(30124):    at android.app.ActivityThread.handleReceiver(ActivityThread.java:2845)
12-18 22:36:22.857: E/AndroidRuntime(30124):    ... 10 more

谢谢!

编辑 - Manifest.xml 以下是我在 Manifest 文件中声明接收者的方式:

<receiver
        android:name="com.todo.list.brodcast.Alarm"
        android:exported="false"
        android:process=":remote" >
        <intent-filter>
            <action android:name="com.todo.list.brodcast.ALARM" />
        </intent-filter>
    </receiver>
      <receiver
        android:name="com.todo.list.brodcast.AlarmX"
        android:exported="false"
        android:process=":Asd" >
        <intent-filter>
            <action android:name="com.todo.list.brodcast.ALARMX" />
        </intent-filter>
    </receiver>

【问题讨论】:

  • 我知道什么是空指针异常,我说过是因为我在Alarm类中没有bundle造成的,那是因为我从来没有调用过Alarm类,也没有通过捆绑到它,但不知何故它被神奇地称为......
  • 您的清单文件中有您的接收器。当操作系统启动时,它会自动创建它们。如果您不希望这样,请不要在清单中声明它们,动态创建它们。
  • 是的,但这有什么关系呢?当我尝试设置警报时应用程序崩溃,而不是当操作系统启动或其他任何东西时......

标签: android alarmmanager android-alarms repeatingalarm


【解决方案1】:

为什么不只实现一个可以触发的警报,而不是调用另一个,而是替换功能?
我认为这将解决您的问题,并简化代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    相关资源
    最近更新 更多