最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

android用鬧鐘定時做http請求推送的解決方案

 更新時間:2018年01月25日 10:43:25   作者:songsongbrother  
這篇文章主要為大家詳細介紹了android用鬧鐘定時做http請求推送的解決方案,具有一定的參考價值,感興趣的小伙伴們可以參考一下

設計思路

如果在開發(fā)當中需要做push接入,而產(chǎn)品又要求不允許用第三方sdk(百度push,友盟push),而且又沒有網(wǎng)絡編程的經(jīng)驗,這個時候怎么辦?這里就給大家分享下用http請求解決這個問題。

大體的設計思路是,寫一個service(為了保證長時間運行不被kill,就將其定義到另外的進程當中去),在這個service里面啟動鬧鐘,每隔一段時間(這個時間可以自己定義)去請求服務器,如果有新的push消息,就通知給用戶。

具體實現(xiàn)

貌似很簡單定義一個鬧鐘不斷輪循請求服務器一句話,卻在實際開發(fā)中要考慮很多問題,下面簡單給大家列出來。

1)鬧鐘時間校準
2)每天push只能在固定的或者某個定義的時間內推送
3)push類型的擴展,新添加一種類型的push

什么都不說,類圖直接貼上

大概分為三級結構

第一級:MoboPushAlarmManager,主要工作是管理鬧鐘,初始化鬧鐘,對鬧鐘時間進行校準,取消鬧鐘。
第二級:MobogeniePushServiceNew,主要工作是對鬧鐘設置的pendingintent的動作(startservice)進行處理。
第三級:MoboPushNotifyHelper,主要工作是實例化notification對象,發(fā)送出通知,并且取消通知。MoboMessageSelector,主要工作是從n多個push中根據(jù)時間選擇出可用的push。MoboPushRequest,主要是請求服務器,從服務器列表中獲取push隊列。
其余的PushActionCreator,MoboPushMessage等等都屬于第三級或者第一第二級的工具類了。

開始來貼代碼了(具體的源碼還沒抽出來,過段時間再貼上)
MoboPushAlarmManager來初始化鬧鐘,當鬧鐘響了就會發(fā)送一個intent給MobogeniePushServiceNew

public void initPullAlarm(Context context, boolean boot) {
  Bundle bundle = new Bundle();
  bundle.putInt(START_SERVICE_TYPE, TYPE_REQUEST);
  PendingIntent pendingIntent = getPendingIntent(context, bundle, REQ_PULL);
  //循環(huán)時間
  long repeat_time = HOUR_MILLIS * 2;
  Log.i(TAG, "repeat_time is " + repeat_time);
  // 計算下一次執(zhí)行時間
  long triggerAtMillis = boot ? 10000 : 0;
  Log.i(TAG, "initPullAlarm,and next pull time is after: " + triggerAtMillis);
  // 這個行為會覆蓋之前的Alarm,主要根據(jù)PendingIntent來辨別不同的鬧鐘
  getAlarmManager(context).setRepeating(AlarmManager.RTC, System.currentTimeMillis() + triggerAtMillis, repeat_time, pendingIntent);
 }

MobogeniePushServiceNew接收到鬧鐘之后,就會解析intent,并且進行相應的操作(請求網(wǎng)絡,發(fā)送通知)

@Override
 public void onStart(Intent intent, int startId) {
  super.onStart(intent, startId);
  LogUtil.p("pushservice onStart");
  if (intent == null) {
   LogUtil.d("mobopush", "intent == null)");
   return;
  }
  // 解析打開service的意圖
  parsePushServiceIntent(intent);
 }

private void parsePushServiceIntent(Intent intent) {
  Log.i(TAG, "parsePushServiceIntent");
  if (intent == null) {
   return;
  }
  Bundle bundle = intent.getExtras();
  if (bundle == null) {
   // 不明渠道調起service,默認處理為準備獲取新消息,重設鬧鐘
   PushAlarmManager.getInstance().initPullAlarm(this, false);
   return;
  }
  int type = bundle.getInt(PushAlarmManager.START_SERVICE_TYPE);
  if (type == PushAlarmManager.TYPE_STARTSERVICE) {
   //判斷鬧鐘是否過期,如果過期則重設
  } else if (type == PushAlarmManager.TYPE_REQUEST) {
   // 預設的網(wǎng)絡請求
   mREQ_RESULT = REQ_RESULT.ING;
   MoboPushRequest.getInstance().pullPushMessages(this, this, MoboPushRequest.REQUEST_NORMAL);
  }
 }

