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(){@Overridepublic 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")@Overridepublic 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() {@Overridepublic 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;">";//必填,每个应用都对应一个masterSecretprivate 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{@Overridepublic 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--【\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<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>


更多相关文章

  1. 解析Android的 消息传递机制Handler
  2. android:布局参数,控件属性及各种xml的作用
  3. android sdk 安装更新慢:下载android sdk更新包离线安装解决方案
  4. Android中AsyncTask(异步任务)和Handler(线程消息机制)的详解
  5. Android 4.0 触摸屏消息(二大写的二)
  6. flutter插件开发学习之旅(7)-------双平台参数传递
  7. Android应用程序线程消息循环模型分析(1)

随机推荐

  1. Android Paint Style
  2. android maven Unable to execute dex: M
  3. Android 蓝牙开发浅析
  4. 【monkeyrunner】monkeyrunner 的API
  5. LinearLayout 让最后一个空间靠到屏幕底
  6. Android使用系统分享文件给微信,QQ指定的
  7. 一些Andriod相关的网站
  8. Android子线程与子线程的通信
  9. Android基本之UI Layout
  10. Android实现电话状态监控