一.我采用极光推送Jpush进行消息推送,完成一定时间给应用发送消息

二.开发步骤

1.下载Jpush的SDK

2.注册用户和应用,获取APPKey和 Master Secret

3-1.将SDK的libs文件拷贝到工程libs下,并加入 build path

3-2.复制 res/ 中drawable-hdpi, layout, values文件夹中的资源文件到你的工程中 res/ 对应同名的目录

4.替换工程的清单文件为SDK的清单文件(或者配置你的AndroidManifest.xml文件步骤如下)

  • 复制备注为 "Required" 的部分
  • 将标注为“您应用的包名”的部分,替换为当前应用程序的包名
  • 将标注为“您应用的Appkey”的部分,替换为在Portal上注册该应用的的Key,例如:9fed5bcb7b9b87413678c407
  • 注册广播接收者,并在清单文件配置
  • package com.example.push;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent; public class MyReceiver extends BroadcastReceiver { @Override
    public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub
    System.out.println("我接收到广播的消息了"); } }
  • 修改前清单文件
  •  <?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>

    修改后清单文件:

  •  <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.push"
    android:versionCode="1"
    android:versionName="1.0" > <uses-sdk
    android:minSdkVersion="14"
    android:targetSdkVersion="18" />
    <!-- Required -->
    <permission
    android:name="com.example.push.permission.JPUSH_MESSAGE"
    android:protectionLevel="signature" /> <!-- Required 一些系统要求的权限,如访问网络等-->
    <uses-permission android:name="com.example.push.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.WRITE_SETTINGS" />
    <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.ACCESS_WIFI_STATE" />
    <!-- Optional for 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" /> <application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
    android:name=".MainActivity"
    android:label="@string/app_name" >
    <intent-filter>
    <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    </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.example.push" />
    </intent-filter>
    </activity> <!-- Required SDK 核心功能-->
    <!-- 可配置android:process参数将PushService放在其他进程中 -->
    <service
    android:name="cn.jpush.android.service.PushService"
    android:process=":mult"
    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 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.example.push" />
    </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.example.push.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.example.push" />
    </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="0ebc27f7f413b62274134d4a" /> <!-- </>值来自开发者平台取得的AppKey--> </application> </manifest>

    5.推送设置

  • 三.API使用:JPush SDK 提供的 API 接口,都主要集中在 cn.jpush.android.api.JPushInterface 类里
  • 1自定义Application类:MyApplication,并在onCreate(执行一次)方法中调用
    public static void init(Context context)初始化
  •  public static void setDebugMode(boolean debugEnalbed)配置调试模式
  • 代码如下:
  • package com.example.push;
    
    import android.app.Application;
    import cn.jpush.android.api.JPushInterface; public class MyApplication extends Application { @Override
    public void onCreate() {
    // TODO Auto-generated method stub
    super.onCreate();
    JPushInterface.setDebugMode(true);
    JPushInterface.init(this);
    } }

  • 2.测试确认

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

      • 在几秒内,客户端应可收到下发的通知或者正定义消息,如果 SDK 工作正常,则日志信息会如下:
    [JPushInterface] action:init
    
    .......
    
    [PushService] Login succeed!
  • 发送消息
  • 效果查看
  • 可以推送时附带信息:

  • 接收广播如下:

  • package com.example.push;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.os.Bundle;
    import android.util.Log;
    import cn.jiguang.api.JCoreInterface;
    import cn.jpush.android.api.JPushInterface; public class MyReceiver extends BroadcastReceiver { @Override
    public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub Log.e("MyReceiver", "我接收到广播的消息了");
    //获取接收到推送的消息数据
    Bundle bundle = intent.getExtras();
    String JSON = bundle.getString(JPushInterface.EXTRA_EXTRA);//得到的是服务器返回的json串,需要解析才能得到消息内容
    /*
    * {"n_builder_id":0,"ad_id":"1218881444","n_only":1,"m_content":{"n_content":"锄禾日当午,android真他妈难。","n_style":0,"n_extras":{},"ad_t":0,"n_priority":1,"n_alert_type":7,"n_title":"","n_category":"","n_flag":1},"show_type":4} - JResponse{code=0} */ Log.e("MyReceiver",JSON);
    } }
  • 清单文件里配置只在点击时发送广播,其他情况全部注释
  • 点击通知消息时运行效果:

  • 如果想应用推出后不推送消息,则可以在Activity销毁时停止服务

