如何让 BroadcastService 与 Activity 通信?
How to have BroadcastService communicate with Activity?
我正在尝试使用 parse.com 的 push notification service 在我的 Android 应用程序中运行推送通知。他们实现了一个广播接收器,我正在自己扩展它 class:
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 - 当用户点击通知区域中的通知时调用
我需要做三件事:
- 当通知到达时,我需要保存它
- 当用户点击通知时,我需要将应用程序打开到 activity 显示我保存的通知
- 如果在我打开应用程序显示通知时收到通知 activity,我需要更新 UI 以包含新的 activity。
第一部分很简单。我只是将一些 JSON 写入文件。
第二个我没有遇到任何问题。我创建了一个意图,然后打开了我的 activity。它从文件中读取 JSON,Bob 是你的叔叔。
我一直没能找到处理第三部分的简洁方法。
我认为我卡住的地方是我对 Activity 或 BroadcastServices 的生命周期没有清楚的了解。我也没有创建,在我的应用程序中,它们在清单中声明,并在任何时候构造。
Android 框架在处理清单时会创建每一个吗? activity 是否可以找到 BroadcastReceiver 的实例?如果可以的话,我很容易在他们之间建立一个回调。
或者我是否需要定义自己的 BroadcastService,ParsePushBroadcastReceiver 将使用它来发布事件,并且 activity 将使用它?我看到的例子看起来过于复杂,而本应是一件相当简单的事情。
不胜感激。
您可以使用 Activity 的 onNewIntent()
(docs) 方法发送有关发生的事情的新信息,然后显示一些提示。
关于使用静态变量的建议让我开始思考,我认为我找到了一个可行的解决方案。
一个 Activity 可能有多个实例,但任何时候只能有一个处于活动状态。
我花了一些时间在要传递给 startActivity() 的 Intent 上设置各种标志,并且不喜欢我看到的任何行为。 (有些组合会崩溃,有些会在堆栈中创建多个条目,以便后退按钮将您返回到 activity 的旧实例,所有这些都会创建视觉效果,因为旧的 activity 被替换为新的。)
那么,为什么不创建一个指向当前活动的静态字段 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);
}
}
我正在尝试使用 parse.com 的 push notification service 在我的 Android 应用程序中运行推送通知。他们实现了一个广播接收器,我正在自己扩展它 class:
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 - 当用户点击通知区域中的通知时调用
我需要做三件事:
- 当通知到达时,我需要保存它
- 当用户点击通知时,我需要将应用程序打开到 activity 显示我保存的通知
- 如果在我打开应用程序显示通知时收到通知 activity,我需要更新 UI 以包含新的 activity。
第一部分很简单。我只是将一些 JSON 写入文件。
第二个我没有遇到任何问题。我创建了一个意图,然后打开了我的 activity。它从文件中读取 JSON,Bob 是你的叔叔。
我一直没能找到处理第三部分的简洁方法。
我认为我卡住的地方是我对 Activity 或 BroadcastServices 的生命周期没有清楚的了解。我也没有创建,在我的应用程序中,它们在清单中声明,并在任何时候构造。
Android 框架在处理清单时会创建每一个吗? activity 是否可以找到 BroadcastReceiver 的实例?如果可以的话,我很容易在他们之间建立一个回调。
或者我是否需要定义自己的 BroadcastService,ParsePushBroadcastReceiver 将使用它来发布事件,并且 activity 将使用它?我看到的例子看起来过于复杂,而本应是一件相当简单的事情。
不胜感激。
您可以使用 Activity 的 onNewIntent()
(docs) 方法发送有关发生的事情的新信息,然后显示一些提示。
关于使用静态变量的建议让我开始思考,我认为我找到了一个可行的解决方案。
一个 Activity 可能有多个实例,但任何时候只能有一个处于活动状态。
我花了一些时间在要传递给 startActivity() 的 Intent 上设置各种标志,并且不喜欢我看到的任何行为。 (有些组合会崩溃,有些会在堆栈中创建多个条目,以便后退按钮将您返回到 activity 的旧实例,所有这些都会创建视觉效果,因为旧的 activity 被替换为新的。)
那么,为什么不创建一个指向当前活动的静态字段 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);
}
}