歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android通過服務實現消息推送

這裡運用到的andorid知識模塊主要有Notification和Service,和一個Android-async-http-master開源框架

android項目中,有時會有這樣一種需求:客戶每隔一段時間,就像服務器發送一個請求,以獲取某些重要的、實時更新的消息。比如天氣預報。

如何讓應用實現在後台一直處於運行狀態,並且每個一段時間就向服務器發一個請求?android裡的四大組件之一:服務,就為我們提供了這種功能。

因此,我們可以嘗試在服務裡邊定義一個線程,只要服務不停止,線程就一直在運行,讓它每隔一段時間,就向服務器發送一個請求。

這裡只貼出核心代碼

Android通過服務實現消息推送源碼下載

免費下載地址在 http://linux.linuxidc.com/

用戶名與密碼都是www.linuxidc.com

具體下載目錄在 /2013年資料/11月/25日/Android通過服務實現消息推送

下載方法見 http://www.linuxidc.com/Linux/2013-07/87684.htm

我們來看一下核心代碼

1.在Activity中,我們可以通過startService()來啟動服務

public void open(View view) {
  Intent intent = new Intent(this, PushSmsService.class);
  // 啟動服務
  startService(intent);
 }

2.這裡我們需要自定義一個服務類,去繼承android的Service類

/**
 *
 * 短信推送服務類,在後台長期運行,每個一段時間就向服務器發送一次請求
 *
 * @author jerry
 *
 */
public class PushSmsService extends Service {
 private MyThread myThread;
 private NotificationManager manager;
 private Notification notification;
 private PendingIntent pi;
 private AsyncHttpClient client;
 private boolean flag = true;

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

 @Override
 public void onCreate() {
  System.out.println("oncreate()");
  this.client = new AsyncHttpClient();
  this.myThread = new MyThread();
  this.myThread.start();
  super.onCreate();
 }

 @Override
 public void onDestroy() {
  this.flag = false;
  super.onDestroy();
 }

 private void notification(String content, String number, String date) {
  // 獲取系統的通知管理器
  manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
  notification = new Notification(R.drawable.ic_menu_compose, content,
    System.currentTimeMillis());
  notification.defaults = Notification.DEFAULT_ALL; // 使用默認設置,比如鈴聲、震動、閃燈
  notification.flags = Notification.FLAG_AUTO_CANCEL; // 但用戶點擊消息後,消息自動在通知欄自動消失
  notification.flags |= Notification.FLAG_NO_CLEAR;// 點擊通知欄的刪除,消息不會依然不會被刪除

  Intent intent = new Intent(getApplicationContext(),
    ContentActivity.class);
  intent.putExtra("content", content);
  intent.putExtra("number", number);
  intent.putExtra("date", date);

  pi = PendingIntent.getActivity(getApplicationContext(), 0, intent, 0);
 
  notification.setLatestEventInfo(getApplicationContext(), number
    + "發來短信", content, pi);

  // 將消息推送到狀態欄
  manager.notify(0, notification);

 }

 private class MyThread extends Thread {
  @Override
  public void run() {
   String url = "http://110.65.99.66:8080/jerry/PushSmsServlet";
   while (flag) {
    System.out.println("發送請求");
    try {
     // 每個10秒向服務器發送一次請求
     Thread.sleep(10000);
    } catch (InterruptedException e) {
     e.printStackTrace();
    }

    // 采用get方式向服務器發送請求
    client.get(url, new AsyncHttpResponseHandler() {
     @Override
     public void onSuccess(int statusCode, Header[] headers,
       byte[] responseBody) {
      try {
       JSONObject result = new JSONObject(new String(
         responseBody, "utf-8"));
       int state = result.getInt("state");
       // 假設偶數為未讀消息
       if (state % 2 == 0) {
        String content = result.getString("content");
        String date = result.getString("date");
        String number = result.getString("number");
        notification(content, number, date);
       }
      } catch (Exception e) {
       e.printStackTrace();
      }

     }

     @Override
     public void onFailure(int statusCode, Header[] headers,
       byte[] responseBody, Throwable error) {
      Toast.makeText(getApplicationContext(), "數據請求失敗", 0)
        .show();
     }
    });

   }
  }
 }

}

Copyright © Linux教程網 All Rights Reserved