在片段中接收警报并更新UI

时间:2012-09-28 11:17:24

标签: android

由于片段旨在封装逻辑,我决定将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。我被困在这里 - 它有可能吗?怎么样?

1 个答案:

答案 0 :(得分:1)

您可以从Receiver中将另一个意图发布到您的活动中。从活动中,您可以使用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);
}

如果您的活动没有运行,您将在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函数的事件,如果它是活动的。这不是一个完整的解决方案,但这可能是一个很好的方向。