//請求網(wǎng)絡回調的數(shù)據(jù)處理
@Override
 public void onMessageLoaded(int actionCode, int requestCode, MessageResponse response) { 
//將網(wǎng)絡請求回來的結果利用MessageSelector選擇器,選擇出有用的消息    getMessageSelector().assignMessageFromNet(MobogeniePushServiceNew.this, new MessageGetListener() {

     @Override
     public void showMessages(List<MoboPushMessage> msgs) {
      if (msgs.size() > 0) {
       for (MoboPushMessage msg : msgs) {
        notifyMessageAndDelete(msg, false);
       }
      }
     }

     @Override
     public void prepareMessages(List<MoboPushMessage> msgs) {
      if (msgs == null || msgs.size() == 0) {

       return;
      }
      MoboPushMessageDBUtils.insertBatch(MobogeniePushServiceNew.this, msgs);
      initShowMessageAlarm(msgs);
     }
    }, response.messages);
 }

MoboPushRequest去拉取新的消息
沒有寫網(wǎng)絡請求的部分,大家明白意思就行

public void pullPushMessages(Context context, final IMessageGetListener l, final int requestCode) {
  boolean pushFlag = true;
  if (!pushFlag) {
   return;
  }
  final Context appcontext = context.getApplicationContext();

  //這里進行http請求,得到json數(shù)據(jù)
  String json = "";
  if (!TextUtils.isEmpty(json)) {
   JSONObject jsonObj = null;
   String str = null;
   try {
    jsonObj = new JSONObject(json);
    if (jsonObj.optInt("code") == 100) {
     int interval = jsonObj.optInt("interval");
     MessageResponse response = new MessageResponse();
     response.interval = interval * 1000;
     JSONArray jsonArray = jsonObj.optJSONArray("list");
     if (jsonArray == null || jsonArray.length() == 0) {
     }

     int aLength = jsonArray.length();
     response.initMessageArray(aLength);
     response.resCode = 100;
     for (int i = 0; i < aLength; i++) {
      JSONObject jsonInArray = jsonArray.getJSONObject(i);
      str = jsonInArray.toString();
      MoboPushMessage pushMessage = new MoboPushMessage();
      pushMessage.parseJson(str);
      response.messages[i] = pushMessage;
      if (pushMessage != null ) {
      }
     }
    } else {
    }
   } catch (JSONException e) {
   }
  }

   Object object=null;
   int actionCode=0;
   if (l == null) {
    return;
   }
   if (actionCode==0 && object != null && object instanceof MessageResponse) {
    MessageResponse response = (MessageResponse) object;
    l.onMessageLoaded(actionCode, requestCode, response);
   } else {
    l.onMessageLoaded(actionCode, requestCode, null);
   }
 }

剩下的就是處理具體的push消息了

private void notifyMessageAndDelete(MoboPushMessage message, boolean delete) {
  if (message == null) {
   return;
  }
//傳入message對象發(fā)送通知   getMoboPushNotifyHelper().showNotification(message);
  }

我們只有message對象怎樣利用這個message對象去發(fā)送不同類型的push呢,為了很好的擴展,直接上代碼

public void showNotification(MoboPushMessage message) {
  final Intent targetIntent = obtainNotificationClick(message, false);
setNotification(message, targetIntent);
 }
public void setNotification(final MoboPushMessage message, final Intent intent) {
  //根據(jù)MoboPushMessage和Intent來show通知
 }

重點就在這句話了,怎樣根據(jù)message檢測出需要的push呢

final Intent targetIntent = obtainNotificationClick(message, false);

我們可以看見getTargetIntent(mContext, message)這個方法主要作用

public Intent obtainNotificationClick(MoboPushMessage message, boolean flag) {
  if (message == null) {
   return null;
  }
  PushActionCreator actionCreator = new PushActionCreator();
  return actionCreator.getTargetIntent(mContext, message);
 }

核心在這里

public Intent getTargetIntent(Context c,MoboPushMessage pushMessage){
  if(pushMessage==null)
  {
   return null;
  }
  int type = pushMessage.type;
  Intent resultIntent = null;
  for(IPushIntentAction action:mPushActions){
   if(action.isTypeForAction(type)){
    try{
     resultIntent = action.createTargetIntent(c,pushMessage);
    }catch(Exception e){
    }
    break;
   }
  }
  return resultIntent;
 }

將不同類型的push對象添加到這個集合里面去

ArrayList<IPushIntentAction> mPushActions;

也就是所有的push數(shù)據(jù)都要實現(xiàn)這個公共的接口

public interface IPushIntentAction {
 public Intent createTargetIntent(Context context,MoboPushMessage message);
 public int getActionKey();
 public boolean isTypeForAction(int type);
 public String getNextPage();
}

其中createTargetIntent這個根據(jù)不同的類型new出各自的intent,isTypeForAction比對類型

舉個例子大家就知道了。

