我有两个小问题;
我的应用程序的BroadcastReceiver在应用程序运行时运行良好,我在周二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);
}
在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工作室是否有问题或我的应用程序。谢谢!
答案 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()方法吗?
我认为我的方法比你的更好。
获取当前时间并将其星期设置为星期二可能会产生weird behaviors。
对于前者,您的日程安排代码应将警报设置为最近的下周二下午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点更新。