2015-04-29 38 views
1

我试图在我的Android应用中使用parse.com的push notification service来获取推送通知。他们实现广播接收器,这是我在我自己的类扩展我:如何让BroadcastService与Activity进行通信?

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. 如果通知到达通知的活动当我将应用打开到显示通知活动时,我需要更新UI以包含新活动。

第一部分很简单。我只是写了一些JSON文件。

第二个我没有任何问题。我创建了一个意图,并打开了我的活动。它从文件中读取JSON,Bob是你的叔叔。

我一直无法找到处理第三部分的干净方式。

我觉得我被卡住的地方是我没有清楚地了解Activities或BroadcastServices的生命周期。我也没有创建,在我的应用程序中,他们在清单中声明,并在任何时候构造。

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

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

帮助将不胜感激。

+0

对不起,询问无关的问题。我是新来解析,它是否每一个活动都必须使用这一行代码“trackAppOpenedInBackground”或只启动页面的追踪目的? – NaiveBz

回答

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就会指向它。

public interface ReceiveNotifications 
{ 
    void notificationReceived(); 
} 

然后,当我们收到通知,如果notificationReceiver不为空,我们称之为notificationReceived():当然,我使用的界面来控制MyActivity的多少通过该变量是可见的

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); 
    } 
} 
1

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

+0

我希望BroadcastReceiver仅在活动处于活动状态时更新活动。我不想让活动向前发展,如果不是的话。 –

+0

在这种情况下,您可以将活动上下文存储在某个静态变量中。如果您收到此静态变量的新通知检查(如果不为空),请使用该检查向用户显示提示。 – Manish

相关问题