android消息推送(Jpush)的更多相关文章

  1. Android消息推送——JPush极光推送

    刚看了一篇关于Android消息推送评测总结的博客http://www.cnblogs.com/logan/p/4514635.html: 自己也对原学过的JPush极光进行一下小结,方便后续工作使用 ...

  2. android 消息推送

    android 消息推送 极光推送百度云推送(语音)友盟消息推送

  3. Android消息推送完美方案[转]

    转自 Android消息推送完美方案 推送功能在手机应用开发中越来越重要,已经成为手机开发的必须.在Android应用开发中,由于众所周知的原因,Android消息推送我们不得不大费周折.本文就是用来 ...

  4. Android消息推送完美方案

    转自:http://bbs.hiapk.com/thread-4652657-1-1.html 推送功能在手机应用开发中越来越重要,已经成为手机开发的必须.在Android应用开发中,由于众所周知的原 ...

  5. Android消息推送完美解决方案全析

    推送功能在手机应用开发中越来越重要,已经成为手机开发的必须.在Android应用开发中,由于众所周知的原因,Android消息推送我们不得不大费周折.本文就是用来和大家共同探讨一种Android消息推 ...

  6. 使用GCM服务(Google Cloud Messaging)实现Android消息推送

    最近在网上查了关于很多Android消息推送的资料,其中主要有四种方法. 1) 使用GCM服务(Google Cloud Messaging) 2) 使用XMPP协议(Openfire + Spark ...

  7. Android消息推送的服务端

    2.Android消息推送 MQTT服务器采用mosquito  http://mosquitto.org/ PHP管理包采用phpmqttclient:https://github.com/toku ...

  8. Android消息推送(二)--基于MQTT协议实现的推送功能

    国内的Android设备,不能稳定的使用Google GCM(Google Cloud Messageing)消息推送服务. 1. 国内的Android设备,基本上从操作系统底层开始就去掉了Googl ...

  9. apollo实现c#与android消息推送(三)

    3 实现c#消息推送服务 c#实现消息推送必须引入M2Mqtt.dll,源码 a 连接apache apollo代理服务器的代码.需要引入using uPLibrary.Networking.M2Mq ...

  10. 采用MQTT协议实现android消息推送(2)MQTT服务端与客户端软件对比、android客户端示列表

    1.服务端软件对比 https://github.com/mqtt/mqtt.github.io/wiki/servers 名称(点名进官网) 特性 简介 收费 支持的客户端语言 IBM MQ 完整的 ...

随机推荐

  1. ASP.NET Core实现强类型Configuration读取配置数据

    前言 实现读取JSON文件几种方式,在项目中采取老办法简单粗暴,结果老大过来一看,恩,这样不太可取,行吧那我就用.NET Core中最新的方式诺,切记,适合的才是最好的,切勿懒. .NET Core读 ...

  2. 使用IntelliJ IDEA开发SpringMVC网站(二)开发环境

    访问GitHub下载最新源码:https://github.com/gaussic/SpringMVCDemo 文章已针对IDEA 2016做了一定的更新,部分更新较为重要,请重新阅读文章并下载最新源 ...

  3. 前端模块化——seaJS

    1.seaJS手记 一:Bower获取 要安装bower Npm install -g bower Bower install seajs 二:Use方法是整个项目的入口方法,通常一个项目中只调用一次 ...

  4. js获取一组不重复的随机数的方法

    一.基本思路: 建立一个数组存放所有可以取到的值,每次从该数组中随机取走一个,放到新的数组中,直到完成. 二.实现方法 1.方法一: (1)创建一个数组arr,数组元素为所有可能出现元素的集合: (2 ...

  5. 【转】MyISAM和InnoDB 区别

    InnoDB和MyISAM是MySQL最常用的两个表类型,这两个表类型各有优劣,视具体应用而定.基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.MyISAM类型的表强调 ...

  6. Java IO和NIO文章目录

    1.java IO详尽解析 2.深入分析 Java I/O 的工作机制 3.InputStream类详解 4.OutputStream类详解 5.JAVA的节点流和处理流 6.FileInputStr ...

  7. 我来说说XML文件中的xmlns、xmlns:xsi和xsi:schemaLocation的具体含义

      文章摘自:https://yq.aliyun.com/articles/40353               http://www.cnblogs.com/zhao1949/p/5652167. ...

  8. 网站权限管理 之 角(jue)色管理

    公司或网站的正常运行,离不开管理员对各个员工的合理分配,那先看看权限管理中的角色管理好了: 要更改用户的角色,那么先来理一下思路: (1)用户现在是什么角色? (2)用户将要成为什么角色? (3)怎样 ...

  9. Android onclick监听事件打开新界面

    一.新建工程 二.新建XML代码 新建一个Button <Button android:layout_width="wrap_content" android:layout_ ...

  10. 2.solr学习速成之安装

    1.下载解压solr-5.3.1.tgz [root@205 opt]# tar -zxf solr-5.3.1.tgz -C /opt/module/ 2.将solr-5.3.1/server/so ...