linbing 5 年之前
父節點
當前提交
5fe4ede19b

+ 2 - 0
android/build.gradle

@@ -66,4 +66,6 @@ dependencies {
     implementation 'com.aliyun.ams:huawei-push-base:2.6.3.305'
     implementation 'com.aliyun.ams:meizu-push:3.8.7.1'
     implementation 'com.aliyun.ams:third_vivopush:2.9.0.1'
+
+    implementation 'org.greenrobot:eventbus:3.2.0'
 }

+ 15 - 0
android/src/main/AndroidManifest.xml

@@ -50,5 +50,20 @@
         <meta-data
             android:name="com.meizhu.push.app_id"
             android:value="${meizhuPushAppId}" />
+
+
+        <receiver
+            android:name="com.flutter.flutter_aliyun_push.FlutterMessageReceiver"
+            android:exported="false"> <!-- 为保证receiver安全,建议设置不可导出,如需对其他应用开放可通过android:permission进行限制 -->
+            <intent-filter>
+                <action android:name="com.alibaba.push2.action.NOTIFICATION_OPENED" />
+            </intent-filter>
+            <intent-filter>
+                <action android:name="com.alibaba.push2.action.NOTIFICATION_REMOVED" />
+            </intent-filter>
+            <intent-filter>
+                <action android:name="com.alibaba.sdk.android.push.RECEIVE" />
+            </intent-filter>
+        </receiver>
     </application>
 </manifest>

+ 81 - 27
android/src/main/java/com/flutter/flutter_aliyun_push/FlutterAliyunPushPlugin.java

@@ -20,22 +20,21 @@ import com.alibaba.sdk.android.push.register.MiPushRegister;
 import com.alibaba.sdk.android.push.register.OppoRegister;
 import com.alibaba.sdk.android.push.register.VivoRegister;
 
-import org.json.JSONArray;
-import org.json.JSONException;
+import org.greenrobot.eventbus.EventBus;
+import org.greenrobot.eventbus.Subscribe;
+
+import java.util.ArrayList;
+import java.util.List;
 
 import io.flutter.Log;
 import io.flutter.embedding.engine.plugins.FlutterPlugin;
 import io.flutter.plugin.common.BinaryMessenger;
-import io.flutter.plugin.common.JSONMethodCodec;
 import io.flutter.plugin.common.MethodCall;
 import io.flutter.plugin.common.MethodChannel;
