zoukankan      html  css  js  c++  java
  • Android中集成极光推送实现推送消息通知与根据别名指定推送附示例代码下载

    场景

    经常会有后台服务向Android推送消息通知的情况。

    如果在推送需求量不大的情况下可以使用较成熟的极光推送。

    极光推送官网:

    https://www.jiguang.cn/

    极光提供有限制的推送服务

    注:

    博客:
    https://blog.csdn.net/badao_liumang_qizhi
    关注公众号
    霸道的程序猿
    获取编程相关电子书、教程推送与免费下载。

    实现

    在极光官网中找到开发者服务,进入开发者平台

    然后点击创建应用

    新建应用时要设置一个包名,记住这个包名在代码中要用到

    然后选择推送服务

    点击下一步,然后可以选择要集成的厂商通道

    选择集成Android

    然后官方提供了集成的文档以及sdk的下载和demo,我们在Android中集成时可以通过jcenter的方式去集成依赖,新建应用完成后

    复制出来应用包名和AppKey,然后在Android Studio中新建一个Android应用

    在Project根目录的build.gradle中配置了jcenter,默认会配置支持

    然后在module下app的build.gradle中添加相关依赖

        implementation 'cn.jiguang.sdk:jpush:3.3.4'  // 此处以JPush 3.3.4 版本为例。
        implementation 'cn.jiguang.sdk:jcore:2.1.0'  // 此处以JCore 2.1.0 版本为例。

    添加位置如下

    然后还是在这里面manifest替换变量

       defaultConfig {
            applicationId "com.badao.pushdemo"
            minSdkVersion 16
            targetSdkVersion 30
            versionCode 1
            versionName "1.0"
    
            testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    
    
            ndk {
                //选择要添加的对应cpu类型的.so库。
                abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64', 'mips', 'mips64'
            }
    
            manifestPlaceholders = [
                    JPUSH_PKGNAME : applicationId,
                    JPUSH_APPKEY : "Push上注册的包名对应的appkey", //JPush上注册的包名对应的appkey.
                    JPUSH_CHANNEL : "developer-default", //暂时填写默认值即可.
            ]
    
        }

    替换位置

    注意这里的两个地方:

    applicationId是你在极光开发平台上新建应用时的包名要一致,

    然后下面的JPUSH_APPKEY是新建应用的对应的appkey

    然后打开项目的AndroidManifest.xml中添加权限

       <!-- Required -->
        <permission
            android:name="com.badao.pushdemo.permission.JPUSH_MESSAGE"
            android:protectionLevel="signature" />
    
        <!-- Required -->
        <uses-permission android:name="com.badao.pushdemo.permission.JPUSH_MESSAGE" />
        <uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
            tools:ignore="ProtectedPermissions" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    
        <!-- Optional. Required for location feature -->
        <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
        <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <!-- 用于开启 debug 版本的应用在 6.0 系统上的层叠窗口权限 -->
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
        <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
        <uses-permission android:name="android.permission.GET_TASKS" />
        <uses-permission android:name="android.permission.VIBRATE" />

    注意这里的第一个权限前面的包名要一致

    然后在AndroidManifest.xml中再注册一个继承JCommonService的服务

            <!-- 注册继承JCommonService的服务 -->
            <service
                android:name=".PushService"
                android:enabled="true"
                android:exported="false"
                android:process=":pushcore">
                <intent-filter>
                    <action android:name="cn.jiguang.user.service.action" />
                </intent-filter>
            </service>

    然后在包路径下新建PushService

     

    代码如下

    package com.badao.pushdemo;
    
    import cn.jpush.android.service.JCommonService;
    
    public class PushService extends JCommonService {
    }

    然后再在AndroidManifest.xml中自定义一个receiver替换原生极光推送接收器

            <!-- 替换原生极光推送接收器 -->
            <receiver
                android:name=".MyReceiver"
                android:enabled="true"
                android:exported="false">
                <intent-filter>
                    <action android:name="cn.jpush.android.intent.RECEIVE_MESSAGE" />
                    <category android:name="com.badao.pushdemo" /> <!--JPush上注册的包名 -->
                </intent-filter>
            </receiver>

    注意这里的包名和JPush上注册的一致

    然后再在包路径下新建MyReceiver

    修改代码如下

    package com.badao.pushdemo;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.util.Log;
    
    import cn.jpush.android.api.CustomMessage;
    import cn.jpush.android.api.JPushMessage;
    import cn.jpush.android.api.NotificationMessage;
    import cn.jpush.android.service.JPushMessageReceiver;
    
    public class MyReceiver extends JPushMessageReceiver {
    
        private static final String TAG = "JIGUANG";
        private Intent intent;
    
        @Override
        public void onConnected(Context context, boolean b) {
            super.onConnected(context, b);
            Log.e(TAG, "onConnected");
        }
    
        @Override
        public void onRegister(Context context, String s) {
            super.onRegister(context, s);
            Log.e(TAG, "onRegister" + s);
        }
    
        @Override
        public void onAliasOperatorResult(Context context, JPushMessage jPushMessage) {
            Log.i("bieming","bieming:"+jPushMessage.getAlias());
            super.onAliasOperatorResult(context, jPushMessage);
            Log.e(TAG, jPushMessage.toString());
        }
    
        /**
         * 可以利用附加字段(notificationMessage.notificationExtras)来区别Notication,指定不同的动作,附加字段是个json字符串
         * 通知(Notification),指在手机的通知栏(状态栏)上会显示的一条通知信息
         */
        @Override
        public void onNotifyMessageArrived(Context context, NotificationMessage notificationMessage) {
            super.onNotifyMessageArrived(context, notificationMessage);
            Log.e(TAG, notificationMessage.toString());
        }
    
        /**
         * notificationMessage.notificationExtras(附加字段)的内容处理代码
         * 比如打开新的Activity, 打开一个网页等..
         */
        @Override
        public void onNotifyMessageOpened(Context context, NotificationMessage notificationMessage) {
            super.onNotifyMessageOpened(context, notificationMessage);
            Log.e(TAG, notificationMessage.notificationExtras);
    
            Intent intent = new Intent(context, MainActivity.class);
            context.startActivity(intent);
        }
    
    
        /**
         * 自定义消息不是通知,默认不会被SDK展示到通知栏上,极光推送仅负责透传给SDK。其内容和展示形式完全由开发者自己定义。
         * 自定义消息主要用于应用的内部业务逻辑和特殊展示需求
         */
        @Override
        public void onMessage(Context context, CustomMessage customMessage) {
            super.onMessage(context, customMessage);
            Log.e(TAG, "onMessage");
        }
    }

    在自定义接收器中重写一些方法来实现相关的回调

    然后在MainActivity中进行对Jpush的初始化

       @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            //初始化极光推送
            JPushInterface.setDebugMode(true);
            JPushInterface.init(this);
    
            if (!isNotificationEnabled(this)) {
                gotoSet();//去设置开启通知
            } else {
                //当前app允许消息通知
            }
        }

    然后后面进行是否设置开启通知的判断,其中

       //是否允许通知
        private boolean isNotificationEnabled (Context context){
            boolean isOpened = false;
            try {
                isOpened = NotificationManagerCompat.from(context).areNotificationsEnabled();
            } catch (Exception e) {
                e.printStackTrace();
                isOpened = false;
            }
            return isOpened;
    
        }

    然后

       //去设置允许通知
        private void gotoSet () {
            Intent intent = new Intent();
            if (Build.VERSION.SDK_INT >= 26) {
                // android 8.0引导
                intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS");
                intent.putExtra("android.provider.extra.APP_PACKAGE", getPackageName());
            } else if (Build.VERSION.SDK_INT >= 21) {
                // android 5.0-7.0
                intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS");
                intent.putExtra("app_package", getPackageName());
                intent.putExtra("app_uid", getApplicationInfo().uid);
            } else {
                // 其他
                intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
                intent.setData(Uri.fromParts("package", getPackageName(), null));
            }
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent);
        }

    然后将项目运行,登录极光开发者平台找到推送消息

    目标人群选择所有人

    则会在App中收到推送

    通过别名设置指定设备进行推送

    上面是对所有的设备进行推送,如果需要对指定的设备进行推送的话

    可以通过设置设备的别名来实现。

    注意跟标签的区别,标签是一类设备,别名是指定设备

    首先在主页面上添加两个按钮

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <Button
            android:id="@+id/button1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="注册别名"
            tools:layout_editor_absoluteX="210dp"
            tools:layout_editor_absoluteY="462dp" />
    
        <Button
            android:id="@+id/button2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="解除注册别名"
            tools:layout_editor_absoluteX="210dp"
            tools:layout_editor_absoluteY="462dp"
            android:layout_below="@id/button1"/>
    
    </RelativeLayout>

    然后在MainActivity中的onCreate中设置点击事件分别为设置别名和删除别名。

            //设置别名-一般在登录时
            findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    JPushInterface.setAlias(getApplicationContext(),0000000001,"badaodechengxvyuan");
                    Log.i("setAlias","setAlias");
                }
            });
    
            //删除别名一般在注销登录时
            findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    JPushInterface.deleteAlias(getApplicationContext(),0000000001);
                    Log.i("deleteAlias","deleteAlias");
                }
            });

    其中设置别名一般在App进行登录时设置

    然后删除别名一般在注销登录后进行,这里设置别名和删除别名都使用按钮事件去实现

    然后启动项目,点击注册别名按钮。

    另外在自定义接收器中的onAliasOperatorResult可以实现对别名注册与删除别名的回调

    然后登录极光开发者后台,在消息推送中目标选择中设置设备别名

    然后就会在指定的app设备中收到推送

    然后在日志中也能看到进入到别名设置的回调中了

    然后再点击一下删除别名注册按钮,则在设备上就收不到推送消息了,并且在极光开发者后台也会提示

    然后在回调方法中也输出

    示例代码下载

    https://download.csdn.net/download/BADAO_LIUMANG_QIZHI/15435342

    博客园: https://www.cnblogs.com/badaoliumangqizhi/ 关注公众号 霸道的程序猿 获取编程相关电子书、教程推送与免费下载。
  • 相关阅读:
    [NOI2005]维修数列
    [CTSC2008]网络管理Network
    Directory类
    System.Uri类
    ViewBag、ViewData和TempData使用方法、区别与联系
    Asp.net MVC 视图之公用代码
    MVC3 Razor模板引擎
    MVC之ActionResult
    Html辅助方法 之 Form表单标签
    MVC之 自定义过滤器(Filter)
  • 原文地址:https://www.cnblogs.com/badaoliumangqizhi/p/14440653.html
Copyright © 2011-2022 走看看