【问题标题】:App crashes when BroadcastReceiver gets called调用 BroadcastReceiver 时应用程序崩溃
【发布时间】:2015-11-14 06:42:54
【问题描述】:

我有两个小问题;

  1. 我的应用程序的 BroadcastReceiver 在应用程序运行时工作正常,我完美地收到“星期二 2 点”吐司消息,它会更新应用程序,但是当我关闭我的应用程序时,这意味着应用程序停止运行,它不会'没有被调用,而是它崩溃了“你的应用程序停止工作”,所以它知道它应该调用它,但不是,对吧?

  2. 似乎每天下午 2 点左右都会调用 BroadcastReceiver,不仅是在星期二下午 2 点,我希望应用程序每周更新一次。是不是因为我在 UpcomingFragment 的 onCreate 上调用了 setAlarm() 方法?

在 UpcomingFragment 类中(我将闹钟设置为每周二 2 点响起)

 private void setAlarm(){
    AlarmManager alarmMgr = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(getActivity(), UpdateReceiver.class);
    intent.putExtra("greeting", "Hello");
    PendingIntent alarmIntent = PendingIntent.getBroadcast(getActivity(), 0, intent, 0);

    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY);
    calendar.set(Calendar.HOUR_OF_DAY, 14);

    // With setInexactRepeating(), you have to use one of the AlarmManager interval
    // constants--in this case, AlarmManager.INTERVAL_DAY.
    alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
            AlarmManager.INTERVAL_DAY, alarmIntent);
}

在BroadcastReceiver的onReceive()中

public class UpdateReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
         UpcomingFragment.getInstance().update();
         //if tuesday
         Toast.makeText(context, "Tuesday at 2" , Toast.LENGTH_LONG).show();
   }
}

清单:

<uses-permission android:name="com.android.alarm.permission.SET_ALARM"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

 <receiver android:name=".UpdateReceiver">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"></action>
        </intent-filter>
    </receiver>

我无法为您提供 logcat,因为它在兑现时不打印它,我不知道我的 android studio 是在这里还是我的应用程序有问题。谢谢!

【问题讨论】:

  • 表示UpcomingFragment.getInstance().update(); 导致问题的行

标签: android android-fragments android-intent broadcastreceiver android-broadcast


【解决方案1】:

您不能在BroadCastReceiver 的上下文中操作Fragments。本质上,广播接收器在应用程序上下文中运行,您无法在其中访问 UI 内容。

如果您想在广播触发后启动 Activity,您需要以下代码:

Intent intent = new Intent(context, MyActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);

注意:必须在活动上下文中访问 UI(包括 Fragments)。


更新 #1

似乎每天下午 2 点左右都会调用 BroadcastReceiver,不仅在星期二下午 2 点,我希望应用程序每周更新一次。是不是因为我在 UpcomingFragment 的 onCreate 上调用了 setAlarm() 方法?

我认为我有比你更好的方法。

对于前者,您的日程安排代码应将闹钟设置为最近的星期二下午 2 点。为此,this answer 可能会有所帮助。

对于后者,首先,在清单文件中添加以下权限。

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

然后,定义另一个广播接收器并将其声明到清单文件中。

<receiver android:name="your.package.name.BootCompletedReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>

在您新创建的广播接收器中添加此代码。

@Override
public void onReceive(Context context, Intent intent) {
    // Set the alarm to coming Tuesday on 2 PM
}

这可确保您的应用在任何情况下都能在每周二下午 2 点更新。

【讨论】:

  • 非常感谢您的朋友,您是否介意或对上面的第二个问题有任何想法?
  • 但是如果用户在星期二没有打开手机和应用程序怎么办?
  • @MadBoy 哦,你是对的!您应该稍微更改此代码以解决此问题。
猜你喜欢
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-17
相关资源
最近更新 更多