极光官网:www.jpush.cn
官方指南:http://docs.jpush.io/guideline/android_guide/
地址:http://docs.jpush.io/resources/#android-sdk
选择你需要的进行下载,并导入到的项目中。
依照如下形式在清单文件中添加代码,并把包名和Appkey换成自己的包名。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="包名"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="14" />
<permission
android:name="包名.permission.JPUSH_MESSAGE"
android:protectionLevel="signature" />
<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.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<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:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:name="包名.MyApplication"
android:theme="@style/AppTheme" >
<activity
android:name="你的Activity"
android:launchMode="singleTask"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
intent-filter>
activity>
<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="包名" />
intent-filter>
activity>
<service
android:name="cn.jpush.android.service.DownloadService"
android:enabled="true"
android:exported="false" >
service>
<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>
<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>
<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="cn.jpush.android.service.AlarmReceiver" />
<receiver
android:name="你的自定义MyReceiver"
android:enabled="true">
<intent-filter>
<action android:name="cn.jpush.android.intent.REGISTRATION" />
<action android:name="cn.jpush.android.intent.UNREGISTRATION" />
<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" />
<action android:name="cn.jpush.android.intent.CONNECTION" />
<action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED"/>
<action android:name="cn.jpush.android.intent.ACTION_RICHPUSH_CALLBACK" />
<category android:name="包名" />
intent-filter>
receiver>
<meta-data android:name="JPUSH_CHANNEL" android:value="developer-default"/>
<meta-data android:name="JPUSH_APPKEY" android:value="XXX 你的AppKey XXX" />
application>
manifest>
自定义application
import cn.jpush.android.api.JPushInterface;
import android.app.Application;
/**
* @author yangshuai
* @version 创建时间:2015-4-13 上午10:16:44
* 类说明 :自定义application
*/
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
JPushInterface.setDebugMode(true);//设置显示调试
JPushInterface.init(this);//初始化API
}
}
停止推送代码:
JPushInterface.stopPush(getApplicationContext());
恢复推送代码:
JPushInterface.resumePush(getApplicationContext());
/**
* @author yangshuai
* @version 创建时间:2015-4-13 上午10:07:10
* 类说明 :自定义Receive接受推送
*/
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context arg0, Intent arg1) {
Bundle bundle = arg1.getExtras();
// 消息标题,对应 API 消息内容的 title 字段,Portal 推送消息界上不作展示
if (bundle.containsKey(JPushInterface.EXTRA_TITLE)) {
String titleString = bundle.getString(JPushInterface.EXTRA_TITLE);
}
// 附加字段,是个 JSON 字符串,对应 API 消息内容的 extras 字段.
// 对应 Portal推送消息界面上的“可选设置”里的附加字段
if (bundle.containsKey(JPushInterface.EXTRA_EXTRA)) {
String extrasString = bundle.getString(JPushInterface.EXTRA_EXTRA);
}
// 内容类型,对应 API 消息内容的 content_type 字段
if (bundle.containsKey(JPushInterface.EXTRA_CONTENT_TYPE)) {
String typeString = bundle
.getString(JPushInterface.EXTRA_CONTENT_TYPE);
}
// 唯一标识消息的 ID, 可用于上报统计等。
if (bundle.containsKey(JPushInterface.EXTRA_MSG_ID)) {
String msgIdString = bundle.getString(JPushInterface.EXTRA_MSG_ID);
}
/**
* 对action行为的判断
*/
if (JPushInterface.ACTION_REGISTRATION_ID.equals(arg1.getAction())) {
// SDK 向 JPush Server 注册所得到的注册 全局唯一的 ID ,可以通过此 ID 向对应的客户端发送消息和通知。
String registrationIdString = bundle
.getString(JPushInterface.EXTRA_REGISTRATION_ID);
} else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(arg1
.getAction())) {
System.out.println("收到了自定义消息。消息内容是:"
+ bundle.getString(JPushInterface.EXTRA_MESSAGE));
// 自定义消息不会展示在通知栏,完全要开发者写代码去处理
// 消息内容,对应 API 消息内容的 message 字段,对应 Portal 推送消息界面上的"自定义消息内容”字段
if (bundle.containsKey(JPushInterface.EXTRA_MESSAGE)) {
String messageString = bundle
.getString(JPushInterface.EXTRA_MESSAGE);
}
processCustomMessage(arg0, bundle);//传送内容到主界面上
} else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(arg1
.getAction())) {
System.out.println("收到了通知");
// 在这里可以做些统计,或者做些其他工作
// 通知的标题,对应 API 通知内容的 n_title 字段,对应 Portal 推送通知界面上的“通知标题”字段
String notificationTileString = bundle
.getString(JPushInterface.EXTRA_NOTIFICATION_TITLE);
// 通知内容,对应 API 通知内容的 n_content 字段,对应 Portal 推送通知界面上的“通知内容”字段
String alertString = bundle.getString(JPushInterface.EXTRA_ALERT);
// 通知栏的Notification ID,可以用于清除Notification
int notificationId = bundle
.getInt(JPushInterface.EXTRA_NOTIFICATION_ID);
} else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(arg1
.getAction())) {
System.out.println("用户点击打开了通知");
// 在这里可以自己写代码去定义用户点击后的行为
Toast.makeText(arg0, "你表点人家啦。。。。", Toast.LENGTH_SHORT).show();
JPushInterface.reportNotificationOpened(arg0,
bundle.getString(JPushInterface.EXTRA_MSG_ID));// 用于上报用户的通知栏被打开
} else if (JPushInterface.ACTION_CONNECTION_CHANGE.equals(arg1
.getAction())) {// 网络断开,连接
boolean connected = arg1.getBooleanExtra(
JPushInterface.EXTRA_CONNECTION_CHANGE, false);
// Toast.makeText(arg0, "网络连接" + connected,
// Toast.LENGTH_SHORT).show();
} else if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(arg1
.getAction())) {
// 接受富推送
// 富文本页面 Javascript 回调API,获取参数参数 ”params“
if (bundle.containsKey(JPushInterface.EXTRA_EXTRA)) {
String params = arg1.getStringExtra(JPushInterface.EXTRA_EXTRA);
}
// 富媒体通消息推送下载后的文件路径和文件名。
if (bundle.containsKey(JPushInterface.EXTRA_RICHPUSH_FILE_PATH)) {
String filePathString = bundle
.getString(JPushInterface.EXTRA_RICHPUSH_FILE_PATH);
}
// 富媒体通知推送下载的HTML的文件路径,用于展现WebView。
if (bundle.containsKey(JPushInterface.EXTRA_RICHPUSH_HTML_PATH)) {
String fileHtmlPath = bundle
.getString(JPushInterface.EXTRA_RICHPUSH_HTML_PATH);
}
// 富媒体通知推送下载的图片资源的文件名,多个文件名用 “,” 分开,路径为 fileHtmlPath
if (bundle.containsKey(JPushInterface.EXTRA_RICHPUSH_HTML_RES)) {
String fileImageStr = bundle
.getString(JPushInterface.EXTRA_RICHPUSH_HTML_RES);
String[] fileNames = fileImageStr.split(",");
}
} else {
Log.d("其它的action行为", "Unhandled intent - " + arg1.getAction());
}
}
// send msg to MainActivity
private void processCustomMessage(Context context, Bundle bundle) {
if (MainActivity.isForeground) {
String message = bundle.getString(JPushInterface.EXTRA_MESSAGE);
String extras = bundle.getString(JPushInterface.EXTRA_EXTRA);
Intent msgIntent = new Intent(MainActivity.MESSAGE_RECEIVED_ACTION);
msgIntent.putExtra(MainActivity.KEY_MESSAGE, message);
if (!MyUtil.isEmpty(extras)) {
try {
JSONObject extraJson = new JSONObject(extras);
if (null != extraJson && extraJson.length() > 0) {
msgIntent.putExtra(MainActivity.KEY_EXTRAS, extras);
}
} catch (JSONException e) {
}
}
context.sendBroadcast(msgIntent);
}
}
// 打印所有的 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("\nkey:" + key + ", value:" + bundle.getInt(key));
} else if (key.equals(JPushInterface.EXTRA_CONNECTION_CHANGE)) {
sb.append("\nkey:" + key + ", value:" + bundle.getBoolean(key));
} else {
sb.append("\nkey:" + key + ", value:" + bundle.getString(key));
}
}
return sb.toString();
}
}
公共类,所有的主要方法都在里面,调用即可:
/**
* @author yangshuai
* @version 创建时间:2015-4-13 下午4:19:06 类说明 :工具类
*/
public class MyUtil {
/**
* 同时设置别名与标签
*
* @param context
* @param alias
* 为null时不设置此值,"" (空字符串)表示取消之前的设置,字母(区分大小写)、数字、下划线、汉字,长度限制为 40
* 字节。(判断长度需采用UTF-8编码)
* @param tags
* 为null时不设置此值,空数组或列表表示取消之前的设置,字母(区分大小写)、数字、下划线、汉字,长度限制为 40
* 字节,最多支持设置 100 个 tag,但总长度不得超过1K字节。(判断长度需采用UTF-8编码)
* @param callback
* 在 TagAliasCallback 的 gotResult 方法,返回对应的参数 alias,
* tags。并返回对应的状态码:0为成功
*
* @描述 每次调用设置有效的别名,覆盖之前的设置。
*/
public static void setAliasAndTags(Context context, String alias,
Set tags, TagAliasCallback callback) {
JPushInterface.setAliasAndTags(context, alias, tags, callback);
}
/**
* 设置别名
*
* @param context
* @param alias
* "" (空字符串)表示取消之前的设置,字母(区分大小写)、数字、下划线、汉字
* @param callback
* 在TagAliasCallback 的 gotResult 方法,返回对应的参数 alias,
* tags。并返回对应的状态码:0为成功
* @描述:每次调用设置有效的别名,覆盖之前的设置。alias 命名长度限制为 40 字节。(判断长度需采用UTF-8编码)
*
*/
public static void setAlias(Context context, String alias,
TagAliasCallback callback) {
JPushInterface.setAlias(context, alias, callback);
}
/**
* 设置标签
*
* @param context
* @param tags
* 空数组或列表表示取消之前的设置,字母(区分大小写)、数字、下划线、汉字
* @param callback
* 在 TagAliasCallback 的 gotResult 方法,返回对应的参数 alias,
* tags。并返回对应的状态码:0为成功
* @描述: 每次调用至少设置一个 tag,覆盖之前的设置,不是新增.每个 tag 命名长度限制为 40 字节,最多支持设置 100 个
* tag,但总长度不得超过1K字节。(判断长度需采用UTF-8编码).单个设备最多支持设置 100 个 tag。App 全局 tag
* 数量无限制。
*/
public static void setTags(Context context, Set tags,
TagAliasCallback callback) {
JPushInterface.setTags(context, tags, callback);
}
/**
* 滤掉无效的 tags
* @param tags
* @return 有效的 tag 集合。
*/
public static Set filterValidTags(Set tags){
return JPushInterface.filterValidTags(tags);
}
/**
* 设置推送时间
*
* @param context
* ApplicationContext
* @param startHour
* int startHour 允许推送的开始时间 (24小时制:startHour的范围为0到23)
* @param endHour
* int endHour 允许推送的结束时间 (24小时制:endHour的范围为0到23)
* @param integers
* 0表示星期天,1表示星期一,以此类推。
* (7天制,Set集合里面的int范围为0到6),set的值为null,则任何时间都可以收到消息和通知
* ,set的size为0,则表示任何时间都收不到消息和通知.
*/
public static void setPushTime(Context context, int startHour, int endHour,
Integer... integers) {
// 设置推送时间
Set daysIntegers = new HashSet();
if (integers == null) {
daysIntegers = null;
} else {
for (int i = 0; i < integers.length; i++) {
daysIntegers.add(integers[i]);
}
}
JPushInterface.setPushTime(context, daysIntegers, startHour, endHour);
}
/**
* 设置通知静默时间段
*
* @param context
* ApplicationContext
* @param startHour
* int startHour 静音时段的开始时间 - 小时 (24小时制,范围:0~23 )
* @param startMinute
* int startMinute 静音时段的开始时间 - 分钟(范围:0~59 )
* @param endHour
* int endHour 静音时段的结束时间 - 小时 (24小时制,范围:0~23 )
* @param endMinute
* int endMinute 静音时段的结束时间 - 分钟(范围:0~59 )
*/
public static void setSilenceTime(Context context, int startHour,
int startMinute, int endHour, int endMinute) {
JPushInterface.setSilenceTime(context, startHour, startMinute, endHour,
endMinute);
}
public static class CustomNotificationBuilder {
private Context context;
private int number;
private int layoutId;
private int iconTipId = -1;
private int iconShowId = -1;
private int notificationFlags = -1;
private int notificationDefaults = 0;
/**
*
* @param context
* Context
*/
public CustomNotificationBuilder(Context context) {
super();
this.context = context;
}
/**
* 设置编号
*
* @param number
* 编号
* @return
*/
public CustomNotificationBuilder setNumber(int number) {
this.number = number;
return this;
}
/**
* 设置通知栏显示布局
*
* @param layoutId
* 布局id
* @return
*/
public CustomNotificationBuilder setLayout(int layoutId) {
this.layoutId = layoutId;
return this;
}
/**
* 设置最顶层状态栏小图标
*
* @param iconTipId
* 图片id
* @return
*/
public CustomNotificationBuilder setIconTip(int iconTipId) {
this.iconTipId = iconTipId;
return this;
}
/**
* 设置下拉状态栏时显示的通知图标
*
* @param iconShowId
* 图片id
* @return
*/
public CustomNotificationBuilder setIconShow(int iconShowId) {
this.iconShowId = iconShowId;
return this;
}
/**
* 设置行为
*
* @param flags
* 例如 Notification.FLAG_AUTO_CANCEL; 自动消失
* @return
*/
public CustomNotificationBuilder setFlags(int flags) {
this.notificationFlags = flags;
return this;
}
/**
* 设置铃声,震动,提示灯
*
* @param defaults
* 铃声 Notification.DEFAULT_SOUND; 震动
* Notification.DEFAULT_VIBRATE ; 提示灯
* Notification.DEFAULT_LIGHTS
* @return
*/
public CustomNotificationBuilder setDefaults(int... defaults) {
for (int i = 0; i < defaults.length; i++) {
notificationDefaults |= defaults[i];
}
return this;
}
public void init() {
// 指定定制的 Notification Layout
CustomPushNotificationBuilder builder = new CustomPushNotificationBuilder(
context, layoutId, R.id.custom_push_notification_icon,
R.id.custom_push_notification_title,
R.id.custom_push_notification_text);
if (iconTipId != -1) {
// 指定最顶层状态栏小图标
builder.statusBarDrawable = iconTipId;
}
if (iconShowId != -1) {
// 指定下拉状态栏时显示的通知图标
builder.layoutIconDrawable = iconShowId;
}
// 设置行为
if (notificationFlags != -1) {
builder.notificationFlags = notificationFlags;
}
// 设置铃声,震动,提示灯。
if (notificationDefaults != 0) {
builder.notificationDefaults = notificationDefaults;
}
JPushInterface.setPushNotificationBuilder(number, builder);
}
}
/**
* 自定义通知栏
*
* @param context
* @param number
* 编号
* @param layoutId
* 布局Id
* @param iconTipId
* 指定最顶层状态栏小图标
* @param iconShowId
* 指定下拉状态栏时显示的通知图标
* @param flags
* 设置行为
* @param defaults
* 设置铃声,震动,提示灯
*
* @params flags 例如 Notification.FLAG_AUTO_CANCEL; 自动消失
* @params defaults 铃声 Notification.DEFAULT_SOUND; 震动
* Notification.DEFAULT_VIBRATE ; 提示灯 Notification.DEFAULT_LIGHTS
*/
public static void initCustomPushNotificationBuilder(Context context,
int number, int layoutId, int iconTipId, int iconShowId, int flags,
int... defaults) {
CustomNotificationBuilder builder = new CustomNotificationBuilder(
context);
builder.setLayout(layoutId);
builder.setIconTip(iconTipId);
builder.setIconShow(iconShowId);
builder.setNumber(number);
builder.setFlags(flags);
builder.setDefaults(defaults);
builder.init();
}
/**
* 自定义通知栏
*
* @param context
* @param number
* 编号
* @param layoutId
* 布局Id
* @param iconTipId
* 指定最顶层状态栏小图标
* @param iconShowId
* 指定下拉状态栏时显示的通知图标
*/
public static void customPushNotification(Context context, int number,
int layoutId, int iconTipId, int iconShowId) {
// 指定定制的 Notification Layout
CustomPushNotificationBuilder builder = new CustomPushNotificationBuilder(
context, layoutId, R.id.custom_push_notification_icon,
R.id.custom_push_notification_title,
R.id.custom_push_notification_text);
// 指定最顶层状态栏小图标
builder.statusBarDrawable = iconTipId;
// 指定下拉状态栏时显示的通知图标
builder.layoutIconDrawable = iconShowId;
JPushInterface.setPushNotificationBuilder(number, builder);
}
/**
* 自定义通知栏
*
* @param context
* @param number
* 编号
* @param layoutId
* 布局Id
*/
public static void customPushNotification(Context context, int number,
int layoutId) {
// 指定定制的 Notification Layout
CustomPushNotificationBuilder builder = new CustomPushNotificationBuilder(
context, layoutId, R.id.custom_push_notification_icon,
R.id.custom_push_notification_title,
R.id.custom_push_notification_text);
// 指定最顶层状态栏小图标
builder.statusBarDrawable = R.drawable.ic_launcher;
// 指定下拉状态栏时显示的通知图标
builder.layoutIconDrawable = R.drawable.ic_launcher;
JPushInterface.setPushNotificationBuilder(number, builder);
}
/**
* 设置保留最近通知条数
*
* @param context
* @param maxNum
* 最多显示的条数
*/
public static void setLatestNotificationNumber(Context context, int maxNum) {
JPushInterface.setLatestNotificationNumber(context, maxNum);
}
/**
* 本地通知工具帮助类
*
* @author yangshuai
*
*/
public static class localNotificationBuilder {
private Context context;
private JPushLocalNotification ln = new JPushLocalNotification();
/**
* getApplicationContext
*
* @param context
*/
public localNotificationBuilder(Context context) {
this.context = context;
}
/**
* 设置编号
*
* @param number
* @return
*/
public localNotificationBuilder setBuilderId(long number) {
ln.setBuilderId(number);
return this;
}
/**
* 设置标题
*
* @param title
* @return
*/
public localNotificationBuilder setTitle(String title) {
ln.setTitle(title);
return this;
}
/**
* 设置内容
*
* @param content
* @return
*/
public localNotificationBuilder setContent(String content) {
ln.setContent(content);
return this;
}
/**
* 设置额外的数据信息extras为json字符串
*
* @param extras
* Map
* @return
*/
public localNotificationBuilder setExtras(Map extras) {
JSONObject json = new JSONObject(extras);
ln.setExtras(json.toString());
return this;
}
/**
* 设置本地通知触发时间
*
* @param broadCastTime
* long
* @return
*/
public localNotificationBuilder setBroadcastTime(long broadCastTime) {
ln.setBroadcastTime(broadCastTime);
return this;
}
/**
* 设置本地通知触发时间
*
* @param date
* Date
* @return
*/
public localNotificationBuilder setBroadcastTime(Date date) {
ln.setBroadcastTime(date);
return this;
}
public localNotificationBuilder setBroadcastTime(int year, int month,
int day, int hour, int minute, int second) {
ln.setBroadcastTime(year, month, day, hour, minute, second);
return this;
}
/**
* 设置本地通知的ID
*
* @param notificationId
* @return
*/
public localNotificationBuilder setNotificationId(long notificationId) {
ln.setNotificationId(notificationId);
return this;
}
public void create() {
JPushInterface.addLocalNotification(context, ln);
}
}
/**
* 显示本地通知
*
* @param context
* @param number
* @param title
* @param content
* @param notificationId
* @param time
*/
public static void showLocalNotification(Context context, long number,
String title, String content, long notificationId, long time) {
MyUtil.localNotificationBuilder builder = new localNotificationBuilder(
context);
builder.setBuilderId(number);
builder.setContent(content);
builder.setTitle(title);
builder.setNotificationId(notificationId);
builder.setBroadcastTime(time);
builder.create();
}
/**
* 清除所有的通知
*
* @param context
* ApplicationContext
*/
public static void clearAllNotifications(Context context) {
JPushInterface.clearAllNotifications(context);
}
/**
* 清除指定Id的通知
*
* @param context
* ApplicationContext
* @param notificationId
* 通知ID
*/
public static void clearNotificationById(Context context, int notificationId) {
JPushInterface.clearNotificationById(context, notificationId);
}
public static final String KEY_APP_KEY = "JPUSH_APPKEY";
public static boolean isEmpty(String s) {
if (null == s)
return true;
if (s.length() == 0)
return true;
if (s.trim().length() == 0)
return true;
return false;
}
// 校验Tag Alias 只能是数字,英文字母和中文
public static boolean isValidTagAndAlias(String s) {
Pattern p = Pattern.compile("^[\u4E00-\u9FA50-9a-zA-Z_-]{0,}$");
Matcher m = p.matcher(s);
return m.matches();
}
// 取得AppKey
public static String getAppKey(Context context) {
Bundle metaData = null;
String appKey = null;
try {
ApplicationInfo ai = context.getPackageManager()
.getApplicationInfo(context.getPackageName(),
PackageManager.GET_META_DATA);
if (null != ai)
metaData = ai.metaData;
if (null != metaData) {
appKey = metaData.getString(KEY_APP_KEY);
if ((null == appKey) || appKey.length() != 24) {
appKey = null;
}
}
} catch (NameNotFoundException e) {
}
return appKey;
}
// 取得版本号
public static String GetVersion(Context context) {
try {
PackageInfo manager = context.getPackageManager().getPackageInfo(
context.getPackageName(), 0);
return manager.versionName;
} catch (NameNotFoundException e) {
return "Unknown";
}
}
public static void showToast(final String toast, final Context context) {
new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare();
Toast.makeText(context, toast, Toast.LENGTH_SHORT).show();
Looper.loop();
}
}).start();
}
public static boolean isConnected(Context context) {
ConnectivityManager conn = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = conn.getActiveNetworkInfo();
return (info != null && info.isConnected());
}
}
在你的html中调用如下功能函数:
1
JPushWeb.close();//关闭当前页
2
JPushWeb.startMainActivity(String params)//打开主Activity
在HTML中调用此函数后,会打开程序的主Activity, 并在对应的 Intent 传入参数 ”params“ ,Key 为 JPushInterface.EXTRA_EXTRA。
对应 Activity 获取 params 示例代码:
Intent intent = getIntent();
if (null != intent ) {
String params = intent.getStringExtra(JPushInterface.EXTRA_EXTRA);
}
3
JPushWeb.triggerNativeAction(String params)//触发App里执行动作
在HTML中调用此函数后,会以广播的形式传递 ”params“ 到应用程序并触发客户端动作,对应的receiver:
<receiver android:name="MyReceiver">
................
<intent-filter>
<action android:name="cn.jpush.android.intent.ACTION_RICHPUSH_CALLBACK" />
<category android:name="包名" />
</intent-filter>
</receiver>
获取:
if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(intent.getAction())) {
Log.d(TAG, "用户收到到RICH PUSH CALLBACK: " + bundle.getString(JPushInterface.EXTRA_EXTRA));
//在这里根据 JPushInterface.EXTRA_EXTRA 的内容触发客户端动作,比如打开新的Activity 、打开一个网页等.
}
html代码示例引用官方的:
<html>
<head>
<title>JPush Webview Testtitle>
<script>
function clickButton() {
JPushWeb.close();
}
function openUrl() {
var json = "{'action':'open', 'url':'www.jpush.cn'}";
JPushWeb.triggerNativeAction(json);
JPushWeb.close(); //客服端在广播中收到json 后,可以打开对应的URL。
}
script>
head>
<body>
<button onclick="javascript:clickButton(this);return false;">Closebutton>
<button onclick="javascript:JPushWeb.startMainActivity('test - startMainActivity');return false;">StartMainActivitybutton>
<button onclick="javascript:JPushWeb.triggerNativeAction('test - triggerNativeAction');Javascript:JPushWeb.close();">triggerNativeAction and Close current webwiewbutton>
<button onclick="javascript:JPushWeb.startActivityByName('com.example.jpushdemo.TestActivity','test - startActivityByName');">startActivityByNamebutton>
<button onclick="javascript:openUrl();">open a urlbutton>
body>
html>
首先是自定的通知栏布局R.layout.customer_notitfication_layout_one:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >
<ImageView
android:id="@+id/custom_push_notification_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical" >
<TextView
android:id="@+id/custom_push_notification_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#A4C638"
android:textSize="20sp" />
<TextView
android:id="@+id/custom_push_notification_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FFB6FF"
android:textSize="20sp" />
LinearLayout>
LinearLayout>
主布局是两个按钮和一个文本框显示接受到的自定义消息,这里就不贴代码了。
Activity中的代码主要用于接受自定义消息、发送本地通知、清楚本地通知、自定义通知栏:
public class MainActivity extends Activity implements
android.view.View.OnClickListener {
private EditText messageTv;
public static boolean isForeground;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyUtil.initCustomPushNotificationBuilder(this, 1,
R.layout.customer_notitfication_layout_one,
R.drawable.tip_icon, R.drawable.show_icon,
Notification.FLAG_AUTO_CANCEL, Notification.DEFAULT_SOUND,
Notification.DEFAULT_LIGHTS);// 自定义编号1的通知栏
((Button) findViewById(R.id.local_alert_btn)).setOnClickListener(this);
((Button) findViewById(R.id.local_alert_clear_btn))
.setOnClickListener(this);
messageTv = ((EditText) findViewById(R.id.messageString));
registerMessageReceiver();// 初始化从Receiver接受自定义消息
}
/**
* 重写onResume()和onPause()用于统计分析 API
*/
// /
@Override
protected void onResume() {
super.onResume();
isForeground = true;
JPushInterface.onResume(this);
}
@Override
protected void onPause() {
super.onPause();
isForeground = false;
JPushInterface.onPause(this);
}
// //
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(mMessageReceiver);
}
@Override
public void onClick(View arg0) {
switch (arg0.getId()) {
case R.id.local_alert_btn://本地通知按钮被点击,编号为111111
MyUtil.showLocalNotification(getApplicationContext(), 1, "本地title",
"本地content哈哈", 111111,
java.lang.System.currentTimeMillis() + 10);
break;
case R.id.local_alert_clear_btn://按编号清楚本地通知
MyUtil.clearNotificationById(getApplicationContext(), 111111);
break;
default:
break;
}
}
// 从Receiver接受自定义消息
private MessageReceiver mMessageReceiver;
public static final String MESSAGE_RECEIVED_ACTION = "com.yunmo.mypushdemo.permission.JPUSH_MESSAGE";
public static final String KEY_TITLE = "title";
public static final String KEY_MESSAGE = "message";
public static final String KEY_EXTRAS = "extras";
public void registerMessageReceiver() {
mMessageReceiver = new MessageReceiver();
IntentFilter filter = new IntentFilter();
filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
filter.addAction(MESSAGE_RECEIVED_ACTION);
registerReceiver(mMessageReceiver, filter);
}
public class MessageReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(MainActivity.this, "xxxxxx", Toast.LENGTH_SHORT)
.show();
if (MESSAGE_RECEIVED_ACTION.equals(intent.getAction())) {
String messge = intent.getStringExtra(KEY_MESSAGE);
String extras = intent.getStringExtra(KEY_EXTRAS);
StringBuilder showMsg = new StringBuilder();
showMsg.append(KEY_MESSAGE + " : " + messge + "\n");
if (!MyUtil.isEmpty(extras)) {
showMsg.append(KEY_EXTRAS + " : " + extras + "\n");
}
setCostomMsg(showMsg.toString());
}
}
}
private void setCostomMsg(String msg) {
if (null != messageTv) {
messageTv.setText(msg);
Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
messageTv.setVisibility(View.VISIBLE);
}
}
}
Android极光推送demo - 下载频道 - CSDN.NET
http://download.csdn.net/detail/yang786654260/8596151