Android 消息推送简单实例

Android 消息推送简单实例

Msquirrel:

一、原理   
  消息推送有两种,一种是客户端定时直接到服务器搜索消息,如果发现有新的消息,就获取消息下来;另一种是服务器向客户端发送消息,也就是当有信息消息时,服务器端就会向客户端发送消息。

二、步骤(代码)

 注:      Notification  //是具体状态栏对象,设置Icon、文字、声音等。
              NotificationMangager //状态栏通知管理类、负责发消息、清理消息。


import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.IBinder;
import android.provider.MediaStore.Audio;
import android.util.Log;
import android.widget.RemoteViews;

/**
* 消息推送
*
* @author Msquirrel
*
*/
public class MessageService extends Service {

   private String TAG = "-----------";

   private MessageThread messageThread = null;

   // 点击查看
   private Intent messageIntent = null;
   private PendingIntent messagePendingIntent = null;

   // 通知栏消息
   private int messageNotificationID = 1000;
   private Notification messageNotification = null;                              // 是具体的状态栏通知对象,可以设置icon、文字、提示声音、振动等等参数。
   private NotificationManager messageNotificatioManager = null; // 是状态栏通知的管理类,负责发通知、清楚通知等。
   private RemoteViews contentView = null;

   @Override
   public IBinder onBind(Intent intent) {
       // TODO Auto-generated method stub
       return null;
   }

   @Override
   public int onStartCommand(Intent intent, int flags, int startId) {
       // 初始化
       // messageNotification = new
       // Notification(R.drawable.icon,"新消息11",System.currentTimeMillis());//*简单消息版本里的*此版本不使用
       messageNotification = new Notification();
       messageNotification.icon = R.drawable.icon;// 状态栏提示图标
       messageNotification.tickerText = "嘿嘿,测试消息推送";// 状态栏提示消息

       contentView = new RemoteViews(getPackageName(), R.layout.view);// 消息内容容器
       contentView.setImageViewResource(R.id.image, R.drawable.icon);// 消息容器界面的图标

       messageNotification.contentView = contentView;// 把消息容器和消息绑定

       // messageNotification.icon = R.drawable.icon;//*简单消息版本里的*此版本不使用
       // messageNotification.tickerText = "新消息11";//*简单消息版本里的*此版本不使用
       // messageNotification.when=System.currentTimeMillis();
       // //*简单消息版本里的*此版本不使用

       // messageNotification.defaults |= Notification.DEFAULT_SOUND;//声音
       // messageNotification.defaults |= Notification.DEFAULT_LIGHTS;//灯
       // messageNotification.defaults |= Notification.DEFAULT_VIBRATE;//震动

       // messageNotification.sound = Uri.parse("file:///sdcard/to.mp3");
       messageNotification.sound = Uri.withAppendedPath(
               Audio.Media.INTERNAL_CONTENT_URI, "2");// 选音乐清单的第2首歌做消息声音
       // messageNotification.ledARGB = 0xff00ff00;//灯的颜色
       // messageNotification.ledOnMS = 300; //亮的时间
       // messageNotification.ledOffMS = 1000; //灭的时间
       // messageNotification.flags |= Notification.FLAG_SHOW_LIGHTS;//显示灯

       // long v[]= {0,100,200,300}; //震动频率
       // messageNotification.vibrate = v;
       //

       messageNotification.flags |= Notification.FLAG_AUTO_CANCEL;// 点击消息后,该消息自动退出
       messageNotification.flags |= Notification.FLAG_ONGOING_EVENT;// 在上方运行消息栏中出现
       // messageNotification.flags|=Notification.FLAG_NO_CLEAR;//此消息不会被清除

       messageNotificatioManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
       messageIntent = new Intent(this, ShowMessage .class);// 点击消息后,要跳转的界面  ( 对应 详细消息的界面 )

       // 开启线程
       messageThread = new MessageThread();// 该线程每10秒,发布一条消息出来
       messageThread.isRunning = true;// 设置为false后,线程跳出循环并结束对
       messageThread.start();
       Log.i(TAG, "startCommand");
       return super.onStartCommand(intent, flags, startId);
   }

   /**
    * 从服务器端获取消息
    */
   class MessageThread extends Thread {
       // 设置为false后,线程跳出循环并结束
       public boolean isRunning = true;

       public void run() {
           while (isRunning) {
               try {

                   String serverMessage = getServerMessage();
                   
                   if (serverMessage != null && !"".equals(serverMessage)) {
                       // 更新通知栏
                       // messageNotification.setLatestEventInfo(MessageService.this,"新消息","哇~有    新消息耶!"+serverMessage,messagePendingIntent);//*简单消息版本里的*此版本不使用

                       contentView.setTextViewText(R.id.text, serverMessage);// 设置消息内容

                       messageIntent.putExtra("message", serverMessage);// 为意图添加参数
                       messagePendingIntent = PendingIntent.getActivity(
                               MessageService.this, 0, messageIntent,
                               PendingIntent.FLAG_CANCEL_CURRENT);// 将意图装入 延迟意图
                       messageNotification.contentIntent = messagePendingIntent;// 将延迟意图装入消息
                       messageNotificatioManager.notify(messageNotificationID,
                               messageNotification);// 启动Notification

                       Log.i(TAG, "发出消息");

                       // messageNotificatioManager.cancel(messageNotificationID-1);//新消息来后,消除之前的一条消息(只显示最新消息)
                       // 配置好下条消息的id号
                       messageNotificationID++;
                   }
                   // 休息10秒钟
                   Thread.sleep(10000);
                   // 获取服务器消息
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
           }
       }
   }

   /**
    * 模仿服务器发送过来的消息,仅作示例
    *
    * @return 返回服务器要推送的消息,否则如果为空的话,不推送
    */
   public String getServerMessage() {
       Log.i(TAG, "getmessage");
       return "亲, 测试成功啦~~!";

   }

   @Override
   public void onDestroy() {
       // System.exit(0);

       messageThread.isRunning = false;
       // 或者,二选一,推荐使用System.exit(0),这样进程退出的更干净
       // messageThread.isRunning = false;
       super.onDestroy();
       Log.i(TAG, "destroy");
   }

}


来自: http://wenzhutech.diandian.com/post/2013-04-01/40048717979

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值