package com.kescoode.xmail.service; import android.content.Intent; import android.os.Build; import android.os.IBinder; import android.os.RemoteException; import com.fsck.k9.mail.MessagingException; import com.kescoode.xmail.controller.MailManager; import com.kescoode.xmail.domain.Account; import com.kescoode.xmail.domain.EmailConfig; import com.kescoode.xmail.domain.LocalStore; import com.kescoode.xmail.domain.MailBuilder; import com.kescoode.xmail.service.aidl.IRemoteMailService; import com.kescoode.xmail.service.internal.CoreService; import com.kescoode.xmail.service.task.SendMailCommand; import com.kescoode.xmail.service.task.SettingsCheckCommand; import com.kescoode.xmail.service.task.SyncFolderCommand; import java.util.concurrent.ExecutorService; import java.util.concurrent.PriorityBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; /** * App中负责邮件收发功能的Service */ public class MailService extends CoreService { private final IRemoteMailService.Stub binder = new IRemoteMailService.Stub() { @Override public void login(String email, String password) throws RemoteException { EmailConfig config = manager.getEmailConfig(email); Account account = new Account(MailService.this, email, password, config); executor.execute(new SettingsCheckCommand(MailService.this, account)); } @Override public void syncAll(long accountId) throws RemoteException { } @Override public void syncFolder(long accountId, String folder, int page) throws RemoteException { Account account = manager.getAccount(accountId); LocalStore localStore = account.getLocalStore(); try { localStore.checkSettings(); executor.execute(new SyncFolderCommand(MailService.this, account, localStore.getFolder(folder), page)); } catch (MessagingException e) { /* 根本不会异常 */ } } @Override public void sendMail(long accountId, MailBuilder builder) throws RemoteException { Account account = manager.getAccount(accountId); executor.execute(new SendMailCommand(MailService.this, account, builder)); } }; public ExecutorService executor; private MailManager manager; public MailService() { } @Override public void onCreate() { super.onCreate(); executor = buildThreadPool(); manager = MailManager.getSingleTon(getApplicationContext()); } @Override public int onStartCommand(Intent intent, int flags, int startId) { manager.dB2Account(); /* 返回原来CoreService的设置 */ return super.onStartCommand(intent, flags, startId); } @Override public IBinder onBind(Intent intent) { return binder; } @Override public boolean onUnbind(Intent intent) { return super.onUnbind(intent); } private ExecutorService buildThreadPool() { int cores = Runtime.getRuntime().availableProcessors(); ThreadPoolExecutor executor = new ThreadPoolExecutor(cores, cores * 2 > 4 ? 4 : cores * 2, 300L, TimeUnit.SECONDS, new PriorityBlockingQueue<Runnable>()); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) { executor.allowCoreThreadTimeOut(true); } return executor; } }