zoukankan      html  css  js  c++  java
  • Android集成JPush极光推送

    推送原理

    参考网址:https://blog.csdn.net/huangli1466384630/article/details/79889473

    SDK下载

    https://docs.jiguang.cn/jpush/resources/

    jpush-android-3.xx-release.zip集成压缩包内容

    image.png

    手动集成

    • 解压缩jpush-android--3.xx-release.zip集成压缩包。
    • 复制libs / jcore-android-1.xxjar到工程libs /目录下。
    • 复制libs / jpush-android-3.xxjar到工程libs /目录下。
    • 复制libs /(cpu-type)/libjcore1xy.so到你的工程中存放对应cpu类型的目录下。
    • 复制res /中drawable-hdpi,layout,values文件夹中的资源文件到你的工程中res /对应同名的目录下。

    说明1:若没有res / drawable-xxxx / jpush_notification_icon这个资源默认使用应用图标作为通知图标,在5.0以上系统将应用图标作为状态栏图标可能显示不正常,用户可定义没有阴影和渐变色的图标替换这个文件,文件名不要变。

    • module的gradle配置:
    dependencies {
        implementation fileTree(dir: 'libs', include: '*.jar')
        ...
    }
    

    配置AndroidManifest.xml

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        package="com.tuobang.yxaqgl">
    
        <!-- Required -->
        <permission
            android:name="com.tuobang.yxaqgl.permission.JPUSH_MESSAGE"
            android:protectionLevel="signature" />
    
        <!-- Required -->
        <uses-permission android:name="您应用的包名.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" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.WRITE_SETTINGS" />
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    
        <!-- Optional. Required for location feature -->
        <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" />
        <application
            android:allowBackup="true"
            android:icon="@drawable/yxaq"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme"
            tools:ignore="AllowBackup,GoogleAppIndexingWarning">
            <activity android:name=".LaunchActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity android:name=".MainActivity" android:launchMode="singleTask"></activity>
            <!--  launchMode="singleTask" 点击消息时不让Activity多次创建-->
            <activity android:name=".LoadErrorActivity"></activity>
    
            <!-- Rich push 核心功能 since 2.0.6-->
            <activity
                android:name="cn.jpush.android.ui.PopWinActivity"
                android:theme="@style/MyDialogStyle"
                android:exported="false">
            </activity>
    
            <!-- Required SDK核心功能-->
            <activity
                android:name="cn.jpush.android.ui.PushActivity"
                android:configChanges="orientation|keyboardHidden"
                android:theme="@android:style/Theme.NoTitleBar"
                android:exported="false">
                <intent-filter>
                    <action android:name="cn.jpush.android.ui.PushActivity" />
                    <category android:name="android.intent.category.DEFAULT" />
                    <category android:name="com.tuobang.yxaqgl" />
                </intent-filter>
            </activity>
    
            <!-- Required SDK 核心功能-->
            <!-- 可配置android:process参数将PushService放在其他进程中 -->
            <service
                android:name="cn.jpush.android.service.PushService"
                android:process=":pushcore"
                android:exported="false">
                <intent-filter>
                    <action android:name="cn.jpush.android.intent.REGISTER" />
                    <action android:name="cn.jpush.android.intent.REPORT" />
                    <action android:name="cn.jpush.android.intent.PushService" />
                    <action android:name="cn.jpush.android.intent.PUSH_TIME" />
                </intent-filter>
            </service>
            <!-- since 3.0.9 Required SDK 核心功能-->
            <provider
                android:authorities="com.tuobang.yxaqgl.DataProvider"
                android:name="cn.jpush.android.service.DataProvider"
                android:process=":pushcore"
                android:exported="false"
                />
    
            <!-- since 1.8.0 option 可选项。用于同一设备中不同应用的JPush服务相互拉起的功能。 -->
            <!-- 若不启用该功能可删除该组件,将不拉起其他应用也不能被其他应用拉起 -->
            <service
                android:name="cn.jpush.android.service.DaemonService"
                android:enabled="true"
                android:exported="true">
                <intent-filter>
                    <action android:name="cn.jpush.android.intent.DaemonService" />
                    <category android:name="com.tuobang.yxaqgl" />
                </intent-filter>
    
            </service>
            <!-- since 3.1.0 Required SDK 核心功能-->
            <provider
                android:authorities="com.tuobang.yxaqgl.DownloadProvider"
                android:name="cn.jpush.android.service.DownloadProvider"
                android:exported="true"
                />
            <!-- Required SDK核心功能-->
            <receiver
                android:name="cn.jpush.android.service.PushReceiver"
                android:enabled="true"
                android:exported="false">
                <intent-filter android:priority="1000">
                    <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" />   <!--Required  显示通知栏 -->
                    <category android:name="com.tuobang.yxaqgl" />
                </intent-filter>
                <intent-filter>
                    <action android:name="android.intent.action.USER_PRESENT" />
                    <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                </intent-filter>
                <!-- Optional -->
                <intent-filter>
                    <action android:name="android.intent.action.PACKAGE_ADDED" />
                    <action android:name="android.intent.action.PACKAGE_REMOVED" />
    
                    <data android:scheme="package" />
                </intent-filter>
            </receiver>
    
            <!-- Required SDK核心功能-->
            <receiver android:name="cn.jpush.android.service.AlarmReceiver" android:exported="false"/>
    
            <!-- User defined.  For test only  用户自定义的广播接收器-->
            <receiver
                android:name="com.tuobang.yxaqgl.MyReceiver"
                android:exported="false"
                android:enabled="true">
                <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.CONNECTION" /><!-- 接收网络变化 连接/断开 since 1.6.3 -->
                    <category android:name="com.tuobang.yxaqgl" />
                </intent-filter>
            </receiver>
    
            <!-- Required  . Enable it you can get statistics data with channel -->
            <meta-data android:name="JPUSH_CHANNEL" android:value="developer-default"/>
            <meta-data android:name="JPUSH_APPKEY" android:value="你的AppKey" /> <!--  </>值来自开发者平台取得的AppKey-->
        </application>
    
    </manifest>
    

    MainActivity中初始化SDK

    @Override
    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            JPushInterface.setDebugMode(true);//设置调试模式
            JPushInterface.init(getApplicationContext());//init初始化SDK
    
            initView();
            //获取RegistrationID唯一标识
            String rid = JPushInterface.getRegistrationID(getApplicationContext());
            ...
        }
    

    自定义广播接收器

    package com.tuobang.yxaqgl;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.os.Bundle;
    import android.text.TextUtils;
    import org.json.JSONException;
    import org.json.JSONObject;
    import java.util.Iterator;
    import cn.jpush.android.api.JPushInterface;
    
    /**
     * 自定义接收器
     * 
     * 如果不定义这个 Receiver,则:
     * 1) 默认用户会打开主界面
     * 2) 接收不到自定义消息
     */
    public class MyReceiver extends BroadcastReceiver {
    	private static final String TAG = "JIGUANG-Example";
    
    	@Override
    	public void onReceive(Context context, Intent intent) {
    		try {
    			Bundle bundle = intent.getExtras();
    			Logger.d(TAG, "[MyReceiver] onReceive - " + intent.getAction() + ", extras: " + printBundle(bundle));
    
    			if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) {
    				String regId = bundle.getString(JPushInterface.EXTRA_REGISTRATION_ID);
    				Logger.d(TAG, "[MyReceiver] 接收Registration Id : " + regId);
    				//send the Registration Id to your server...
    
    			} else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) {
    				Logger.d(TAG, "[MyReceiver] 接收到推送下来的自定义消息: " + bundle.getString(JPushInterface.EXTRA_MESSAGE));
    
    			} else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) {
    				Logger.d(TAG, "[MyReceiver] 接收到推送下来的通知");
    				int notifactionId = bundle.getInt(JPushInterface.EXTRA_NOTIFICATION_ID);
    				Logger.d(TAG, "[MyReceiver] 接收到推送下来的通知的ID: " + notifactionId);
    
    			} else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {
    				Logger.d(TAG, "[MyReceiver] 用户点击打开了通知");
                    //在这里做点击事件的处理
                    // 打开MainActivity,应用在后台时,会唤起至前台
            	    Intent i = new Intent(context, MainActivity.class);
            	    i.putExtras(bundle);
            	    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            	    context.startActivity(i)
    
    			} else if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(intent.getAction())) {
    				Logger.d(TAG, "[MyReceiver] 用户收到到RICH PUSH CALLBACK: " + bundle.getString(JPushInterface.EXTRA_EXTRA));
    				//在这里根据 JPushInterface.EXTRA_EXTRA 的内容处理代码,比如打开新的Activity, 打开一个网页等..
    
    			} else if(JPushInterface.ACTION_CONNECTION_CHANGE.equals(intent.getAction())) {
    				boolean connected = intent.getBooleanExtra(JPushInterface.EXTRA_CONNECTION_CHANGE, false);
    				Logger.w(TAG, "[MyReceiver]" + intent.getAction() +" connected state change to "+connected);
    			} else {
    				Logger.d(TAG, "[MyReceiver] Unhandled intent - " + intent.getAction());
    			}
    		} catch (Exception e){
    
    		}
    
    	}
    
    	// 打印所有的 intent extra 数据
    	private static String printBundle(Bundle bundle) {
    		StringBuilder sb = new StringBuilder();
    		for (String key : bundle.keySet()) {
    			if (key.equals(JPushInterface.EXTRA_NOTIFICATION_ID)) {
    				sb.append("
    key:" + key + ", value:" + bundle.getInt(key));
    			}else if(key.equals(JPushInterface.EXTRA_CONNECTION_CHANGE)){
    				sb.append("
    key:" + key + ", value:" + bundle.getBoolean(key));
    			} else if (key.equals(JPushInterface.EXTRA_EXTRA)) {
    				if (TextUtils.isEmpty(bundle.getString(JPushInterface.EXTRA_EXTRA))) {
    					Logger.i(TAG, "This message has no Extra data");
    					continue;
    				}
    
    				try {
    					JSONObject json = new JSONObject(bundle.getString(JPushInterface.EXTRA_EXTRA));
    					Iterator<String> it =  json.keys();
    
    					while (it.hasNext()) {
    						String myKey = it.next();
    						sb.append("
    key:" + key + ", value: [" +
    								myKey + " - " +json.optString(myKey) + "]");
    					}
    				} catch (JSONException e) {
    					Logger.e(TAG, "Get message extra JSON error!");
    				}
    
    			} else {
    				sb.append("
    key:" + key + ", value:" + bundle.get(key));
    			}
    		}
    		return sb.toString();
    	}
    }
    

    测试

    image.png

    在这里插入图片描述

    下一篇:JAVA集成JPush(https://www.cnblogs.com/maggieq8324/p/11414823.html)

  • 相关阅读:
    记第一次重装系统
    数值运算_第1周
    更新驱动时显示失败,错误代码56
    Tomcat安装教程及常见错误解决方法
    中国学术界之特点
    Mac 安装qtbingdings出现error 解决方式
    关于xtea加密解密算法
    关于消息认证码
    2、关于协议数据包的设计
    关于协议标识符的实现方法
  • 原文地址:https://www.cnblogs.com/maggieq8324/p/11414945.html
Copyright © 2011-2022 走看看