博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android之极光推送发送自定义消息
阅读量:4966 次
发布时间:2019-06-12

本文共 8981 字,大约阅读时间需要 29 分钟。

Android端实现主要代码:

import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;import org.json.JSONException;import org.json.JSONObject;import android.annotation.SuppressLint;import android.app.Notification;import android.app.NotificationManager;import android.app.PendingIntent;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.support.v4.app.NotificationCompat;import com.mine.xinlangapp.R;import com.mine.xinlangapp.activity.BaseActivity;import cn.jpush.android.api.JPushInterface;/** * 自定义接收器 *  * 如果不定义这个 Receiver,则: * 1) 默认用户会打开主界面 * 2) 接收不到自定义消息 */public class MyReceiver extends BroadcastReceiver {	private Bitmap bitmap = null;	private NotificationManager notifyManager = null; 	private NotificationCompat.Builder notifyBuilder = null;	private Notification notification = null;    private String url = "";	@SuppressLint("HandlerLeak")	private Handler handler = new Handler(){		@Override		public void handleMessage(Message msg){			if(bitmap!=null){				notifyBuilder.setLargeIcon(bitmap);			}else{				notifyBuilder.setSmallIcon(R.drawable.sina);			}			notification = notifyBuilder.build();			notification.defaults |= Notification.DEFAULT_SOUND;			notification.defaults |= Notification.DEFAULT_VIBRATE;			notifyManager.notify(1000, notification);		}	};	@SuppressLint("InflateParams")	@Override	public void onReceive(Context context, Intent intent) {        Bundle bundle = intent.getExtras();        /*        //  自定义样式放在init()之后.        CustomPushNotificationBuilder builder=new CustomPushNotificationBuilder(       		 context.getApplicationContext(),       		 R.layout.customer_notitfication_layout,        		 R.id.icon, R.id.title, R.id.text);        builder.layoutIconDrawable=R.drawable.menu_home;  //下拉状态时显示的通知图标.        builder.layout = R.layout.customer_notitfication_layout;        JPushInterface.setPushNotificationBuilder(2, builder);        */                if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) {        	/*        	//接收到推送下来的自定义消息,开启服务执行耗时的操作        	Intent i = new Intent(context, MyService.class);        	i.putExtras(bundle);        	context.startService(i);        	*/        	processCustomMessage(context, bundle);        }else if(JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())){        	        }else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {        	Intent i = new Intent(context, BaseActivity.class);        	bundle.putBoolean("push", true);        	i.putExtras(bundle);        	//i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);        	i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP );        	context.startActivity(i);        } 	}		private void processCustomMessage(Context context, Bundle bundle){		notifyManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);		notifyBuilder = new NotificationCompat.Builder(context);				String title = bundle.getString(JPushInterface.EXTRA_TITLE);		String message = bundle.getString(JPushInterface.EXTRA_MESSAGE);        String extras = bundle.getString(JPushInterface.EXTRA_EXTRA);        //自定义信息: 获取         if (extras != null) {              try {                  JSONObject object = new JSONObject(extras);                  url = object.optString("src");            } catch (JSONException e) {                  e.printStackTrace();              }          }      	Intent i = new Intent(context, BaseActivity.class);    	bundle.putBoolean("push", true);    	i.putExtras(bundle);    	PendingIntent pi = PendingIntent.getActivity(context, 1000, i, PendingIntent.FLAG_UPDATE_CURRENT);            	notifyBuilder.setContentTitle(title);        notifyBuilder.setContentText(message);        notifyBuilder.setContentIntent(pi);        notifyBuilder.setAutoCancel(true);        		new Thread(new Runnable() {			@Override			public void run() {				bitmap = returnBitMap(url);				handler.sendEmptyMessage(1);			}		}).start();				handler.sendEmptyMessage(1);  //这里要先发送一次,因为onReceive方法实现不可以超过10秒,获取图片是耗时的,然而Notification没有图片通知是发送不了的。	}	//以Bitmap的方式获取一张图片	public Bitmap returnBitMap(String url){		URL myFileUrl = null;		Bitmap bitmap = null;		try{			myFileUrl = new URL(url);		}catch(MalformedURLException e){			e.printStackTrace();		}		try{			HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection();			conn.setDoInput(true);			conn.connect();			InputStream is = conn.getInputStream();			bitmap = BitmapFactory.decodeStream(is);			is.close();		}catch(IOException e){			e.printStackTrace();		}		return bitmap;	}}
服务器端java代码:

import java.util.HashMap;import java.util.Map;import java.util.Timer;import java.util.TimerTask;import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import org.jsoup.nodes.Element;import org.jsoup.select.Elements;import cn.jpush.api.ErrorCodeEnum;import cn.jpush.api.JPushClient;import cn.jpush.api.MessageResult;public class JPushClientExample {	private static final String appKey ="43bbac097a385c25c157e385";	//必填,例如43bbac097a385c25c157e385	private static final String masterSecret = "90ac96cf260c77e64cc2004b";//"90ac96cf260c77e64cc2004b";//必填,每个应用都对应一个masterSecret	private static JPushClient jpush = null;	/**	 * 保存离线的时长。秒为单位。最多支持10天(864000秒)。	 * 0 表示该消息不保存离线。即:用户在线马上发出,当前不在线用户将不会收到此消息。	 * 此参数不设置则表示默认,默认为保存1天的离线消息(86400秒)。	 */	private static long timeToLive = 60 * 60 * 24;  	private static String top_href = "";	//	public static void main(String[] args) {	public void main(){		/*		 * Example1: 初始化,默认发送给android和ios,同时设置离线消息存活时间		 * jpush = new JPushClient(masterSecret, appKey, timeToLive);		 */		/*				 * Example2: 只发送给android		 * jpush = new JPushClient(masterSecret, appKey, DeviceEnum.Android);		 */		/*		 * Example3: 只发送给IOS		 * jpush = new JPushClient(masterSecret, appKey, DeviceEnum.IOS);		 */		/*		 * Example4: 只发送给android,同时设置离线消息存活时间		 * jpush = new JPushClient(masterSecret, appKey, timeToLive, DeviceEnum.Android);		 */		jpush = new JPushClient(masterSecret, appKey, timeToLive);		/*		 * 是否启用ssl安全连接, 可选		 * 参数:启用true, 禁用false,默认为非ssl连接		 */		//jpush.setEnableSSL(true);		Timer timer = new Timer();		//在1秒后执行此任务,每次间隔半小时,如果传递一个Data参数,就可以在某个固定的时间执行这个任务		timer.schedule(new MyTask(), 1000, 1800*1000);  	}		private static class MyTask extends TimerTask{		@Override		public void run() {			Map
map = getNews(); String href = map.get("href"); if(!top_href.equals(href)){ //判断与上次发送的是否相同,不相同就推送 top_href = href; //测试发送消息或者通知 testSend(map); } } } private static Map
getNews(){ Document doc = null; Map
map = new HashMap
(); try { doc = Jsoup.connect("http://news.sina.cn/").get(); Elements ListDiv = doc.getElementsByAttributeValue("class","carditems"); for (int i = 0; i
map) { // 在实际业务中,建议 sendNo 是一个你自己的业务可以处理的一个自增数字。 // 除非需要覆盖,请确保不要重复使用。详情请参考 API 文档相关说明。 int sendNo = getRandomSendNo(); //String msgTitle = "+;//jpush\"\""; //String msgContent = "\\&;w\"\"a--【\npush】"; String href = map.get("href"); String msgTitle = map.get("title"); String msgContent=map.get("fu_title"); String url = map.get("src"); //图片地址 /* * IOS设备扩展参数, * 设置badge,设置声音 */ Map
extra = new HashMap
(); extra.put("href", href); extra.put("src", url); // IOSExtra iosExtra = new IOSExtra(10, "WindowsLogonSound.wav"); // extra.put("ios", iosExtra); //对所有用户发送通知, 更多方法请参考文档 message字段 // MessageResult msgResult = jpush.sendNotificationWithAppKey(sendNo, msgTitle, msgContent, 2, extra); MessageResult msgResult = jpush.sendCustomMessageWithAppKey(sendNo, msgTitle, msgContent, "a", extra); //发送自定义消息 //MessageResult msgResult = jpush.sendCustomMessageWithAppKey(sendNo,msgTitle, msgContent); //MessageResult msgResult = jpush.sendNotificationWithAlias(sendNo, "a", msgTitle, msgContent); //覆盖指定msgId的消息,msgId可以从msgResult.getMsgid()获取。 //MessageResult msgResult = jpush.sendNotificationWithAppKey(sendNo, msgTitle, msgContent, 0, extra,msgResult.getMsgid()); if (null != msgResult) { System.out.println("服务器返回数据: " + msgResult.toString()); if (msgResult.getErrcode() == ErrorCodeEnum.NOERROR.value()) { System.out.println(String.format("发送成功, sendNo= %s,messageId= %s",msgResult.getSendno(),msgResult.getMsg_id())); } else { System.out.println("发送失败, 错误代码=" + msgResult.getErrcode() + ", 错误消息=" + msgResult.getErrmsg()); } } else { System.out.println("无法获取数据"); } } public static final int MAX = Integer.MAX_VALUE; public static final int MIN = (int) MAX/2; /** * 保持 sendNo 的唯一性是有必要的 * It is very important to keep sendNo unique. * @return sendNo */ public static int getRandomSendNo() { return (int) (MIN + Math.random() * (MAX - MIN)); } }

关注公众号,分享干货,讨论技术

转载于:https://www.cnblogs.com/molashaonian/p/9097667.html

你可能感兴趣的文章
洛谷 P1588 丢失的牛
查看>>
Schiff Move Free维骨力这个牌子的保健效果怎么样,是要给中老年人群服用的
查看>>
使用POI进行Excel操作的总结一——创建Workbook,Sheet,Row以及Cell
查看>>
2016-2018,再见了这两年的青葱岁月
查看>>
CentOS 6.5 配置IP地址的三种方法
查看>>
一周结束
查看>>
源码安装
查看>>
前端--收藏功能的实现
查看>>
保利尼奥离中超如肖申克救赎 没人再说人傻钱多
查看>>
Java多线程(一) —— 传统线程技术
查看>>
JAVA线程学习
查看>>
js 继承 原型链
查看>>
屏蔽错误:LNK2038
查看>>
解决cannot find -lstdc++的问题
查看>>
C# 基础知识
查看>>
组合数据类型练习,英文词频统计实例
查看>>
mysql5.6.24的安装与简单使用
查看>>
验证码的生成
查看>>
Maven搭建hadoop环境报Missing artifact jdk.tools:jdk.tools:jar:1.7
查看>>
创业的关键:顺势而为
查看>>