ToB企服应用市场:ToB评测及商务社交产业平台

标题: Android 集成firebase 推送(FCM) [打印本页]

作者: 丝    时间: 2024-7-14 22:54
标题: Android 集成firebase 推送(FCM)
1,集成firebase 基础
1>googleService文件

2>项目级gradle

3>app级gradle


4>setting 

2,推送相关
重点:

源文档:设置 Firebase Cloud Messaging 客户端应用 (Android) (google.com)
  1. /**
  2. * 监听推送的消息
  3. * 三种情况:
  4. * 1,通知时:
  5. * 当应用处于前台的时候,推送的消息会走onMessageReceived方法,处于后台时走系统托盘。
  6. * 2,数据时:
  7. * 当应用处于前、后台的时候,会走onMessageReceived方法。
  8. * 3,通知且携带数据:
  9. * 当应用处于前台的时候,推送的消息会走onMessageReceived方法,处于后台时,通知走系统托盘,数据走Intent 的 extra 中(点击通知栏后)。
  10. */
复制代码
1>清单文件

  1. 2>MyFirebaseMessagingService类
复制代码
  1. /**
  2. * 推送数据对通知的影响
  3. * 1,如果我们推送的数据 notification 对应的数据 不为空,那么我们接收消息就需要分为两种情况,
  4. * 前台和后台,如果App当前状态为前台,那么 onMessageReceived 方法就会被调用,
  5. * 后续我们自己拿到对用的数据进行通知栏的显示,如果App当前状态为后台的话 那么我们无需自己写 sdk会自己弹出。
  6. *
  7. *,2,如果我们推送的数据 notification 对应的数据为空,把所有的数据放置到data 字段里面,
  8. * 那么sdk不会为我们弹出通知,这时候无论App在前台还是后台都会调用 onMessageReceived ,
  9. * 这时候我们自己需要处理通知栏的ui 显示。这种情况一般用于自定义通知栏ui 的时候。
  10. */
  11. public class MyFirebaseMessagingService extends FirebaseMessagingService {
  12.     /**
  13.      * 监听推送的消息
  14.      * 三种情况:
  15.      * 1,通知时:
  16.      * 当应用处于前台的时候,推送的消息会走onMessageReceived方法,处于后台时走系统托盘。
  17.      * 2,数据时:
  18.      * 当应用处于前、后台的时候,会走onMessageReceived方法。
  19.      * 3,通知且携带数据:
  20.      * 当应用处于前台的时候,推送的消息会走onMessageReceived方法,处于后台时,通知走系统托盘,数据走Intent 的 extra 中(点击通知栏后)。
  21.      */
  22.     @Override
  23.     public void onMessageReceived(@NonNull RemoteMessage message) {
  24.         String testDemo = "0";//测试数据,后端自定义消息/或控制台测试时输入键值,时传递来 “键”-“值” 中的 值
  25. //        Map<String, String> remoteMessageMap = message.getData();
  26.         if (message.getData() != null && !message.getData().isEmpty()) {//不自定义消息,getData为空
  27.             if (message.getData().size() > 0) {
  28.                 testDemo = message.getData().get("testDemo");//“键”-“值” 中的 键
  29.             }
  30.         }
  31.         if (message.getNotification() != null && !message.getNotification().getTitle().isEmpty() && !message.getNotification().getBody().isEmpty()) {
  32. //            sendNotification(message.getNotification().getTitle(), message.getNotification().getBody(), testDemo);
  33.             String click_action = message.getNotification().getClickAction();
  34.             sendNotification(message.getNotification().getTitle(), message.getNotification().getBody(), testDemo, click_action);
  35.         }
  36.     }
  37.     /**
  38.      * 当有新的Firebase token 时的回调
  39.      * 第一次安装app 获取到的 pushtoken
  40.      */
  41.     @Override
  42.     public void onNewToken(@NonNull String token) {
  43.         //token 传递给后端!!
  44.         Log.e("测试", "onNewToken =" + token);
  45.     }
  46.     /**
  47.      * 自定义通知
  48.      *
  49.      * @param messageBody
  50.      */
  51.     private void sendNotification(String messageTitle, String messageBody, String testDemo, String click_action) {
  52.         Intent intent = prepareIntent(click_action);
  53. //    private void sendNotification(String messageTitle, String messageBody, String testDemo) {
  54. //        Intent intent = new Intent(this, MainActivity.class);
  55.         String channelID = getResources().getString(R.string.default_notification_channel_id);//渠道ID
  56.         String channelName = getResources().getString(R.string.default_notification_channel_name);//渠道名称
  57.         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
  58.         if (testDemo != null && !testDemo.isEmpty()) {
  59.             intent.putExtra("testDemo", testDemo);
  60.         }
  61.         int uniqueInt = (int) (System.currentTimeMillis() & 0xff);
  62.         PendingIntent pendingIntent = PendingIntent.getActivity(this, uniqueInt /* Request code */, intent, PendingIntent.FLAG_UPDATE_CURRENT);
  63.         NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
  64.         NotificationCompat.Builder notificationBuilder;
  65.         //android 8 开始要 创建通知渠道,否则通知栏不弹出
  66.         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
  67.             notificationBuilder = new NotificationCompat.Builder(this, channelID);
  68.             NotificationChannel channel = new NotificationChannel(channelID, channelName, NotificationManager.IMPORTANCE_HIGH);
  69.             notificationManager.createNotificationChannel(channel);
  70.         } else {
  71.             notificationBuilder = new NotificationCompat.Builder(this);
  72.         }
  73.         //设置title
  74.         if (messageTitle != null && !messageTitle.isEmpty()) {
  75.             notificationBuilder.setContentTitle(messageTitle);
  76.         } else {
  77.             notificationBuilder.setContentTitle(getResources().getString(R.string.app_name));
  78.         }
  79.         //设置body
  80.         if (messageBody != null && !messageBody.isEmpty()) {
  81.             notificationBuilder.setContentText(messageBody);
  82.         }
  83. //        Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
  84.         notificationBuilder
  85.                 .setSmallIcon(R.drawable.icon_return)//设置通知栏的小图标,必需设置,否则crash
  86.                 .setAutoCancel(true)//点击通知后,通知自动消失
  87.                 .setWhen(System.currentTimeMillis())// 设置通知时间,此事件用于通知栏排序
  88.                 .setPriority(NotificationCompat.PRIORITY_HIGH)// 设置优先级,低优先级可能被隐藏
  89. //                .setSound(defaultSoundUri)
  90.                 .setContentIntent(pendingIntent);//设置通知栏被点击时的事件
  91.         notificationManager.notify(uniqueInt /* ID of notification */, notificationBuilder.build());
  92.     }
  93.     public Intent prepareIntent(String clickAction) {
  94.         Intent intent;
  95.         boolean isAppInBackground;
  96.         isAppInBackground = ProcessJudgmentHelper.isRunBackground(this);
  97.         if (isAppInBackground) {
  98.             intent = new Intent(this, MainActivity.class);
  99.         } else {
  100.             intent = new Intent(clickAction);
  101.         }
  102.         return intent;
  103.     }
  104.     /**
  105.      * 1,如果未开启通知,则跳转到通知设置界面,点击之后就需要跳转到 APP的通知设置界面,
  106.      * 对应的Action是:Settings.ACTION_APP_NOTIFICATION_SETTINGS, 这个Action是 API 26 后增加的。
  107.      * 2,如果在部分手机中无法精确的跳转到APP对应的通知设置界面,我们就考虑直接跳转到APP信息界面,
  108.      * 对应的Action是:Settings.ACTION_APPLICATION_DETAILS_SETTINGS。
  109.      *
  110.      */
  111. }