-import io.flutter.plugin.common.PluginRegistry;
-import io.flutter.plugin.common.StandardMessageCodec;
 import io.flutter.plugin.common.StandardMethodCodec;
 
 public class FlutterAliyunPushPlugin implements FlutterPlugin, MethodChannel.MethodCallHandler {
 
-  public static FlutterAliyunPushPlugin instance;
   public static final String TAG = "AliyunPushPlugin";
   public static final String CHANNEL_NAME="aliyun_push";
   private Context context;
@@ -43,25 +42,56 @@ public class FlutterAliyunPushPlugin implements FlutterPlugin, MethodChannel.Met
   private MethodChannel aliyunPushPluginChannel;
   private static String lastPushRegistSuccessMessage;
   private static String lastPushRegistErrorMessage;
+  private static boolean isPluginAttached; //插件是否被加载到flutter
+  private static List<FlutterPushNotification> cachedNotifications = new ArrayList<FlutterPushNotification>(); //未传到dart的消息
+  private static List<FlutterPushMessage> cachedMessages = new ArrayList<FlutterPushMessage>(); //未传到dart的消息
 
   public MethodChannel getAliyunPushPluginChannel() {
     return aliyunPushPluginChannel;
   }
 
-  public FlutterAliyunPushPlugin() {}
+  public FlutterAliyunPushPlugin() {
+
+  }
+
+
+  @Subscribe()
+  public void onMessageEvent(PushMessageEvent event) {
+    if(aliyunPushPluginChannel == null) {
+      return;
+    }
+    if(PushMessageEvent.EVENT_onPushRegistSuccess.equals(event.eventName)
+      || PushMessageEvent.EVENT_onPushRegistError.equals(event.eventName)
+    ) {
+      //初始化
+      aliyunPushPluginChannel.invokeMethod(event.eventName,(String)event.params);
+    }else if(PushMessageEvent.EVENT_onReceiverMessage.equals(event.eventName)) {
+      //接受消息
+      aliyunPushPluginChannel.invokeMethod(event.eventName,event.params);
+    }
+  };
+
+
+  public static void sendPushNotification(FlutterPushNotification message) {
+    if(FlutterAliyunPushPlugin.isPluginAttached) {
+      EventBus.getDefault().post(new PushMessageEvent(PushMessageEvent.EVENT_onReceiverNotification,message));
+    }else {
+      Log.d(FlutterAliyunPushPlugin.TAG, "message recevie not plugin not attach");
+      cachedNotifications.add(message);
+    }
+  }
 
-  public static void registerWith(PluginRegistry.Registrar registrar) {
-    if (instance == null) {
-      instance = new FlutterAliyunPushPlugin();
+  public static void sendPushMessage(FlutterPushMessage message) {
+    if(FlutterAliyunPushPlugin.isPluginAttached) {
+      EventBus.getDefault().post(new PushMessageEvent(PushMessageEvent.EVENT_onReceiverMessage,message));
+    }else {
+      Log.d(FlutterAliyunPushPlugin.TAG, "message recevie not plugin not attach");
+      cachedMessages.add(message);
     }
-    instance.onAttachedToEngine(registrar.context(), registrar.messenger());
   }
 
   public static void initPush(Context context) {
     Log.i(TAG, "start initPush");
-    if (instance == null) {
-      instance = new FlutterAliyunPushPlugin();
-    }
     PushServiceFactory.init(context);
     initPushVersion(context);
     CloudPushService pushService = PushServiceFactory.getCloudPushService();
@@ -70,8 +100,8 @@ public class FlutterAliyunPushPlugin implements FlutterPlugin, MethodChannel.Met
       public void onSuccess(String response) {
         Log.d(FlutterAliyunPushPlugin.TAG, "init cloudchannel success");
         synchronized (initializationLock) {
-          if(instance.getAliyunPushPluginChannel() != null) {
-            instance.getAliyunPushPluginChannel().invokeMethod("onPushRegistSuccess",response);
+          if(FlutterAliyunPushPlugin.isPluginAttached) {
+            EventBus.getDefault().post(new PushMessageEvent(PushMessageEvent.EVENT_onPushRegistSuccess,response));
           }else {
             Log.d(FlutterAliyunPushPlugin.TAG, "instance.aliyunPushPluginChannel null");
             lastPushRegistSuccessMessage = response;
@@ -83,8 +113,8 @@ public class FlutterAliyunPushPlugin implements FlutterPlugin, MethodChannel.Met
       @Override
       public void onFailed(String errorCode, String errorMessage) {
         Log.d(FlutterAliyunPushPlugin.TAG, "init cloudchannel failed -- errorcode:" + errorCode + " -- errorMessage:" + errorMessage);
-        if(instance.getAliyunPushPluginChannel() != null) {
-          instance.getAliyunPushPluginChannel().invokeMethod("onPushRegistError",errorMessage);
+        if(FlutterAliyunPushPlugin.isPluginAttached) {
+          EventBus.getDefault().post(new PushMessageEvent(PushMessageEvent.EVENT_onPushRegistError,errorMessage));
         }else {
           lastPushRegistErrorMessage = errorMessage;
           lastPushRegistSuccessMessage = null;
@@ -180,12 +210,16 @@ public class FlutterAliyunPushPlugin implements FlutterPlugin, MethodChannel.Met
 
   @Override
   public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) {
+    FlutterAliyunPushPlugin.isPluginAttached = true;
+    EventBus.getDefault().register(this);
     onAttachedToEngine(binding.getApplicationContext(), binding.getBinaryMessenger());
   }
 
   @Override
   public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
     Log.i(TAG, "onDetachedFromEngine");
+    FlutterAliyunPushPlugin.isPluginAttached = false;
+    EventBus.getDefault().unregister(this);
     context = null;
     aliyunPushPluginChannel.setMethodCallHandler(null);
     aliyunPushPluginChannel = null;
@@ -209,20 +243,40 @@ public class FlutterAliyunPushPlugin implements FlutterPlugin, MethodChannel.Met
       // Android/Flutter communication.
       aliyunPushPluginChannel.setMethodCallHandler(this);
 
-      if(lastPushRegistSuccessMessage != null) {
-        Log.i(TAG, "invokeMethod:"+ "onPushRegistSuccess");
-        aliyunPushPluginChannel.invokeMethod("onPushRegistSuccess",lastPushRegistSuccessMessage);
-        lastPushRegistSuccessMessage = null;
-      }else if(lastPushRegistErrorMessage != null) {
-        Log.i(TAG, "invokeMethod:"+ "onPushRegistError");
-        aliyunPushPluginChannel.invokeMethod("onPushRegistError",lastPushRegistErrorMessage);
-        lastPushRegistErrorMessage = null;
-      }
+      dealCacheEvent();
+
 //      aliyunPushPluginChannel.invokeMethod("onPushInit",null);
 
     }
   }
 
+  private void dealCacheEvent() {
+    if(lastPushRegistSuccessMessage != null) {
+      Log.i(TAG, "invokeMethod:"+ "onPushRegistSuccess");
+      aliyunPushPluginChannel.invokeMethod("onPushRegistSuccess",lastPushRegistSuccessMessage);
+      lastPushRegistSuccessMessage = null;
+    }else if(lastPushRegistErrorMessage != null) {
+      Log.i(TAG, "invokeMethod:"+ "onPushRegistError");
+      aliyunPushPluginChannel.invokeMethod("onPushRegistError",lastPushRegistErrorMessage);
+      lastPushRegistErrorMessage = null;
+    }
+
+    //传递缓存的消息到dart
+    if(cachedNotifications.size() > 0) {
+      for (FlutterPushNotification message : cachedNotifications) {
+        aliyunPushPluginChannel.invokeMethod(PushMessageEvent.EVENT_onReceiverNotification,message);
+      }
+      cachedNotifications.clear();
+    }
+
+    if(cachedMessages.size() > 0) {
+      for (FlutterPushMessage message : cachedMessages) {
+        aliyunPushPluginChannel.invokeMethod(PushMessageEvent.EVENT_onReceiverNotification,message);
+      }
+      cachedMessages.clear();
+    }
+  }
+
   @Override
   public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result result) {
     Log.i(TAG, "onMethodCall:"+call.method);

+ 54 - 0
android/src/main/java/com/flutter/flutter_aliyun_push/FlutterMessageReceiver.java

@@ -0,0 +1,54 @@
+package com.flutter.flutter_aliyun_push;
+
+import android.content.Context;
+
+import com.alibaba.sdk.android.push.MessageReceiver;
+import com.alibaba.sdk.android.push.notification.CPushMessage;
+
+import java.util.Map;
+
+import io.flutter.Log;
+
+public class FlutterMessageReceiver extends MessageReceiver {
+    // 消息接收部分的LOG_TAG
+    public static final String REC_TAG = "receiver";
+    @Override
+    public void onNotification(Context context, String title, String summary, Map<String, String> extraMap) {
+        // TODO 处理推送通知
+        Log.e("FlutterMessageReceiver", "Receive notification, title: " + title + ", summary: " + summary + ", extraMap: " + extraMap);
+        FlutterPushNotification message = new FlutterPushNotification();
+        message.title = title;
+        message.summary = summary;
+        message.extraMap = extraMap;
+        FlutterAliyunPushPlugin.sendPushNotification(message);
+    }
+    @Override
+    public void onMessage(Context context, CPushMessage cPushMessage) {
+        Log.e("FlutterMessageReceiver", "onMessage, messageId: " + cPushMessage.getMessageId() + ", title: " + cPushMessage.getTitle() + ", content:" + cPushMessage.getContent());
+
+        FlutterPushMessage message = new FlutterPushMessage();
+        message.title = cPushMessage.getTitle();
+        message.appId = cPushMessage.getAppId();
+        message.messageId = cPushMessage.getMessageId();
+        message.content = cPushMessage.getContent();
+        message.traceInfo = cPushMessage.getTraceInfo();
+        FlutterAliyunPushPlugin.sendPushMessage(message);
+
+    }
+    @Override
+    public void onNotificationOpened(Context context, String title, String summary, String extraMap) {
+        Log.e("FlutterMessageReceiver", "onNotificationOpened, title: " + title + ", summary: " + summary + ", extraMap:" + extraMap);
+    }
+    @Override
+    protected void onNotificationClickedWithNoAction(Context context, String title, String summary, String extraMap) {
+        Log.e("FlutterMessageReceiver", "onNotificationClickedWithNoAction, title: " + title + ", summary: " + summary + ", extraMap:" + extraMap);
+    }
+    @Override
+    protected void onNotificationReceivedInApp(Context context, String title, String summary, Map<String, String> extraMap, int openType, String openActivity, String openUrl) {
+        Log.e("FlutterMessageReceiver", "onNotificationReceivedInApp, title: " + title + ", summary: " + summary + ", extraMap:" + extraMap + ", openType:" + openType + ", openActivity:" + openActivity + ", openUrl:" + openUrl);
+    }
+    @Override
+    protected void onNotificationRemoved(Context context, String messageId) {
+        Log.e("FlutterMessageReceiver", "onNotificationRemoved");
+    }
+}

+ 13 - 0
android/src/main/java/com/flutter/flutter_aliyun_push/FlutterPushMessage.java

@@ -0,0 +1,13 @@
+package com.flutter.flutter_aliyun_push;
+
+import java.util.Map;
+
+public class FlutterPushMessage {
+
+    public String messageId;
+    public String appId;
+    public String title;
+    public String content;
+    public String traceInfo;
+
+}

+ 10 - 0
android/src/main/java/com/flutter/flutter_aliyun_push/FlutterPushNotification.java

@@ -0,0 +1,10 @@
+package com.flutter.flutter_aliyun_push;
+
+import java.util.Map;
+
+public class FlutterPushNotification {
+
+    public String title;
+    public String summary;
+    public Map<String, String> extraMap;
+}

+ 17 - 0
android/src/main/java/com/flutter/flutter_aliyun_push/PushMessageEvent.java

@@ -0,0 +1,17 @@
+package com.flutter.flutter_aliyun_push;
+
+public class PushMessageEvent {
+
+    public static final String EVENT_onPushRegistSuccess = "onPushRegistSuccess";
+    public static final String EVENT_onPushRegistError = "onPushRegistError";
+    public static final String EVENT_onReceiverNotification = "onReceiverNotification";
+    public static final String EVENT_onReceiverMessage = "onReceiverMessage";
+
+    public String eventName;
+    public Object params;
+
+     public  PushMessageEvent(String eventName,Object params) {
+         this.eventName = eventName;
+         this.params = params;
+     }
+}