0

由于片段旨在封装逻辑,我决定将 BroadReceiver 逻辑放在我自己的片段中。

起初我设置了一个警报,就像它在 ApiDemos 中显示的那样:

Intent intent = new Intent(getActivity(),OnAirPresentBroadcastReceiver.class);
PendingIntent sender = PendingIntent.getBroadcast(getActivity(), 0, intent, 0);

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.SECOND, 30);

AlarmManager am = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);

OnAirPresentBroadcastReceiver 接收广播,此广播的目的是更新片段的 UI。我被困在这里 - 有可能吗?如何?

4

1 回答 1

1

从您的 Receiver,您可以向您的 Activity 发布另一个 Intent。从 Activity 中,您可以使用 FragmentManager 访问 Fragment。

Intent notificationIntent = new Intent(context, MainActivity.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
notificationIntent.putExtra("extra", "extra");
context.startActivityForResult(notificationIntent, 0);

您将在以下活动中获得它:

@Override
protected void onNewIntent(Intent intent)
{
    handleNotification(intent);

    super.onNewIntent(intent);
}

如果您的 Activity 未运行,您将在 OnCreate 中获得额外的意图

确保您的活动在前台:(此代码获取前台活动)

ActivityManager am = (ActivityManager) context.getSystemService(Activity.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
String name = taskInfo.get(0).topActivity.getShortClassName();
if (name.equals(".YOUR_ACTIVITY_NAME")) 
    {
    //only now start your intent.
    }

您可以尝试的另一个方向:

Intent intent = new Intent(getActivity(),YOUR_ACTIVITY_HERE.class);
PendingIntent sender = PendingIntent.getActivitygetActivity(), 0, intent, 0);

现在,您在 Activity 的 onNewIntent 函数中出现的事件(如果它处于活动状态)。这不是一个完整的解决方案,但这可能是一个不错的方向。

于 2012-09-28T11:31:02.880 回答