背景
- JPush 相关的一切 BroadcastReceiver 不支持动态注册。
- 想实现收到 JPush 广播之后更新某个 Activity 的 UI,又不想使用 Service。
思路
- 利用 JPush 支持的自定义 Receiver 定义一个接收 JPush 广播的 Receiver,并静态注册。
- 在这个自定义的 Receiver 中使用新的 Intent 注册一个新的 Action,使用 onReceive 传入的 Context 广播 Intent,并在需要更新 UI 的 Activity 中动态注册新的 BroadcastReceiver 截获这个 Action。
- 使用 Handler 技术动态更新 UI。
代码实现
-
自定义 Receiver
public class MyPushReceiver extends BroadcastReceiver { public MyPushReceiver() { super(); } @Override public void onReceive(Context context, Intent intent) { if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) { Intent renderIntent = new Intent(); renderIntent.setAction("com.dessert.mojito.CHANGE_STATUS"); context.sendBroadcast(renderIntent); } } }
-
在 UI 线程中截获 Intent,使用 Handler 技术更新 UI
BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if(intent.getAction().equals("com.dessert.mojito.CHANGE_STATUS")) { Message message = new Message(); message.what = PUSH_RECEIVED; handler.sendMessage(message); } } }; IntentFilter filter = new IntentFilter(); filter.addAction("com.dessert.mojito.CHANGE_STATUS"); registerReceiver(mReceiver, filter);