背景
- JPush 相關(guān)的一切 BroadcastReceiver 不支持動態(tài)注冊。
- 想實(shí)現(xiàn)收到 JPush 廣播之后更新某個 Activity 的 UI蝌诡,又不想使用 Service焰坪。
思路
- 利用 JPush 支持的自定義 Receiver 定義一個接收 JPush 廣播的 Receiver,并靜態(tài)注冊。
- 在這個自定義的 Receiver 中使用新的 Intent 注冊一個新的 Action颗味,使用 onReceive 傳入的 Context 廣播 Intent,并在需要更新 UI 的 Activity 中動態(tài)注冊新的 BroadcastReceiver 截獲這個 Action牺弹。
- 使用 Handler 技術(shù)動態(tài)更新 UI浦马。
代碼實(shí)現(xiàn)
-
自定義 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 技術(shù)更新 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);