package org.aisen.weibo.sina.service; import android.app.AlarmManager; import android.app.PendingIntent; import android.app.Service; import android.content.Intent; import android.os.IBinder; import org.aisen.android.common.context.GlobalContext; import org.aisen.android.common.utils.Logger; import org.aisen.android.network.task.TaskException; import org.aisen.android.network.task.WorkTask; import org.aisen.weibo.sina.base.AppContext; import org.aisen.weibo.sina.base.AppSettings; import org.aisen.weibo.sina.service.notifier.UnreadCountNotifier; import org.aisen.weibo.sina.sinasdk.SinaSDK; import org.aisen.weibo.sina.sinasdk.bean.UnreadCount; import org.aisen.weibo.sina.support.sqlit.SinaDB; import java.util.Calendar; /** * 未读消息服务<br/> * * @author wangdan * */ public class UnreadService extends Service { public static final String TAG = UnreadService.class.getSimpleName(); public static final String ACTION_GET = "org.aisen.weibo.sina.ACTION_GET"; public static final String ACTION_UPDATE = "org.aisen.weibo.sina.ACTION_UPDATE"; public static final String ACTION_UNREAD_CHANGED = "org.aisen.weibo.sina.ACTION_UNREAD_CHANGED"; public static void startService() { if (!AppSettings.isNotifyEnable()) return; Intent intent = new Intent(GlobalContext.getInstance(), UnreadService.class); intent.setAction(ACTION_GET); GlobalContext.getInstance().startService(intent); } public static void stopService() { clearAlarm(); if (AppContext.isLoggedIn()) { UnreadCountNotifier.mCount = new UnreadCount(); } Intent intent = new Intent(GlobalContext.getInstance(), UnreadService.class); GlobalContext.getInstance().stopService(intent); } public static void updateAlarm() { Intent intent = new Intent(GlobalContext.getInstance(), UnreadService.class); intent.setAction(ACTION_UPDATE); GlobalContext.getInstance().startService(intent); } public UnreadCountNotifier unreadCountNotifier; private UnreadTask unreadTask; @Override public void onCreate() { super.onCreate(); Logger.v(TAG, "服务初始化"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { if (unreadCountNotifier == null) unreadCountNotifier = new UnreadCountNotifier(this); if (!AppContext.isLoggedIn()) { stopSelf(); return super.onStartCommand(intent, flags, startId); } String action = intent != null ? intent.getAction() : ""; if (ACTION_GET.equals(action)) { resetTheTime(); if (!AppContext.getAccount().getAccessToken().isExpired()) { new UnreadTask().execute(); } } else if (ACTION_UPDATE.equals(action)) { Logger.v(TAG, "刷新时间"); resetTheTime(); } return super.onStartCommand(intent, flags, startId); } private static PendingIntent getOperation() { Intent intent = new Intent(); intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); intent.setAction(ACTION_GET); PendingIntent sender = PendingIntent.getService(GlobalContext.getInstance().getBaseContext() , 1000, intent, PendingIntent.FLAG_CANCEL_CURRENT); return sender; } private static void clearAlarm() { Logger.v(TAG, "clear unread block"); AlarmManager am = (AlarmManager) GlobalContext.getInstance().getSystemService(ALARM_SERVICE); am.cancel(getOperation()); } private void resetTheTime() { Logger.v(TAG, "reset unread block"); AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); // 指定时间 Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.add(Calendar.SECOND, AppSettings.getUnreadInterval()); Logger.v(TAG, String.format("未读消息,在%s后还是读取", AppSettings.getUnreadInterval())); am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), getOperation()); } class UnreadTask extends WorkTask<Void, Void, UnreadCount> { UnreadTask() { if (unreadTask != null) unreadTask.cancel(true); unreadTask = this; Logger.v(TAG, "execute UnreadTask"); } @Override public UnreadCount workInBackground(Void... params) throws TaskException { if (!AppContext.isLoggedIn()) return null; UnreadCount result = SinaSDK.getInstance(AppContext.getAccount().getAccessToken()).remindUnread(AppContext.getAccount().getUser().getIdstr()); // result.setMention_status(500); // result.setMention_cmt(100); // result.setCmt(20); // result.setFollower(10); AppContext.getAccount().setUnreadCount(new UnreadCount()); if (AppSettings.isNotifyComment()) AppContext.getAccount().getUnreadCount().setCmt(result.getCmt()); if (AppSettings.isNotifyCommentMention()) AppContext.getAccount().getUnreadCount().setMention_cmt(result.getMention_cmt()); if (AppSettings.isNotifyStatusMention()) AppContext.getAccount().getUnreadCount().setMention_status(result.getMention_status()); if (AppSettings.isNotifyFollower()) AppContext.getAccount().getUnreadCount().setFollower(result.getFollower()); if (AppSettings.isNotifyDm()) AppContext.getAccount().getUnreadCount().setDm(result.getDm()); // 更新DB result.setId(AppContext.getAccount().getUser().getIdstr()); SinaDB.getDB().insert(null, AppContext.getAccount().getUnreadCount()); return result; } @Override protected void onSuccess(UnreadCount result) { super.onSuccess(result); // 通知消息 unreadCountNotifier.notinfyUnreadCount(AppContext.getAccount().getUnreadCount()); sendUnreadBroadcast(); } @Override protected void onFinished() { super.onFinished(); unreadTask = null; } } public static void sendUnreadBroadcast() { // 发出广播更新状态 Intent intent = new Intent(ACTION_UNREAD_CHANGED); GlobalContext.getInstance().sendBroadcast(intent); } @Override public void onDestroy() { super.onDestroy(); Logger.v(TAG, "服务停止"); if (unreadTask != null) unreadTask.cancel(true); } @Override public IBinder onBind(Intent intent) { return null; } public static UnreadCount getUnreadCount() { if (!AppContext.isLoggedIn()) return null; return SinaDB.getDB().selectById(null, UnreadCount.class, AppContext.getAccount().getUser().getIdstr()); } }