复制代码
4>主启动Activity(清单文件里设置 <action android:name="android.intent.action.MAIN" /> 的Activity)
  1. /**
  2. * 1,清单文件里设置 <action android:name="android.intent.action.MAIN" /> 的Activity,一般是Splish 闪屏页。
  3. * 在onCreate() 方法里 获取用户PushToken,调用接口传给自己的后端,以防有变化。
  4. * 2,如果是自定义消息(当后端或者控制台设置响应的data 键值)在onResume() 方法里 使用intent 获取到对应的值,进行相关操作,
  5. * 例如:根据约定值 进行响应页面的跳转。
  6. *
  7. *
  8. */
  9. public class MainActivity extends AppCompatActivity {
  10.     @Override
  11.     protected void onCreate(Bundle savedInstanceState) {
  12.         super.onCreate(savedInstanceState);
  13.         setContentView(R.layout.activity_main);
  14.         requestPer();
  15.         try {
  16.             boolean goolgePlayServiceAvailable = FirebaseManager.getInstance().isGoolgePlayServiceAvailable(this);
  17.             if (goolgePlayServiceAvailable) {
  18.                 uploadPushToken();
  19.             } else {
  20.                 Log.e("测试", "谷歌服务不可用");
  21.             }
  22.         } catch (Exception e) {
  23.             e.printStackTrace();
  24.             Log.e("测试", "谷歌服务异常");
  25.         }
  26.     }
  27.     @Override
  28.     protected void onResume() {
  29.         super.onResume();
  30.         Intent intent = getIntent();
  31.         //当后端或者控制台设置自定义消息后,点击通知时能获取到对应的值
  32.         String testDemo = intent.getStringExtra("testDemo");
  33.         if (testDemo != null && !testDemo.isEmpty()) {
  34.             //如有特殊情形,要判断是否登录,没登录跳转登录页
  35. //            if(){
  36. //            }
  37.             if (testDemo.equals("66")) {
  38.                 Intent intentSeconActivity = new Intent(this, SeconActivity.class);
  39.                 startActivity(intentSeconActivity);
  40.                 finish();
  41.             }
  42.         }
  43.     }
  44.     /**
  45.      * 上传push token
  46.      * 正常情况下每次启动 都会获取到!
  47.      */
  48.     private void uploadPushToken() {
  49.         FirebaseMessaging.getInstance().getToken()
  50.                 .addOnCompleteListener(new OnCompleteListener<String>() {
  51.                     @Override
  52.                     public void onComplete(@NonNull Task<String> task) {
  53.                         if (!task.isSuccessful()) {
  54.                             Log.e("测试", "Fetching FCM registration token failed", task.getException());
  55.                             return;
  56.                         }
  57.                         // Get new FCM registration token
  58.                         String token = task.getResult();
  59.                         Log.e("测试", "MainActivity token =" + token);
  60.                     }
  61.                 });
  62.     }
  63.     /**
  64.      * android 高版本请求推送权限
  65.      */
  66.     private void requestPer() {
  67.         XXPermissions.with(this)
  68.                 // 申请单个权限
  69.                 .permission(Permission.POST_NOTIFICATIONS)
  70.                 .request(new OnPermissionCallback() {
  71.                     @Override
  72.                     public void onGranted(List<String> permissions, boolean all) {
  73.                     }
  74.                     @Override
  75.                     public void onDenied(List<String> permissions, boolean never) {
  76.                         if (never) {
  77.                         } else {
  78.                         }
  79.                     }
  80.                 });
  81.     }
  82. }
复制代码
==================结束===============
工具方法:
 
  1.     /** 判断程序是否在后台运行 */
  2.     public static boolean isRunBackground(Context context) {
  3.         ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
  4.         List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
  5.         for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
  6.             if (appProcess.processName.equals(context.getPackageName())) {
  7.                 if (appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_BACKGROUND) {
  8.                     // 表明程序在后台运行
  9.                     return true;
  10.                 } else {
  11.                     return false;
  12.                 }
  13.             }
  14.         }
  15.         return false;
  16.     }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4