android消息推送(Jpush)

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

二.开发步骤

1.下载Jpush的SDK

android消息推送(Jpush)

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

android消息推送(Jpush)

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

android消息推送(Jpush)

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

android消息推送(Jpush)

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.推送设置

  • android消息推送(Jpush)
  • 三.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);
    } }

    android消息推送(Jpush)

  • 2.测试确认

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

    可以推送时附带信息:

  • android消息推送(Jpush)

    接收广播如下:

  • 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);
    } }
  • 清单文件里配置只在点击时发送广播,其他情况全部注释
  • android消息推送(Jpush)
  • 点击通知消息时运行效果:

  • android消息推送(Jpush)

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

  • android消息推送(Jpush)
上一篇:Ardupilot设备驱动 IIC、SPI、USART


下一篇:NYOJ 118 路方案(第二小的跨越)