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>

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



  • 相关阅读:
    URAL 1998 The old Padawan 二分
    URAL 1997 Those are not the droids you're looking for 二分图最大匹配
    URAL 1995 Illegal spices 贪心构造
    URAL 1993 This cheeseburger you don't need 模拟题
    URAL 1992 CVS
    URAL 1991 The battle near the swamp 水题
    Codeforces Beta Round #92 (Div. 1 Only) A. Prime Permutation 暴力
    Codeforces Beta Round #7 D. Palindrome Degree hash
    Codeforces Beta Round #7 C. Line Exgcd
    Codeforces Beta Round #7 B. Memory Manager 模拟题
  • 原文地址:https://www.cnblogs.com/molashaonian/p/9097667.html
Copyright © 2011-2022 走看看