场景

经常会有后台服务向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

posted on 2021-02-24 12:21  霸道流氓  阅读(995)  评论(0编辑  收藏  举报