zoukankan      html  css  js  c++  java
  • Android之极光推送发送自定义消息


    Android端实现主要代码:

    <span style="font-size:14px;">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);  //这里要先发送一次,因为</span><span style="font-size:14px;">onReceive</span><span style="font-size:14px;">方法实现不可以超过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;
    	}
    }
    
    </span>

    服务器端java代码:

    <span style="font-size:14px;">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";	//必填,例如</span><span style="font-size:14px;">43bbac097a385c25c157e385</span><span style="font-size:14px;">
    	private static final String masterSecret = "90ac96cf260c77e64cc2004b";//"</span><span style="font-size:14px;">90ac96cf260c77e64cc2004b</span><span style="font-size:14px;">";//必填,每个应用都对应一个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<String, String> map = getNews();
    			String href = map.get("href");
    			if(!top_href.equals(href)){     //判断与上次发送的是否相同,不相同就推送
    				top_href = href;
    				//测试发送消息或者通知
    				testSend(map);
    			}
    		}
    	}
    	
    	private static Map<String, String> getNews(){
    		Document doc = null;
    		Map<String, String> map = new HashMap<String, String>();
            try {
            	 doc = Jsoup.connect("http://news.sina.cn/").get();
                 Elements ListDiv = doc.getElementsByAttributeValue("class","carditems");
     			for (int i = 0; i<ListDiv.select("dl").size() ; i++) {
     				Element a = ListDiv.select("a").get(i);
     				String href = a.attr("href"); 
     				Element dl = ListDiv.select("dl").get(i);
     				Element dd = dl.select("dd").get(0);
     				Elements dt = dl.getElementsByTag("img");
     				Elements h3 = dd.select("h3");    //标题
     				Elements h4 = dd.select("h4");	//内容
     				String title = h3.text();
     				String fu_title = h4.text();
     				String url = dt.attr("src"); // 图片链接
     				
     				if(fu_title!=null && !fu_title.equals("")){
    	        			map.put("src", url);
    	        			map.put("title", title);
    	        			map.put("fu_title", fu_title);
    	        			map.put("href", href);
    	        			break;
     				}
     			}
            } catch (Exception e) {
                e.printStackTrace();
            }
            return map;
    	}
    
    	private static void testSend(Map<String, String> map) {
    		// 在实际业务中,建议 sendNo 是一个你自己的业务可以处理的一个自增数字。
    		// 除非需要覆盖,请确保不要重复使用。详情请参考 API 文档相关说明。
    		int sendNo = getRandomSendNo();
    		//String msgTitle = "+;//jpush""";
    		//String msgContent = "\&;w""a--【
    push】";
    		
    		String href = map.get("href");
    		String msgTitle = map.get("title");
    		String msgContent=map.get("fu_title");
    		String url = map.get("src");    //图片地址
    		
    		/*
    		 * IOS设备扩展参数,
    		 * 设置badge,设置声音
    		 */
    		Map<String, Object> extra = new HashMap<String, Object>();
    		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));
    	}
    	
    }
    </span>

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



  • 相关阅读:
    vb移动窗体的代码
    vb得到一个进程的启动参数?
    UTF8方式读写文件的模块
    JavaScript中Window.event详解
    vb设置窗体不可移动
    一拖二
    实习第一天
    사랑해
    决定考研
    Eclipse快捷键
  • 原文地址:https://www.cnblogs.com/molashaonian/p/9097667.html
Copyright © 2011-2022 走看看