如何让BroadcastService与Activity通信?

时间:2015-04-29 22:54:25

标签: android android-intent notifications android-broadcast

我正在尝试使用parse.com的push notification service在我的Android应用中获取推送通知。他们实现了一个广播接收器,我将在我自己的课程中进行扩展:

public class MyPushBroadcastReceiver extends ParsePushBroadcastReceiver
{
    @Override
    protected void onPushReceive(Context context, Intent intent)
    {
        JSONObject data = getDataFromIntent(intent);

        [...]

        super.onPushReceive(context, intent);
    }

    @Override
    protected void onPushOpen(Context context, Intent intent)
    {
        ParseAnalytics.trackAppOpenedInBackground(intent);

        Intent i = new Intent(context, MyActivity.class);
        i.putExtras(intent.getExtras());
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(i);
    }
}

我超越了两种方法:

  • onPushReceive - 当通知到达时调用
  • onPushOpen - 当用户点击通知区域中的通知时调用此方法

我需要做三件事:

  1. 当通知到达时,我需要保存
  2. 当用户点击通知时,我需要将应用打开到显示我已保存的通知的活动
  3. 如果在应用程序打开显示通知活动时收到通知,我需要更新用户界面以包含新活动。
  4. 第一部分很简单。我只是在文件中写了一些JSON。

    第二个我没遇到过麻烦。我创建了一个意图,这打开了我的活动。它从文件中读取JSON,Bob是你的叔叔。

    我无法找到处理第三部分的简洁方法。

    我认为我被困的地方是我对活动或BroadcastServices的生命周期没有清楚的了解。我也没有创建,在我的应用程序中,它们已在清单中声明,并在任何时候构建。

    Android框架是否会在处理清单时创建其中一个?活动是否有可能找到BroadcastReceiver的实例?如果可以的话,我很容易在他们之间连接回调。

    或者我是否需要定义自己的BroadcastService,ParsePushBroadcastReceiver将用于发布事件,而活动将消耗?我所看到的这些例子看起来过于复杂,应该是一件非常简单的事情。

    帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

关于使用静态变量的建议让我思考,我认为我找到了一个可行的解决方案。

可能有多个活动实例,但任何时候只能有一个活动。

我花了一些时间在Intent上设置各种标志,我将传递给startActivity(),并且不喜欢我看到的任何行为。 (某些组合会崩溃,有些会在堆栈中创建多个条目,因此后退按钮会将您返回到活动的较旧实例,所有这些都会在旧活动被新活动替换时创建视觉效果。)

那么,为什么不创建一个指向当前活动的Activity的静态字段?

public class MyActivity extends Activity implements ReceiveNotifications
{
    public static ReceiveNotifications notificationReceiver = null;

    @Override
    protected void onResume()
    {
        super.onResume();
        NotificationsActivity.notificationReceiver = this;

        updateMessages();
    }

    @Override
    protected void onPause()
    {
        NotificationsActivity.notificationReceiver = null;
        super.onPause();
    }

    @Override
    public void notificationReceived()
    {
        updateMessages();
    }

    private void updateMessages()
    {
        [...]
    }
}

每当MyActivity的一个实例处于活动状态时,静态变量notificationReceiver将指向它。当然,我正在使用一个界面来控制通过该变量可以看到多少MyActivity:

public interface ReceiveNotifications
{
    void notificationReceived();
}

然后,当我们收到通知时,如果notificationReceiver不为null,我们调用notificationReceived():

public class MyPushBroadcastReceiver extends ParsePushBroadcastReceiver
{
    @Override
    protected void onPushReceive(Context context, Intent intent)
    {
        JSONObject data = getDataFromIntent(intent);

        [...]

        super.onPushReceive(context, intent);

    if (MyActivity.notificationReceiver != null)
        MyActivity.notificationReceiver.notificationReceived();
    }

    @Override
    protected void onPushOpen(Context context, Intent intent)
    {
        ParseAnalytics.trackAppOpenedInBackground(intent);

        Intent i = new Intent(context, MyActivity.class);
        i.putExtras(intent.getExtras());
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(i);
    }
}