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

本文共 8965 字,大约阅读时间需要 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/7445877.html

你可能感兴趣的文章
抽屉问题 吃糖果
查看>>
js常用的数组去重方法
查看>>
Setting up a Reverse Proxy using IIS, URL Rewrite and ARR
查看>>
bzoj 4818: [Sdoi2017]序列计数
查看>>
生成对抗网络(Generative Adversarial Network)阅读笔记
查看>>
GIT原理和常用命令速成
查看>>
Jmeter之集合点与关联
查看>>
springboot整合webservice
查看>>
字符串匹配KMP算法详解
查看>>
单词查找排序输出
查看>>
TCP三次握手和四次挥手及用户访问网页流程
查看>>
echo常用操作
查看>>
算法笔记
查看>>
LeetCode 237. Delete Node in a Linked List 删除链表结点(只给定要删除的结点) C++/Java...
查看>>
LCA倍增模板
查看>>
EMS-Demo 雇员管理系统演示
查看>>
软件工程第二次作业——心得体会(结对编程)
查看>>
ORA-12560: TNS: 协议适配器错误 ORA-12154: TNS: 无法解析指定的连接标识符
查看>>
读书印记 - 《菊与刀》
查看>>
第一个小demo: spring boot + mybatis + thymeleaf
查看>>