android Studio实现极光推送

消息推送

定义:客户端被动接收服务器数据都可以用上消息推送技术,应用场景:广告,即时通讯(QQ聊天,微信)

原理:

要求:

1.要保证服务器和客户端一直连接着(长连接)

2.双方数据传递遵守协议

3.服务器端时刻监听和客户端是否连接正常


极光推送的使用

这是我从 【快速搞定】2分钟搞定极光推送(极光推送Android端集成) 这篇文章上获取的,然后自己总结了一下
使用的是依赖库的形式,而不是导包的形式,这样更方便
1.去极光官网登录/注册,然后创建应用( 此处省略自己去弄)

2.添加极光推送的cpu(在build.gradle(Mobule:app)目录下) ,在defaultConfig标签下

/**
 * 1.极光推送添加cpu
 */
ndk {
    //选择要添加的对应cpu类型的.so库(不需要的删除即可)。
    abiFilters 'armeabi', 'armeabi-v7a', 'armeabi-v8a', 'x86', 'x86_64', 'mips', 'mips64'
}

manifestPlaceholders = [
        JPUSH_PKGNAME: applicationId,
        JPUSH_APPKEY : "dbe646690cda530bfde7da9b", //JPush上注册的包名对应的appkey(*换成你的*)
        JPUSH_CHANNEL: "developer-default", //暂时填写默认值即可.
]


3.添加依赖(即添加sdk)

/**
 * 2.添加极光推送sdk,Jpush和JCore都要添加
 */
compile 'cn.jiguang.sdk:jpush:3.0.9'    // 此处以JPush 3.0.9 版本为例。
compile 'cn.jiguang.sdk:jcore:1.1.7'  // 此处以JCore 1.1.7 版本为例。

4.初始化

新建一个MyApplication类(继承至Application),并在清单文件(AndroidManifest.xml)的application节点添加name属性关联MyApplication。在MyApplication的onCreate方法中加入初始化的(创建Application都要在清单文件中配置的这是基础)
代码
public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        
    /**
 	* 4.初始化sdk
 	*/
JPushInterface.setDebugMode(true);//正式版的时候设置false,关闭调试 JPushInterface.init(this); //建议添加tag标签,发送消息的之 //建议添加tag标签,发送消息的之 }}
在清单文件中添加配置
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:name=".MyApplication"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

5.创建自定义广播接收器

极光推送是需要自定义一个广播器来接收推送消息的(同样要在清单文件配置,毕竟4大组件嘛)。该类什么都不用写,直接继承BroadCastReceiver 即可

public class MyReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

    }
}
清单文件全部代码

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.luuuzi01.jiguangdemo">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:name=".MyApplication"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
<!--用户自定义的Receiver-->
        <receiver
            android:name=".MyReceiver"
            android:enabled="true"
            android:exported="false">
            <intent-filter>
                <action android:name="cn.jpush.android.intent.REGISTRATION" /> <!--Required  用户注册SDK的intent-->
                <action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED" /> <!--Required  用户接收SDK消息的intent-->
                <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED" /> <!--Required  用户接收SDK通知栏信息的intent-->
                <action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" /> <!--Required  用户打开自定义通知栏的intent-->
                <action android:name="cn.jpush.android.intent.ACTION_RICHPUSH_CALLBACK" /> <!--Optional 用户接受Rich Push Javascript 回调函数的intent-->
                <action android:name="cn.jpush.android.intent.CONNECTION" /><!-- 接收网络变化 连接/断开 since 1.6.3 -->
                <category android:name="com.hdl.jpushdemo" />	<--记得要改成自己的包名,不然不会打印log-->
            </intent-filter>
        </receiver>
    </application>

</manifest>



6.测试 

以上步骤就可以通过平台发送消息给客户端了,我是用的真机,没有截图,就把极光平台的数据截下来,真机上就可以收到


7.对收到的通知进行处理

在自己创建的BroadCastReceiver的onReceiver()方法中进行处理
当客户端收到推送过来的消息时 onReceiver()方法就会执行

// 客户端收到通知消息就会调用onReceiver()方法,可以在这个方法里对收到的消息进行处理
	@Override
	public void onReceive(Context context, Intent intent) {
		// 1.拿到消息的action
		Bundle bundle = intent.getExtras();
		Log.d(TAG, "消息的action:" + intent.getAction());
		// 2.对消息进行判断,注册成功后得到id(ACTION_REGISTRATION_ID)
		if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) {

		} else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent
				.getAction())) {
			// .收到了自定义消息,自定义消息不会展示到通知栏,完全要开发者写代码去处理
			System.out.println("收到了自定义消息,消息内容是:"
					+ bundle.getString(JPushInterface.EXTRA_MESSAGE));

		} else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) {
			// 客户端收到了通知执行此分支,可以做些统计,或者其他工作
			System.out.println("收到了通知");
			//拿到通知的标题
			String title_str=bundle.getString(JPushInterface.EXTRA_NOTIFICATION_TITLE);
			//拿到通知的内容
			bundle.getString(JPushInterface.EXTRA_ALERT);
		}else if(JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {
			//用户点击打开了通知
			System.out.println("用户点击打开了通知");
			//在这里可以自己写代码去定义用户点击后的行为,
			//举例:点击通知后跳转至一个链接,从通知中拿到一个url,
			//但是url不能被用户看到,需要通过发送消息界面低端点击可选设置->附加字段,设置键和值,通过键拿到值,可以添加多个
			//拿到附加字段(json格式的字符串)
			bundle.getString(JPushInterface.EXTRA_EXTRA);
		}else {
			//未处理的消息(Unhandled:未处理)
			Log.d(TAG, "Unhandled intent -"+intent.getAction());
		}
	}

