精华内容
下载资源
问答
  • Android 极光推送

    千次阅读 2017-04-05 21:23:21
    Android 极光推送 效果图 Android SDK 概述 Android 常见问题Android 客户端 SDK 下载 JPush Android 开发者集成 JPush Android SDK 到其应用里,JPush Android SDK 创建到 JPush Cloud 的长连接,为 App ...
    Android 极光推送
    效果图

    极光推送步骤:
    1.首先需要打开极光推送官网:点击打开链接 注册账号并登陆
    2.在主页选择SDK下载(如果嫌麻烦可以参考下文中的jcenter 自动集成步骤)
    3.在主类MainActivity中onCreate方法中添加
    //如果是正式上线的APP则改为True
    JPushInterface.setDebugMode(true);
    //初始化极光推送
    JPushInterface.init(this);

    Android SDK 概述

    JPush Android

    jpush_android

    开发者集成 JPush Android SDK 到其应用里,JPush Android SDK 创建到 JPush Cloud 的长连接,为 App 提供永远在线的能力。
    当开发者想要及时地推送消息到达 App 时,只需要调用 JPush API 推送,或者使用其他方便的智能推送工具,即可轻松与用户交流。

    图中红色部分,是 JPush 与 App 开发者的接触点。手机客户端侧,App 需要集成 JPush SDK;服务器端部分,开发者调用 JPush REST API 来进行推送。

    Android SDK 服务

    JPush Android SDK 是作为 Android Service 长期运行在后台的,从而创建并保持长连接,保持永远在线的能力。

    多平台支持

    JPush Android SDK 除了 jar 包,还有一个 .so文件,.so文件需要与CPU平台适配,需要支持哪个平台的 CPU,就需要包含这个平台相应的 .so 编译文件。

    除支持默认的 ARM CPU 平台之外,JPush SDK 还提供 x86 与 MIPs 平台的 CPU 版本 SDK。请单独到 资源下载 页下载。

    电量与流量

    JPush Android SDK 由于使用自定义协议,协议体做得极致地小,流量消耗非常地小。

    电量方面,JPush Android SDK 经过持续地优化,尽可能减少不必要的代码执行;并且,长期的版本升级迭代,不断地调优,在保证一定的网络连接稳定性的要求小,减少电量消耗。

    压缩包说明

    供下载的 JPush Android SDK 压缩包,一般包含以下几个部分:

    • .jar 文件
    • .so 文件
    • AndroidManifest.xml 配置示例

    其中 .jar, .so 文件有版本号后缀,需要互相匹配。请升级时一定记得检查版本号,并删除旧版本。

    AndroidManifest.xml 配置示例可能在版本升级时,会有变更。请留意版本发布说明。

    Android SDK 集成

    请参考以下文档与教程,来集成 Android SDK。

    集成到其他平台

    客户端集成插件

    Android SDK 集成指南

    使用提示

    本文是 JPush Android SDK 标准的集成指南文档。用以指导 SDK 的使用方法,默认读者已经熟悉IDE(Eclipse 或者 Android Studio)的基本使用方法,以及具有一定的 Android 编程知识基础。

    本篇指南匹配的 JPush Android SDK 版本为:v3.0.0 及以后版本。

    • 3 分钟快速 Demo(Android):如果您想要快速地测试、感受下极光推送的效果,请参考本文在几分钟内跑通Demo。
    • 极光推送文档网站上,有极光推送相关的所有指南、API、教程等全部的文档。包括本文档的更新版本,都会及时地发布到该网站上。
    • 极光社区网站:大家除了文档之外,还有问题与疑问,会到这里来提问题,以及时地得到解答。
    • 如果您看到本文档,但还未下载Android SDK,请访问SDK下载页面下载。

    产品功能说明

    极光推送(JPush)是一个端到端的推送服务,使得服务器端消息能够及时地推送到终端用户手机上,让开发者积极地保持与用户的连接,从而提高用户活跃度、提高应用的留存率。极光推送客户端支持 Android, iOS 两个平台。

    本 Android SDK 方便开发者基于 JPush 来快捷地为 Android App 增加推送功能。

    主要功能

    • 保持与服务器的长连接,以便消息能够即时推送到达客户端
    • 接收通知与自定义消息,并向开发者App 传递相关信息

    主要特点

    • 客户端维持连接占用资源少、耗电低
    • SDK丰富的接口,可定制通知栏提示样式
    • 服务器大容量、稳定

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

    • AndroidManifest.xml
      • 客户端嵌入SDK参考的配置文件
    • libs/jcore-android.v1.x.y.jar
      • 极光开发者服务的核心包。
    • libs/jpush-android_v3.x.y.jar
      • JPush SDK 开发包。
    • libs/(cpu-type)/libjcore1xy.so
      • 各种CPU类型的native开发包。
    • res
      • 集成SDK必须添加的资源文件
    • example
      • 是一个完整的 Android 项目,通过这个演示了 JPush SDK 的基本用法,可以用来做参考。

    Android SDK 版本

    目前SDK只支持Android 2.3或以上版本的手机系统。富媒体信息流功能则需Android3.0或以上版本的系统。

    jcenter 自动集成步骤

    说明 : 使用jcenter自动集成的开发者,不需要在项目中添加jar和so,jcenter会自动完成依赖;在AndroidManifest.xml中不需要添加任何JPush SDK 相关的配置,jcenter会自动导入。

    • 如果开发者需要修改组件属性,可以在本地的 AndroidManifest 中定义同名的组件并配置想要的属性,然后用 xmlns:tools 来控制本地组件覆盖 jcenter 上的组件。示例:

      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.android.tests.flavorlib.app"
          xmlns:tools="http://schemas.android.com/tools">
      
          <application
              android:icon="@drawable/icon"
              android:name="com.example.jpushdemo.ExampleApplication"
              android:label="@string/app_name" >
      
              <service android:name="cn.jpush.android.service.PushService"
                  android:process=":multiprocess"
                  tools:node="replace" >
      
                  ……
              </service>
      
          ……
        </application>
      
        ……
      </manifest>
      
    • 确认android studio的 Project 根目录的主 gradle 中配置了jcenter支持。(新建project默认配置就支持)

      buildscript {
          repositories {
              jcenter()
          }
          ......
      }
      
      allprojects {
          repositories {
              jcenter()
          }
      }
      
    • 在 module 的 gradle 中添加依赖和AndroidManifest的替换变量。

      android {
          ......
          defaultConfig {
              applicationId "com.xxx.xxx" //JPush上注册的包名.
              ......
      
              ndk {
                  //选择要添加的对应cpu类型的.so库。 
                  abiFilters 'armeabi', 'armeabi-v7a', 'armeabi-v8a' 
                  // 还可以添加 'x86', 'x86_64', 'mips', 'mips64'
              }
      
              manifestPlaceholders = [
                  JPUSH_PKGNAME : applicationId,
                  JPUSH_APPKEY : "你的appkey", //JPush上注册的包名对应的appkey.
                  JPUSH_CHANNEL : "developer-default", //暂时填写默认值即可.
              ]
              ......
          }
          ......
      }
      
      dependencies {
          ......
      
          compile 'cn.jiguang.sdk:jpush:3.0.3'  // 此处以JPush 3.0.3 版本为例。
          compile 'cn.jiguang.sdk:jcore:1.1.1'  // 此处以JCore 1.1.1 版本为例。
          ......
      }
      

     : 如果在添加以上 abiFilter 配置之后android Studio出现以下提示:

        NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin.
    

    则在 Project 根目录的gradle.properties文件中添加:

        android.useDeprecatedNdk=true
    

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

    手动集成步骤

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

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

    说明 2:使用android studio的开发者,如果使用jniLibs文件夹导入so文件,则仅需将所有cpu类型的文件夹拷进去;如果将so文件添加在module的libs文件夹下,注意在module的gradle配置中添加一下配置:

        android {
            ......
            sourceSets {
                main {
                    jniLibs.srcDirs = ['libs']
                    ......
                }
                ......
            }
            ......
        }
    

    配置 AndroidManifest.xml

    根据 SDK 压缩包里的 AndroidManifest.xml 样例文件,来配置应用程序项目的 AndroidManifest.xml 。

    主要步骤为:

    • 复制备注为 "Required" 的部分
    • 将标注为“您应用的包名”的部分,替换为当前应用程序的包名
    • 将标注为“您应用的Appkey”的部分,替换为在Portal上注册该应用的的Key,例如:9fed5bcb7b9b87413678c407

    小帖士

    如果使用android studio, 可在AndroidManifest中引用applicationId的值,在build.gradle配置中 defaultConfig节点下配置,如:

    defaultConfig {
          applicationId "cn.jpush.example" // <--您应用的包名
          ……
     }
    
    

    在AndroidManifest中使用 ${applicationId} 引用gradle中定义的包名

    AndroidManifest 示例

    
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="您应用的包名"
        android:versionCode="303"
        android:versionName="3.0.3"
        >
        <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="23" />
    
        <!-- Required -->
        <permission 
            android:name="您应用的包名.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.WAKE_LOCK" />
        <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.VIBRATE" />
        <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" />
    
        <application
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:name="Your Application Name">
    
            <!-- Required SDK 核心功能-->
            <!-- 可配置android:process参数将PushService放在其他进程中 -->
            <service
                android:name="cn.jpush.android.service.PushService"
                android:enabled="true"
                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 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="您应用的包名"/>
                 </intent-filter>
             </service>
    
            <!-- Required SDK核心功能-->
            <receiver
                android:name="cn.jpush.android.service.PushReceiver"
                android:enabled="true" >
              <intent-filter android:priority="1000"> 
                    <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" /> 
                    <category android:name="您应用的包名"/> 
                </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核心功能-->
            <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="您应用的包名" />
                </intent-filter>
            </activity>
            <!-- SDK核心功能-->
            <activity
                android:name="cn.jpush.android.ui.PopWinActivity"
                android:configChanges="orientation|keyboardHidden"
                android:exported="false"
                android:theme="@style/MyDialogStyle">
                <intent-filter>
                    <category android:name="android.intent.category.DEFAULT" />
                    <category android:name="您应用的包名" />
                </intent-filter>
            </activity>
    
            <!-- Required SDK核心功能-->
            <service
                android:name="cn.jpush.android.service.DownloadService"
                android:enabled="true"
                android:exported="false" >
            </service>
    
            <!-- Required SDK核心功能-->
            <receiver android:name="cn.jpush.android.service.AlarmReceiver" />
    
            <!-- User defined. 用户自定义的广播接收器-->
             <receiver
                 android:name="您自己定义的Receiver"
                 android:enabled="true">
                 <intent-filter>
                     <!--Required 用户注册SDK的intent-->
                     <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 用户打开自定义通知栏的intent-->
                     <action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" /> 
                     <!-- 接收网络变化 连接/断开 since 1.6.3 -->
                     <action android:name="cn.jpush.android.intent.CONNECTION" />
                     <category android:name="您应用的包名" />
                 </intent-filter>
             </receiver>
    
            <!-- Required. For publish channel feature -->
            <!-- JPUSH_CHANNEL 是为了方便开发者统计APK分发渠道。-->
            <!-- 例如: -->
            <!-- 发到 Google Play 的APK可以设置为 google-play; -->
            <!-- 发到其他市场的 APK 可以设置为 xxx-market。 -->
            <!-- 目前这个渠道统计功能的报表还未开放。-->
            <meta-data android:name="JPUSH_CHANNEL" android:value="developer-default"/>
            <!-- Required. AppKey copied from Portal -->
            <meta-data android:name="JPUSH_APPKEY" android:value="您应用的Appkey"/> 
        </application>
    </manifest>
    

    配置和代码说明

    必须权限说明

    权限 用途
    You Package.permission.JPUSH_MESSAGE 官方定义的权限,允许应用接收JPUSH内部代码发送的广播消息。
    RECEIVE_USER_PRESENT 允许应用可以接收点亮屏幕或解锁广播。
    INTERNET 允许应用可以访问网络。
    WAKE_LOCK 允许应用在手机屏幕关闭后后台进程仍然运行
    READ_PHONE_STATE 允许应用访问手机状态。
    WRITE_EXTERNAL_STORAGE 允许应用写入外部存储。
    READ_EXTERNAL_STORAGE 允许应用读取外部存储。
    WRITE_SETTINGS 允许应用读写系统设置项。
    VIBRATE 允许应用震动。
    MOUNT_UNMOUNT_FILESYSTEMS 允许应用挂载/卸载 外部文件系统。
    ACCESS_NETWORK_STATE 允许应用获取网络信息状态,如当前的网络连接是否有效。

    集成 JPush Android SDK 的混淆

    • 请下载4.x及以上版本的proguard.jar, 并替换你Android Sdk "tools\proguard\lib\proguard.jar"

    • 请在工程的混淆文件中添加以下配置:

      -dontoptimize
      -dontpreverify
      
      -dontwarn cn.jpush.**
      -keep class cn.jpush.** { *; }
      
      -dontwarn cn.jiguang.**
      -keep class cn.jiguang.** { *; }
      
    • v2.0.5 ~ v2.1.7 版本有引入 gson 和 protobuf ,增加排除混淆的配置。(2.1.8版本不需配置)

      #==================gson && protobuf==========================
      -dontwarn com.google.**
      -keep class com.google.gson.** {*;}
      -keep class com.google.protobuf.** {*;}
      

    添加代码

    JPush SDK 提供的 API 接口,都主要集中在 cn.jpush.android.api.JPushInterface 类里。

    基础API

    • init 初始化SDK

      public static void init(Context context)
      
    • setDebugMode 设置调试模式

    注:该接口需在init接口之前调用,避免出现部分日志没打印的情况。多进程情况下建议在自定义的Application中onCreate中调用。

        // You can enable debug mode in developing state. You should close debug mode when release.
        public static void setDebugMode(boolean debugEnalbed)
    

    添加统计代码

    调用示例代码(参考 example 项目)

    • init 只需要在应用程序启动时调用一次该 API 即可。

    • 以下代码定制一个本应用程序 Application 类。需要在 AndoridManifest.xml 里配置。请参考上面 AndroidManifest.xml 片断,或者 example 项目。

      public class ExampleApplication extends Application {
      @Override
          public void onCreate() {
              super.onCreate();
              JPushInterface.setDebugMode(true);
              JPushInterface.init(this);
          }
      }
      

    测试确认

    • 确认所需的权限都已经添加。如果必须的权限未添加,日志会提示错误。
    • 确认 AppKey(在Portal上生成的)已经正确的写入 Androidmanifest.xml 。
    • 确认在程序启动时候调用了init(context) 接口
    • 确认测试手机(或者模拟器)已成功连入网络 + 客户端调用 init 后不久,如果一切正常,应有登录成功的日志信息
    • 启动应用程序,在 Portal 上向应用程序发送自定义消息或者通知栏提示。详情请参考管理Portal
      • 在几秒内,客户端应可收到下发的通知或者正定义消息,如果 SDK 工作正常,则日志信息会如下:
    [JPushInterface] action:init
    
    .......
    
    [PushService] Login succeed!
    

    如图所示,客户端启动分为 4 步:

    • 检查 metadata 的 appKey 和 channel ,如果不存在,则启动失败
    • 初始化 JPush SDK,检查 JNI 等库文件的有效性,如果库文件无效,则启动失败
    • 检查 Androidmanifest.xml,如果有 Required 的权限不存在,则启动失败
    • 连接服务器登录,如果存在网络问题,则登陆失败,或者前面三步有问题,不会启动JPush SDK

    高级功能

    请参考:

    API: Android




    展开全文
  • android 极光推送

    2016-02-19 09:02:35
    实现极光推送功能,可向多个用户推送,也可向指定用户推送
  • Android极光推送

    千次阅读 2015-11-11 00:49:53
    打开百度首页,然后搜索 --- 极光推送 然后选择打开极光推送的官方网站 打开后,先进行相关的用户名的注册 然后登录进去 在这里面,可以点击文档,然后下载开发所用的开发文档与sdk,或者开发教程视频  然后...



    一、首先做一些简单的操作



    打开百度首页,然后搜索   ---  极光推送

    然后选择打开极光推送的官方网站


    打开后,先进行相关的用户名的注册

    然后登录进去


    在这里面,可以点击文档,然后下载开发所用的开发文档与sdk,或者开发教程视频 

    然后选择控制台,在控制台中创建一个新的应用



    注意,这里添加的应用包名应与所要开发推送功能的应用的包名一致

    创建完成后,会生成一个AppKey 


    二、安卓项目中 


    首先是将jar包与.os文件引入项目中



    然后 在Application中进行相关配制 

    package com.administrator.pullrefresh;
    
    import android.app.Application;
    
    import cn.jpush.android.api.JPushInterface;
    
    public class MyApplication extends Application {
    	@Override
    	public void onCreate() {
    		super.onCreate();
    		JPushInterface.setDebugMode(true);
    		JPushInterface.init(this);
    	}
    }
    

    然后注册一个广播用来监听接收到的推送消息


    package com.administrator.pullrefresh;
    
    import android.app.NotificationManager;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.os.Bundle;
    import android.util.Log;
    
    import org.json.JSONObject;
    
    import cn.jpush.android.api.JPushInterface;
    
    
    
    public class MyBroadcastReceiver extends BroadcastReceiver {
        private static final String TAG = "MyReceiver";
        private NotificationManager nm;
         
        @Override
        public void onReceive(Context context, Intent intent) {
            if (null == nm) {
                nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
            }
             
            Bundle bundle = intent.getExtras();
    //        Log.d(TAG, "onReceive - " + intent.getAction() + ", extras: " + AndroidUtil.printBundle(bundle));
             
            if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) {
                Log.d(TAG, "JPush用户注册成功");
                 
            } else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) {
                Log.d(TAG, "接受到推送下来的自定义消息");
                         
            } else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) {
                Log.d(TAG, "接受到推送下来的通知");
         
                receivingNotification(context,bundle);
     
            } else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {
                Log.d(TAG, "用户点击打开了通知");
            
               openNotification(context,bundle);
     
            } else {
                Log.d(TAG, "Unhandled intent - " + intent.getAction());
            }
        }
     
       private void receivingNotification(Context context, Bundle bundle){
            String title = bundle.getString(JPushInterface.EXTRA_NOTIFICATION_TITLE);
            Log.d(TAG, " title : " + title);
            String message = bundle.getString(JPushInterface.EXTRA_ALERT);
            Log.d(TAG, "message : " + message);
            String extras = bundle.getString(JPushInterface.EXTRA_EXTRA);
            Log.d(TAG, "extras : " + extras);
        } 
     
       private void openNotification(Context context, Bundle bundle){
            String extras = bundle.getString(JPushInterface.EXTRA_EXTRA);
            String myValue = ""; 
            try {
            	//当前的url的值是由,极光推送的服务传递过来的,http://www.itheima.com
    //        	{
    //        		url:"http://www.itheima.com";
    //        	}
                JSONObject extrasJson = new JSONObject(extras);
                myValue = extrasJson.optString("url");
                
            } catch (Exception e) {
                Log.w(TAG, "Unexpected: extras is not a valid json", e);
                return;
            }
           /**
            * 接收到消息后要点击要跳转的页面
            * 这里是跳转到另一个Activity进行页面信息的显示
            */
            Intent mIntent = new Intent(context, ThisActivity.class);
            mIntent.putExtra("url", myValue);
            mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(mIntent);
        }
    }

    那么在信息显示页面中

    package com.administrator.pullrefresh;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.widget.Toast;
    
    public class ThisActivity extends Activity {
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.thisactivity);
    		
    		//http://www.ooxx.com/abcd.html--->WebView
    		/**
    		 * 这里接收信息
    		 * 将接收到的信息进行简单的一个显示操作
    		 */
    		String url = getIntent().getStringExtra("url");
    		Toast.makeText(getApplicationContext(), url, 1).show();
    	}
    }
    

    接下来就是配制最重要的清单文件

    <?xml version="1.0" encoding="utf-8"?>
        <manifest xmlns:android="http://schemas.android.com/apk/res/android"
                
                  package="com.administrator.pullrefresh">
        <!-- 这里的包名要与极光推送页面中创建应用的包名一至-->
            <!-- Required -->
            <permission android:name="com.administrator.pullrefresh.permission.JPUSH_MESSAGE" android:protectionLevel="signature" />
    
            <!-- Required -->
            <uses-permission android:name="com.administrator.pullrefresh.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.WAKE_LOCK" />
            <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.VIBRATE" />
            <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
            <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
            <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
            <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <!--since 1.6.0 -->
    
            <!-- Optional. Required for location feature -->
            <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
            <uses-permission android:name="android.permission.ACCESS_COARSE_UPDATES" />
            <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
            <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" />
    
            <application
                android:icon="@mipmap/ic_launcher"
                android:label="@string/app_name"
                android:name="com.administrator.pullrefresh.MyApplication">
                <activity
    
                    android:name="com.administrator.pullrefresh.MainActivity"
                    android:label="@string/app_name"
                    android:theme="@style/AppTheme" >
                    <intent-filter>
                        <action android:name="android.intent.action.MAIN" />
    
                        <category android:name="android.intent.category.LAUNCHER" />
                    </intent-filter>
                </activity>
                <activity
                    android:name="com.administrator.pullrefresh.ThisActivity"
                    android:label="@string/app_name">
                </activity>
                 Required
                <service
                    android:name="cn.jpush.android.service.PushService"
                    android:enabled="true"
                    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>
    
                <!-- Required -->
                <receiver
                    android:name="cn.jpush.android.service.PushReceiver"
                    android:enabled="true" >
                    <intent-filter android:priority="1000"> <!--since 1.3.5 -->
                        <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" /> <!--since 1.3.5 -->
                        <category android:name="com.administrator.pullrefresh" /> <!--since 1.3.5 -->
                    </intent-filter> <!--since 1.3.5 -->
                    <intent-filter>
                        <action android:name="android.intent.action.USER_PRESENT" />
                        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                    </intent-filter>
                    <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>
                <receiver
                    android:name="com.administrator.pullrefresh.MyBroadcastReceiver"
                    android:enabled="true" >
                    <intent-filter>
                        <action android:name="cn.jpush.android.intent.REGISTRATION" />
                        <action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED" />
                        <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED" />
                        <action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" />
                        <category android:name="com.administrator.pullrefresh" />
                    </intent-filter>
                </receiver>
                <!-- Required SDK核心功能-->
                <activity
                    android:name="cn.jpush.android.ui.PushActivity"
                    android:theme="@android:style/Theme.Translucent.NoTitleBar"
                    android:configChanges="orientation|keyboardHidden" >
                    <intent-filter>
                        <action android:name="cn.jpush.android.ui.PushActivity" />
                        <category android:name="android.intent.category.DEFAULT" />
                        <category android:name="com.administrator.pullrefresh" />
                    </intent-filter>
                </activity>
                <!-- Required SDK核心功能-->
                <service
                    android:name="cn.jpush.android.service.DownloadService"
                    android:enabled="true"
                    android:exported="false" >
                </service>
                <!-- Required SDK核心功能-->
                <receiver android:name="cn.jpush.android.service.AlarmReceiver" />
    
                <!-- Required. For publish channel feature -->
                <!-- JPUSH_CHANNEL 是为了方便开发者统计APK分发渠道。-->
                <!-- 例如: -->
                <!-- 发到 Google Play 的APK可以设置为 google-play; -->
                <!-- 发到其他市场的 APK 可以设置为 xxx-market。 -->
                <!-- 目前这个渠道统计功能的报表还未开放。-->
                <meta-data android:name="JPUSH_CHANNEL" android:value="developer-default"/>
                <!-- Required. AppKey copied from Portal -->
                <meta-data android:name="JPUSH_APPKEY" android:value="561ec8ebeb6e85d9e2946f53"/>
            </application>
        </manifest>
    
    


    然后就可以将项目发布到手机上进行相关测试



    三、发送消息推送,进行相关测试










    测试Demo下载地址

    http://download.csdn.net/detail/zl18603543572/9259461



    展开全文
  • Android 极光推送demo

    2018-07-30 09:25:51
    亲测成功,可以直接运行 Android 极光推送项目,亲自总结、可以收到消息、消息图标 只需要修改一下自己的包名和加官推送申请的AppKey替换就OK 实现极光推送功能,可向多个用户推送,也可向指定用户推送
  • 请问下 当前极光推送版本:'cn.jiguang.sdk:jcore:2.2.2','cn.jiguang.sdk:jpush:3.4.0' 能够收到推送(系统通知栏显示) 但是JPushReceiver(继承自JPushMessageReceiver)中的事件不回调 ,比如...等事件都不回调,升级...

    请问下 当前极光推送版本:'cn.jiguang.sdk:jcore:2.2.2','cn.jiguang.sdk:jpush:3.4.0' 能够收到推送(系统通知栏显示) 但是JPushReceiver(继承自JPushMessageReceiver)中的事件不回调 ,比如onNotifyMessageArrived、onNotifyMessageOpened...等事件都不回调,升级到最新的极光推送('cn.jiguang.sdk:jcore:2.4.2','cn.jiguang.sdk:jpush:3.7.0')后仍然无效 请问这是什么问题呢?

    每次一推送控制台显示一下错误信息:

    E/OppoNotificationManager: Notification--call isOpush error: Attempt to invoke virtual method 'java.lang.Class java.lang.Object.getClass()' on a null object reference--Notification(channel=JPush_3_7 pri=2 contentView=null vibrate=default sound=default tick defaults=0xffffffff flags=0x19 color=0x00000000 vis=PUBLIC)

    手机机型:OPPO Find X , Android10版本

    展开全文
  • Android 极光推送工程

    2018-05-24 16:15:18
    亲测成功,可以直接运行 Android 极光推送项目,亲自总结、可以收到消息、消息图标 只需要修改一下自己的包名和加官推送申请的AppKey替换就OK 实现极光推送功能,可向多个用户推送,也可向指定用户推送
  • android极光推送

    2018-07-18 14:15:39
    "接收到推送下来的自定义消息=====" +bundle.getString(JPushInterface.EXTRA_MESSAGE)); } else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) { int notification = ...
    1.注册账号
    2.添加应用,得到 AppKey,如29e2684959f57314baa4b931 
    3.设置包名,图标等信息
    4.在moudle的build.gradle文件的default中添加
     manifestPlaceholders = [
                    JPUSH_PKGNAME: 'com.example.testpush',
                    JPUSH_APPKEY : "29e2684959f57314baa4b931", //JPush上注册的包名对应的appkey(*换成你的*)
                    JPUSH_CHANNEL: "developer-default", //暂时填写默认值即可.
            ]
     并添加依赖:
     compile 'cn.jiguang:jpush:2.1.8'  // 此处以SDK 2.1.8版本为例
     5.创建Application
     public class MyApplication extends Application {
        @Override
        public void onCreate() {
            super.onCreate();
            //初始化sdk
            JPushInterface.setDebugMode(true);//正式版的时候设置false,关闭调试
            JPushInterface.init(this);
            //建议添加tag标签,发送消息的之后就可以指定tag标签来发送了
            Set<String> set = new HashSet<>();
            set.add("andfixdemo");//名字任意,可多添加几个
            JPushInterface.setTags(this, set, null);//设置标签
    
        }
    }
    6.在AndroidManifest.xml中添加
    <receiver
                android:name=".MyReceiver"
                android:enabled="true"
                android:exported="false"
                tools:node="replace">
                <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="你的包名" />
                </intent-filter>
            </receiver>
     7.广播接收
     public class MyReceiver extends BroadcastReceiver {
    
        private static final String TAG = MyReceiver.class.getSimpleName();
        public static String regId;
    
        @Override
        public void onReceive(Context context, Intent intent) {
            try {
                Bundle bundle = intent.getExtras();
                Log.e(TAG, "action===="+intent.getAction());
                Log.e(TAG, "data======"+printBundle(bundle));
    
                if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) {
                    //send the Registration Id to your server...
                    regId = bundle.getString(JPushInterface.EXTRA_REGISTRATION_ID);
                    Log.e(TAG, "Registration Id====="+regId);
    
                } else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) {
                    // 对应极光后台的 - 自定义消息  默认不会出现在notification上 所以一般都选用发送通知
                    Log.e(TAG, "接收到推送下来的自定义消息====="+bundle.getString(JPushInterface.EXTRA_MESSAGE));
    
                } else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) {
                    int notification = bundle.getInt(JPushInterface.EXTRA_NOTIFICATION_ID);
                    Log.e(TAG, "接收推送下来的通知id======"+notification);
    
                } else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {
                    Log.e(TAG, "用户点击打开了通知");
    
                    //打开自定义的Activity
                    //Intent i = new Intent(context,ContentActivity.class);
                    //i.putExtras(bundle);
                    //i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    //context.startActivity(i);
    
                } else if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(intent.getAction())) {
                    //根据JPushInterface.EXTRA_EXTRA的内容处理代码,打开新的Activity或者一个网页等
                    Log.e(TAG, "用户收到到RICH PUSH CALLBACK:====== " + bundle.getString(JPushInterface.EXTRA_EXTRA));
    
                } else if (JPushInterface.ACTION_CONNECTION_CHANGE.equals(intent.getAction())) {
                    boolean connected = intent.getBooleanExtra(JPushInterface.EXTRA_CONNECTION_CHANGE, false);
                    Log.e(TAG, "connected state change to =======" + connected);
                } else {
                    Log.e(TAG, "Unhandled intent======" + intent.getAction());
                }
    
            } catch (Exception e) {
    
            }
    
    
        }
    
        private static String printBundle(Bundle bundle) {
            StringBuilder sb = new StringBuilder();
            for (String key : bundle.keySet()) {
                if (key.equals(JPushInterface.EXTRA_NOTIFICATION_ID)) {
                    sb.append("\nkey:" + key + ", value:" + bundle.getInt(key));
                } else if (key.equals(JPushInterface.EXTRA_CONNECTION_CHANGE)) {
                    sb.append("\nkey:" + key + ", value:" + bundle.getBoolean(key));
                } else if (key.equals(JPushInterface.EXTRA_EXTRA)) {
                    if (bundle.getString(JPushInterface.EXTRA_EXTRA).isEmpty()) {
    
                        continue;
                    }
                    try {
                        JSONObject json = new JSONObject(bundle.getString(JPushInterface.EXTRA_EXTRA));
                        Iterator<String> it = json.keys();
    
                        while (it.hasNext()) {
                            String myKey = it.next().toString();
                            sb.append("\nkey:" + key + ", value: [" +
                                    myKey + " - " + json.optString(myKey) + "]");
                        }
                    } catch (JSONException e) {
                        Log.e(TAG, "Get message extra JSON error!");
                    }
    
                } else {
                    sb.append("\nkey:" + key + ", value:" + bundle.getString(key));
                }
            }
            return sb.toString();
        }
    }
    展开全文
  • Android极光推送demo

    热门讨论 2015-04-15 10:32:43
    Android极光推送demo,内有所有主要功能的自定义工具类,可直接使用。
  • 主要介绍了Android 极光推送别名与标签方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • Android极光推送之Hello World,最简化的极光推送例程。 更详细介绍,见相关博客。
  • 3.0.7版本的回调方法设置别名和标签通过回调处理返回的数据,6002是超时码,可以进行重连操作private final Handler mHandler = new Handler() {@Overridepublic void handleMessage(android.os.Message msg) {...
  • 常见问题极光推送有限制吗?极光推送对推送用户数量没有限制,但是有如下情况需要注意:推送次数通过控制台或 API 推送通知或消息,免费版本的每个 Appkey 广播的最高条数是 10 条/天。付费版本可享有更高的广播条数...
  • 我首先接入极光推送,然后才来接厂商通道, 需要先接极光推送的看我另外一边帖子,1 在根目录的build.gradlebuildscript{repositories{google()jcenter()maven{ url...
  • 初接触极光推送的使用者,为了衡量消息推送的质量。经常会纠结到消息的"送达率"这个概念.那么究竟什么是消息送达率呢?或者如何正确理解消息的送达情况呢?基本概念先来看与消息送达相关的几个基本概念:iOS 目标用户...
  • Android 极光推送别名与标签

    千次阅读 2019-04-01 16:21:22
    Android 极光推送 别名、标签、RegistrationID 说明 别名(alias) 为安装了应用程序的用户,取个别名来标识。以后给该用户 Push 消息时,就可以用此别名来指定。每个用户只能指定一个别名。 建议:对于同一个...
  • 这两天在研究推送的问题,后来确定了用极光推送,本人将整个过程整理一下:2、创建应用,按照要求填写你的应用名称,包名提交3、下载案例来玩玩,一般情况测试是能收到信息的5、集成时将注意的要点,官网上也有说,...
  • 极光推送官网 创建我们的应用,点击推送设置,点击Android填写我们项目的应用包名下载快速集成Demo1.把Demo中libs包中库导入项目libs包中,其中最后两个jar包添加小奶瓶2.把Demo中res文件夹中 drawable-hdpi 全部复制...
  • 3.0.7版本的回调方法设置别名和标签通过回调处理返回的数据,6002是超时码,可以进行重连操作private final Handler mHandler = new Handler() {@Overridepublic void handleMessage(android.os.Message msg) {...
  • c#+android 极光推送实例

    热门讨论 2014-07-23 11:39:44
    c#调用极光推送android终端发送消息的实例。 极光推送的ApiKey和APIMasterSecret请在app.config设置。
  • 极光推送调研极光接入主要功能使用总结极光接入申请极光AppKey极光接入步骤/引入jar包申请极光AppKey进入极光官网,==申请开发者账号==,创建应用。并保存 ==AppKey==AppKey:89326387481e57aa2cd576cb极光接入步骤/...
  • android极光推送Demo

    2014-04-23 17:19:12
    实现极光推送功能,可向多个用户推送,也可向指定用户推送
  • JPush SDK 小米通道集成指南概述在国内 Android 生态中,推送通道都是由终端与云端之间的长链接来维持,严重依赖于应用进程的存活状态。如今一些手机厂家会在自家 rom 中做系统级别的推送通道,再由系统分发给各个 ...
  • at android.app.LoadedApk$ReceiverDispatcher.(LoadedApk.java:928) at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:725) at android.app.ContextImpl.registerReceiverInternal(ContextImpl....
  • 最近在做webapp ,因为有推送的需求就用了极光,容易上手,为了以后方便回顾就写下笔记参考...正常打包安...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,128
精华内容 2,851
关键字:

android极光推送