Android 如何让广播服务与活动沟通?

Android 如何让广播服务与活动沟通?,android,android-intent,notifications,android-broadcast,Android,Android Intent,Notifications,Android Broadcast,我正在尝试在我的Android应用程序中使用parse.com的推送通知。它们实现了一个广播接收器,我在自己的类中对其进行了扩展: public class MyPushBroadcastReceiver extends ParsePushBroadcastReceiver { @Override protected void onPushReceive(Context context, Intent intent) { JSONObject data =

我正在尝试在我的Android应用程序中使用parse.com的推送通知。它们实现了一个广播接收器,我在自己的类中对其进行了扩展:

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-当用户单击通知区域中的通知时调用此选项
我需要做三件事:

  • 当通知到达时,我需要保存它
  • 当用户单击通知时,我需要打开应用程序,进入一个显示我保存的通知的活动
  • 如果在我将应用程序打开到“显示通知”活动时收到通知,我需要更新UI以包含新活动
  • 第一部分很简单。我只是在向文件中写入一些JSON

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

    我还没有找到一个干净的方法来处理第三部分

    我认为我的困境在于我对活动或服务的生命周期没有一个清晰的理解。我也没有创建,在我的应用程序中,它们在清单中声明,并在任何时候构造

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

    或者我需要定义自己的广播服务,ParsePushBroadcastReceiver将使用它来发布事件,活动将使用它吗?我所看到的例子似乎过于复杂,因为这应该是一件相当简单的事情


    非常感谢您的帮助。

    您可以使用活动的
    onNewIntent()
    ()方法发送有关所发生事件的新信息,然后显示一些提示。

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

    一个活动可能有多个实例,但在任何时候都只能有一个实例处于活动状态

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

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

    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():


    我希望BroadcastReceiver仅在活动处于活动状态时更新活动。我不想将活动向前推进,如果它还没有向前推进的话。在这种情况下,您可以将活动上下文存储在某个静态变量中。当您收到此静态变量的新通知检查(如果不为null)时,请使用该检查向用户显示提示。抱歉,提出了不相关的问题。我是新来解析的,是每个活动都必须使用这行代码“TrackAppOpenInBackground”还是仅用于跟踪目的的启动页面?
    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);
        }
    }