0

我有两个小问题;当BroadcastReceiver被调用时,应用程序崩溃

  1. 我的应用程序的广播接收器的工作原理应用程序运行时很好,我得到了“周二2”烤面包的消息完全与它更新的应用程序,但是当我关闭我的应用程序,这意味着应用程序停止运行,它不会被调用,而是会崩溃“你的应用程序停止工作”,所以它知道它应该调用它,但不是,对吧?

  2. 似乎BroadcastReceiver每天在下午2点左右打电话,不仅在星期二下午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); 
} 

在广播接收器的的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> 

i ca不提供您的logcat,因为它不会在打钱时打印它,我不知道我的android studio是否在这里或我的应用程序出错。谢谢!

+0

意思'UpcomingFragment.getInstance()。update();'线路导致问题 –

+0

显示日志猫错误 –

回答

0

您无法在BroadCastReceiver的上下文中操作Fragment s。基本上广播接收器在应用程序上下文中运行,并且你不能访问UI的东西。

如果你想开始一个活动一旦广播发射,就需要下面的代码:

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

注:访问到UI(包括片段),必须在活动范围内进行。


更新#1

看来,广播接收器被在下午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点都得到更新。

+0

非常感谢你的朋友,你会介意还是对第二个问题有丝毫的想法? – MadBoy

+0

但如果用户在星期二或应用程序中未打开手机,该怎么办? – MadBoy

+0

@MadBoy哦,你是对的!您应该稍微更改此代码以解决此问题。 –

相关问题