這裡運用到的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();
}
});
}
}
}
}