通知 vs 自定义消息

极光推送包含有通知与自定义消息两种类型的推送。本文描述他们的区别,以及建议的应用场景。

两者的区别 - 功能角度

通知

通知(Notification),指在手机的通知栏(状态栏)上会显示的一条通知信息。这是 Android / iOS 的基本功能。

通知主要用于提示用户。一条通知,简单的填写纯文本的通知内容即可。

应用加上通知功能,有利于提高应用的活跃度。

自定义消息

自定义消息不是通知,默认不会被SDK展示到通知栏上,极光推送仅负责透传给SDK。其内容和展示形式完全由开发者自己定义。

自定义消息主要用于应用的内部业务逻辑和特殊展示需求。

两者的区别 - 开发者使用角度

通知

简单场景下的通知,用户可以不写一行代码,而完全由 SDK 来负责默认的效果展示,以及默认用户点击时打开应用的主界面。

JPush Android SDK 提供了 API 让开发者来定制通知栏的效果,请参考:自定义通知栏样式教程;也提供了 接收推送消息Receiver 让你来定制在收到通知时与用户点击通知时的不同行为。

自定义消息

SDK 不会把自定义消息展示到通知栏。所以调试时,需要到日志里才可以看到服务器端推送的自定义消息。

自定义消息一定要由开发者写 接收推送消息Receiver 来处理收到的消息。

注意:

当自定义消息内容msg_content为空时,SDK不会对消息进行广播,使得app无法接收到推送的消息,因此建议在使用自定义消息推送时添加内容。

以上的官方文档对通知和自定义消息的概述

8,自定义消息的使用

可以在极光平台自定义消息界面发送任意格式的消息给客户端,然后客户端根据消息内容去做不同的操作,自定义消息不会再通知栏显示(即用户不能看到),只能通过log打印查看

9.添加标签和别名

在初始化的时候添加
 //设置别名(可以随便填)
        JPushInterface.setAlias(this, "别名", new TagAliasCallback() {
            @Override
            public void gotResult(int i, String s, Set<String> set) {
                //回调接口,i=0表示成功,其它设置失败
            }
        });
        //添加tag标签,发送消息的之后就可以指定tag标签来发送了
//        Set<String> set = new HashSet<>();
//        set.add("andfixdemo");//名字任意,可多添加几个
//        JPushInterface.setTags(this, set, null);//设置标签

在项目中我设置别名是根据官方文档的样子设置的,这样防止设置失败

    /**
     * 设置别名
     *
     * @param alias
     */
    // 这是来自 JPush Example 的设置别名的 Activity 里的代码。一般 App 的设置的调用入口,在任何方便的地方调用都可以。
    private void setAlias(String alias) {
        // 调用 Handler 来异步设置别名
        mHandler.sendMessage(mHandler.obtainMessage(MSG_SET_ALIAS, alias));
        Log.i(tag, "setAlias==:" + alias);
    }

private final Handler mHandler = new Handler() {
        @Override
        public void handleMessage(android.os.Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case MSG_SET_ALIAS:
                    Log.d(tag, "设置别名的handler.");
                    // 调用 JPush 接口来设置别名。
                    JPushInterface.setAliasAndTags(getApplicationContext(),
                            (String) msg.obj, null, mAliasCallback);
                    break;
                default:
                    Log.i(tag, "Unhandled msg - " + msg.what);
            }
        }
    };

 private final TagAliasCallback mAliasCallback = new TagAliasCallback() {
        @Override
        public void gotResult(int code, String alias, Set<String> tags) {
            String logs;
            switch (code) {
                case 0:
                    logs = "别名设置成功";
                    Log.i(tag, logs);
                    // 建议这里往 SharePreference 里写一个成功设置的状态。成功设置一次后,以后不必再次设置了。
                    //记录一下已经设置过别名了
                    HSZUtils.setBoolean(mContext, "alias_flag", true);
                    break;
                case 6002:
                    logs = "别名设置失败,延迟60s重新设置";
                    Log.i(tag, logs);
                    // 延迟 60 秒来调用 Handler 设置别名
                    mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_SET_ALIAS, HSZUtils.getString(mContext, ConstantUtils.ALIAS, "")), 1000 * 60);
                    break;
                default:
                    logs = "其他错误 ==: " + code;
                    Log.e(tag, logs);
            }
        }
    };

标签的设置
 Set<String> sets = new HashSet<>();
        sets.add("sport");//运行第二个模拟器上时把这个注掉
        sets.add("game");
//        sets.add("music");//运行第二个模拟器上时把这个打开

        JPushInterface.setTags(this, sets, new TagAliasCallback() {
            @Override
            public void gotResult(int i, String s, Set<String> set) {
                Log.d("alias", "set tag result is" + i);
            }
        });



添加完后,在推送的时候可以根据标签和别名指定推送























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值