调用BroadcastReceiver时应用程序崩溃

时间:2015-11-14 06:42:54

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

我有两个小问题;

  1. 我的应用程序的BroadcastReceiver在应用程序运行时运行良好,我在周二2"完美的吐司消息,它更新了应用程序,但当我关闭我的应用程序,这意味着应用程序停止运行,它没有被调用,而是它崩溃"你的应用程序停止工作",所以它知道它应该叫它,但不是吗,对吧?

  2. 看来BroadcastReceiver每天下午2点左右被调用,不仅在周二下午2点,我希望应用程序每周更新一次。可能是因为我在我的UpcomingFragment onCreate上调用了我的setAlarm()方法吗?

  3. 在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工作室是否有问题或我的应用程序。谢谢!

1 个答案:

答案 0 :(得分:0)

您无法在Fragment的上下文中操纵BroadCastReceiver。基本上广播的接收器在应用程序上下文中运行,并且您无法访问UI内容。

如果您希望在触发广播后启动活动,则需要以下代码:

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

注意:访问用户界面(包括片段)必须在活动环境中完成。

更新#1

  

似乎BroadcastReceiver每天下午2点左右被调用,不仅在周二下午2点,我希望应用程序每周更新一次。可能是因为我在我的UpcomingFragment上调用了我的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点更新。