public class PushActionDefault implements IPushIntentAction {

 @Override
 public Intent createTargetIntent(Context c, MoboPushMessage message) {
  Intent intent = new Intent();
  intent.setAction("android.intent.action.MAIN");
  intent.addCategory("android.intent.category.LAUNCHER");
  return intent;
 }

 @Override
 public int getActionKey() {
  return MoboPushMessage.TYPE_OPEN_APP;
 }

 @Override
 public String getNextPage() {
  return null;
 }

 @Override
 public boolean isTypeForAction(int type) {
  return false;
 }

}


基本上把一條線給貫穿了,其中
1)鬧鐘時間校準
解決方法可以自由的寫在初始化鬧鐘里面,如果發(fā)現(xiàn)時間有錯誤,可以再初始化一下鬧鐘,這樣就可以覆蓋以前的鬧鐘
2)每天push只能在固定的或者某個定義的時間內推送
我們在MoboMessageSelector選擇器里面專門對時間進行了篩選
3)push類型的擴展,新添加一種類型的push
我們要添加新的類型的push的時候,只需要實現(xiàn)IPushIntentAction 這個接口,然后在將對象添加到ArrayList mPushActions這個集合里面,供選擇就OK了

最近比較忙,之后一定把整理好的demo分享給大家。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Android 兩個ViewPager的聯(lián)動效果的實現(xiàn)

    Android 兩個ViewPager的聯(lián)動效果的實現(xiàn)

    這篇文章主要介紹了Android 兩個ViewPager的聯(lián)動效果的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • Android離線緩存的實例代碼

    Android離線緩存的實例代碼

    android很多時候需要考慮緩存的問題,本篇文章主要介紹了Android離線緩存的實例代碼,具有一定的參考價值,有興趣的可以了解一下。
    2017-01-01
  • Android實現(xiàn)登錄注冊界面框架

    Android實現(xiàn)登錄注冊界面框架

    這篇文章主要介紹了Android實現(xiàn)登錄注冊界面的框架,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • Android中SwipeBack實現(xiàn)右滑返回效果

    Android中SwipeBack實現(xiàn)右滑返回效果

    這篇文章主要介紹了Android中SwipeBack實現(xiàn)右滑返回效果的相關資料,需要的朋友可以參考下
    2016-02-02
  • android中sqlite的按條件查找的小例子

    android中sqlite的按條件查找的小例子

    android中內嵌輕量級數(shù)據(jù)庫sqlite,涉及到的操作無外乎增刪改查,今天就來說一說其中的查找操作,更多的時候我們用到的查找是要按條件查找的 例如表的結構如下:
    2013-06-06
  • Flutter實現(xiàn)密碼強度校驗結果的示例詳解

    Flutter實現(xiàn)密碼強度校驗結果的示例詳解

    我們經(jīng)常在一些網(wǎng)站上看到這樣的密碼強度指示,使用三段線,分別用不同的顏色來表示弱密碼、中等強度密碼和強密碼,本篇我們就用?Flutter?來實現(xiàn)這樣一個密碼強度校驗示例,希望對大家有所幫助
    2023-08-08
  • RecyclerView設置間距和添加分割線的方法

    RecyclerView設置間距和添加分割線的方法

    在使用RecyclerView布局,經(jīng)常需要調整間距和添加分割線以達到更美觀效果,這篇文章主要介紹了RecyclerView設置間距和添加分割線的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • Android實現(xiàn)購物商城

    Android實現(xiàn)購物商城

    這篇文章主要為大家詳細介紹了Android實現(xiàn)購物商城,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • Android Studio實現(xiàn)QQ的注冊登錄和好友列表跳轉

    Android Studio實現(xiàn)QQ的注冊登錄和好友列表跳轉

    最近做了一個項目,這篇文章主要介紹了Android Studio界面跳轉,本次項目主要包含了注冊、登錄和好友列表三個界面以及之間相互跳轉,感興趣的可以了解一下
    2021-05-05
  • Android仿微信圖片選擇器

    Android仿微信圖片選擇器

    這篇文章主要為大家詳細介紹了Android仿微信圖片選擇器的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11

最新評論

阳朔县| 宁乡县| 徐汇区| 无锡市| 松桃| 陆丰市| 安溪县| 丰县| 凤山县| 皮山县| 张家界市| 宁强县| 桃江县| 汾西县| 彰武县| 醴陵市| 中方县| 新野县| 黄梅县| 外汇| 鸡东县| 凤城市| 宝山区| 阳原县| 微山县| 高青县| 新郑市| 沧州市| 马关县| 东明县| 桦川县| 拜城县| 余干县| 六安市| 德安县| 新闻| 鹿邑县| 闸北区| 从化市| 内丘县| 永善县|