import android.app.Service;
import android.os.AsyncTask;/**
 * Created by songyan on 2016/12/21.
 * 服务的基本用法
 *
 * ******定义一个服务
 * 继承Service类
 * 必须重写的方法是onBind
 * 要完成处理事情的逻辑需要重写的类有onCreate,onStartCommand,onDestroy
 *
 * 启动和停止服务
 * Intent startIntent=new Intent(this,FileManagerService.class);
 * startService(startIntent);
 * Intent stopIntent=new Intent(this,FileManagerService.class);
 * stopService(stopIntent);
 *
 * ******活动和服务进行通信
 * 在继承服务的类中需要书写的相关内容,写一个继承Binder的类,在必须重写的方法onBind中返回
 * 继承Binder的类的对象:
 * private ServiceBinder mBinder=new ServiceBinder();
 * public class FileManagerService extends Service {
 * private ServiceBinder extends Binder{
 *     定义相关方法
 * }
 * }
 * @Override
 * public IBinder onBind(Intent intent){
 *     return mBinder;
 * }
 *
 * *******在调用服务的类中需要完成的内容;
 * 定义一个继承Binder的类的对象,再初始化一个ServiceConnection接口,初始化该接口需要重写的类
 * 有onServiceDisconnected,onServiceConnected
 * 在以上方法中可以通过继承Binder的类的对象调用在服务中定义的相关方法,这样就将服务和活动联系
 * 在一起了,如下:
 * private FileManagerService.ServiceBinder serviceBinder;
 * private ServiceConnection connection=new ServiceConnection(){
 *     @Override
 *     public void onServiceDisconnected(ComponentName name{
 *     }
 *
 *     @Override
 *     public void onServiceConnected(ComponentName name,IBinder service){
 *         serviceBinder=(FileManagerService.ServiceBinder)service;
 *         //接下来就可以调用在服务中定义的相关方法了
 *     }
 * }
 *
 *最后进行服务和活动的绑定
 * Intent bindIntent=new Intent(this,ServiceBinder.class);
 * bindService(bindIntent,connection,BIND_AUTO_CREATE);
 * 解绑
 * unbindService(connection);
 */
import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;import FileOperationTask.CreateFolderTask;
import FileOperationTask.RenameTask;
import FileOperationTask.CutPasteFilesTask;
import FileOperationTask.CopyPasteFilesTask;public class FileManagerService extends Service {public static final int FILE_FILTER_TYPE_UNKOWN=-1;public static final int FILE_FILTER_TYPE_DEFAULT=0;public static final int FILE_FILTER_TYPE_FOLDER=1;public static final int FILE_FILTER_TYPE_ALL=2;private static final String TAG="FileManagerService";private final HashMap<String,FileManagerActivityInfo> mActivityMap=new HashMap<String,FileManagerActivityInfo>();private ServiceBinder mBinder=null;//用于在onBind方法中返回

    private static class FileManagerActivityInfo{private BaseAsyncTask mTask=null;private FileInfoManager mFileInfoManager=null;private int mFilterType=FILE_FILTER_TYPE_DEFAULT;public void setTask(BaseAsyncTask task){this.mTask=task;}public void setFileInfoManager(FileInfoManager fileInfoManager){this.mFileInfoManager=fileInfoManager;}public void setFilterType(int filterType){this.mFilterType=filterType;}BaseAsyncTask getTask(){return mTask;}FileInfoManager getFileInfoManager(){return mFileInfoManager;}int getFilterType(){return mFilterType;}}//定义一个操作事件监听接口
    public interface OperationEventListener{int ERROR_CODE_NAME_VALID=100;int ERROR_CODE_SUCCESS=0;int ERROR_CODE_UNSUCCESS=-1;int ERROR_CODE_NAME_EMPTY=-2;int ERROR_CODE_NAME_TOO_LONG=-3;int ERROR_CODE_FILE_EXIST=-4;int ERROR_CODE_NOT_ENOUGH_SPACE=-5;int ERROR_CODE_DELETER_FAILS=-6;int ERROR_CODE_USER_CANCEL=-7;int ERROR_CODE_PASTE_TO_SUB=-8;int ERROR_CODE_UNKNOW=-9;int ERROR_CODE_COPY_NO_PERMISSION=-10;int ERROR_CODE_MKDIR_UNSUCCESS=-11;int ERROR_CODE_CUT_SAME_PATH=-12;int ERROR_CODE_BUSY=-100;int ERROR_CODE_DELETE_UNSUCCESS=-13;int ERROR_CODE_PASTE_UNSUCCESS=-14;int ERROR_CODE_DELETER_NO_PERMISSION=-15;int ERROR_CODE_COPY_GREATER_4G_TO_FAT32=-16;//这个方法将会被实现,在asynctask的onPreExecute中被调用
        void onTaskPrepare();//这个方法将会被实现,在asynctask的onProgressUpdate方法中被调用
        //prgressIfo是ProgressInfo的信息,将会在UI中被更新
        void onTaskProgress(ProgressInfo progressInfo);//这个方法将会被实现,在asynctask的onPostExecute中被调用
        //参数result是asynctask的doInBackground()的结果
        void onTaskResult(int result);}@Override
    public void onCreate(){super.onCreate();mBinder=new ServiceBinder();AsyncTask.setDefaultExecutor(AsyncTask.THREAD_POOL_EXECUTOR);//设置AsyncTask的运行方式?
    }@Override
    public int onStartCommand(Intent intent,int flags,int startId){LogUtils.d(TAG,"onStartCommand...");super.onStartCommand(intent,flags,startId);return START_NOT_STICKY;//“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务
    }public class ServiceBinder extends Binder{//这个方法得到FileServiceInstance的实例public FileManagerService getServiceInstance(){return FileManagerService.this;}}//这个方法初始化特定活动的FileInfoManager
    public FileInfoManager initFileInfoManager(String activityName){FileManagerActivityInfo activityInfo=mActivityMap.get(activityName);if(activityInfo==null){activityInfo=new FileManagerActivityInfo();activityInfo.setFileInfoManager(new FileInfoManager());mActivityMap.put(activityName,activityInfo);}return activityInfo.getFileInfoManager();} @Overridepublic IBinder onBind(Intent intent){DrmManager.getInstance().init(this);return mBinder;}//这个方法检查服务忙不忙,这表示对于一些特定活动task id存不存在
    public boolean isBusy(String activityName){boolean ret=false;FileManagerActivityInfo activityInfo=mActivityMap.get(activityName);if(activityInfo==null){return ret;}BaseAsyncTask task=activityInfo.getTask();if(task!=null){return task.isTaskBusy();}return false;}private FileManagerActivityInfo getActivityInfo(String activityName){FileManagerActivityInfo activityInfo=mActivityMap.get(activityName);if(activityInfo==null){throw new IllegalArgumentException("this activity not init in Service");}return activityInfo;}//这个方法设置列表过滤器,决定什么类型的items会被列出在ListView中
    public void setListType(int type,String activityName){getActivityInfo(activityName).setFilterType(type);}//这个方法通过启动一个新的CreateFolderTask来完成创建文件夹的工作
    public void createFolder(String activityName,String destFolder,OperationEventListener listener){if(isBusy(activityName)){listener.onTaskResult(OperationEventListener.ERROR_CODE_BUSY);}else{FileInfoManager fileInfoManager=getActivityInfo(activityName).getFileInfoManager();int filterType=getActivityInfo(activityName).getFilterType();if(fileInfoManager!=null){BaseAsyncTask task=new CreateFolderTask(fileInfoManager,listener,this,destFolder,filterType);getActivityInfo(activityName).setTask(task);task.execute();}}}public void rename(String activityName,FileInfo srcFile,FileInfo dstFile,OperationEventListener listener){LogUtils.d(TAG,"rename Start,activityName="+activityName);if(isBusy(activityName)){listener.onTaskResult(OperationEventListener.ERROR_CODE_BUSY);}else {FileInfoManager fileInfoManager=getActivityInfo(activityName).getFileInfoManager();int filterType=getActivityInfo(activityName).getFilterType();if(fileInfoManager!=null){BaseAsyncTask task=new RenameTask(fileInfoManager,listener,this,srcFile,dstFile,filterType);getActivityInfo(activityName).setTask(task);task.execute();}}}private int filterPasteList(List<FileInfo> fileInfoList, String destFolder){int remove=0;Iterator<FileInfo> iterator=fileInfoList.iterator();while(iterator.hasNext()){FileInfo fileInfo=iterator.next();if(fileInfo.isDirectory()){if((destFolder+MountPointManager.SEPARATOR).startsWith(fileInfo.getFileAbsolutePath()+MountPointManager.SEPARATOR)){iterator.remove();remove++;}}}return remove;}public void deleteFiles(String activityName,List<FileInfo>fileInfoList,OperationEventListener listener){LogUtils.d(TAG,"deleteFiles Start,activityName="+activityName);if(isBusy(activityName)){listener.onTaskResult(OperationEventListener.ERROR_CODE_BUSY);}else {FileInfoManager fileInfoManager=getActivityInfo(activityName).getFileInfoManager();if(fileInfoManager!=null){BaseAsyncTask task=new FileOperationTask.DeleteFilesTask(fileInfoManager,listener,this,fileInfoList);getActivityInfo(activityName).setTask(task);task.execute();}}}public void cancel(String activityName){LogUtils.d(TAG,"cancel service,activityName="+activityName);BaseAsyncTask task=getActivityInfo(activityName).getTask();if(task!=null){task.cancel(true);//终止task(线程)
        }}public void pasteFiles(String activityName,List<FileInfo> fileInfoList,String dstFolder,int type,OperationEventListener listener){LogUtils.d(TAG,"pasteFiles Start,activityName="+activityName);if(isBusy(activityName)){listener.onTaskResult(OperationEventListener.ERROR_CODE_BUSY);return;}if(filterPasteList(fileInfoList,dstFolder)>0){//要粘贴的文件中存在于目标文件夹
            listener.onTaskResult(OperationEventListener.ERROR_CODE_PASTE_TO_SUB);}FileInfoManager fileInfoManager=getActivityInfo(activityName).getFileInfoManager();if(fileInfoManager==null){LogUtils.w(TAG,"mFileInfoManager.get FileInfoManager=null");listener.onTaskResult(OperationEventListener.ERROR_CODE_UNKNOW);return;}BaseAsyncTask task=null;if(fileInfoList.size()>0){switch (type){case FileInfoManager.PASTE_MODE_CUT:if(isCutSamePath(fileInfoList,dstFolder)){listener.onTaskResult(OperationEventListener.ERROR_CODE_CUT_SAME_PATH);return;}task=new CutPasteFilesTask(fileInfoManager,listener,getApplicationContext(),fileInfoList,dstFolder);getActivityInfo(activityName).setTask(task);task.execute();break;case FileInfoManager.PASTE_MODE_COPY:task=new CopyPasteFilesTask(fileInfoManager,listener,getApplicationContext(),fileInfoList,dstFolder);getActivityInfo(activityName).setTask(task);task.execute();break;default:listener.onTaskResult(OperationEventListener.ERROR_CODE_UNKNOW);return;}}}private boolean isCutSamePath(List<FileInfo>fileInfoList,String dstFolder){for(FileInfo fileInfo:fileInfoList){if(fileInfo.getFileParentPath().equals(dstFolder)){//要拷贝文件的父路径和目的路径相同
                return true;}}return false;}public void listFiles(String activityName,String path,OperationEventListener listener){LogUtils.d(TAG,"listFiles,activityName="+activityName+",path="+path);if(isBusy(activityName)){LogUtils.d(TAG,"listFiles,cancel other background task...");BaseAsyncTask task=getActivityInfo(activityName).getTask();if(task!=null){task.removeListener();task.cancel(true);}}LogUtils.d(TAG,"listFiles,do list.");FileInfoManager fileInfoManager=getActivityInfo(activityName).getFileInfoManager();int filterType=getActivityInfo(activityName).getFilterType();if(fileInfoManager!=null){LogUtils.d(TAG,"listFiles filterType="+filterType);BaseAsyncTask task=new ListFileTask(getApplicationContext(),fileInfoManager,listener,path,filterType);getActivityInfo(activityName).setTask(task);task.execute();}}public void getDetailInfo(String activityName,FileInfo file,OperationEventListener listener){LogUtils.d(TAG,"getDetailInfo,activityName="+activityName);if(isBusy(activityName)){listener.onTaskResult(OperationEventListener.ERROR_CODE_BUSY);}else {FileInfoManager fileInfoManager=getActivityInfo(activityName).getFileInfoManager();if(fileInfoManager!=null){BaseAsyncTask task=new DetailInfoTask(fileInfoManager,listener,file);getActivityInfo(activityName).setTask(task);task.execute();}}}//当服务连接断开的时候这个方法将listener从task上移除
    public void disconnected(String activityName){LogUtils.d(TAG,"disconnected,activityName="+activityName);BaseAsyncTask task=getActivityInfo(activityName).getTask();if(task!=null){task.removeListener();}}//当对话被销毁货值重建的时候这个方法通过设置新的监听给task来重新连接正在运行的task
    public void reconnected(String activityName,OperationEventListener listener){LogUtils.d(TAG,"reconnected,activityName="+activityName);BaseAsyncTask task=getActivityInfo(activityName).getTask();if(task!=null){task.setListener(listener);}}public boolean isDetailTask(String activityName){FileManagerActivityInfo aInfo=mActivityMap.get(activityName);if(null==aInfo){LogUtils.d(TAG,"activity is not attach:"+activityName);return false;}BaseAsyncTask task=aInfo.getTask();if(task!=null && task instanceof DetailInfoTask){return true;}return false;}public boolean isHeavyOperationTask(String activityName){FileManagerActivityInfo aInfo=mActivityMap.get(activityName);if(null==aInfo){LogUtils.d(TAG,"activity is not attach:"+activityName);return false;}BaseAsyncTask task=aInfo.getTask();if(task!=null &&(task instanceof CutPasteFilesTask || task instanceof CopyPasteFilesTask|| task instanceof DetailInfoTask)){return true;}return false;}public void search(String activityName,String searchName,String path,OperationEventListener operationEvent){LogUtils.d(TAG,"search,activityName="+activityName+",searchName="+searchName+",path"+path);if(isBusy(activityName)){cancel(activityName);}else{FileInfoManager fileInfoManager=getActivityInfo(activityName).getFileInfoManager();if(fileInfoManager!=null){BaseAsyncTask task=new SearchTask(fileInfoManager,operationEvent,searchName,path,getContentResolver());getActivityInfo(activityName).setTask(task);task.execute();}}}
}

服务的定义,使用和绑定(FileManagerService)相关推荐

  1. Android(java)学习笔记171:服务(service)之绑定服务调用服务里面的方法

    1.绑定服务调用服务里面的方法,图解: 步骤: (1)在Activity代码里面绑定 bindService(),以bind的方式开启服务 :                     bindServ ...

  2. boost::regex模块在 cpp 文件中搜索类定义,使用绑定成员函数回调测试程序

    boost::regex模块在 cpp 文件中搜索类定义,使用绑定成员函数回调测试程序 实现功能 C++实现代码 实现功能 boost::regex模块在 cpp 文件中搜索类定义,使用绑定成员函数回 ...

  3. dhcp服务器分配指定ip,DHCP服务(自动分配IP、绑定固定IP)

    DHCP协议 DHCP(Dynamips Host configuration Protocal)动态主机配置协议是一种基于UDP协议且仅限于在局域网内部使用的网络协议,主要用于大型的局域网环境或者存 ...

  4. 安卓服务service全解,生命周期,前台服务、后台服务,启动注销、绑定解绑,注册

    全栈工程师开发手册 (作者:栾鹏) python教程全解 定义服务(服务的生命周期) 调用context.startService()时依次执行 ->onCreate()- >onStar ...

  5. 4. Netty+SpringBoot实现IM服务 之 用户与channel绑定

    系列文章目录 技术选型.简单实现 16进制数据及解决半包和粘包 拆包器与心跳检测 用户与channel绑定 通过Redis的订阅机制实现服务集群 授权登录 系列文章目录 定义登录协议 用户与chann ...

  6. 使用ASP.Net WebAPI构建REST服务(四)——参数绑定

    默认绑定方式 WebAPI把参数分成了简单类型和复杂类型: 简单类型主要包括CLR的primitive types,(int.double.bool等),系统内置的几个strcut类型(TimeSpa ...

  7. 203.为用户定义的数据类型绑定默认值案例

    /*--示例说明下面的示例演示了如何把默认值绑定到列和用户定义的数据类型并且演示了修改绑定于列和用户定义的数据类型的默认值时,这两者之间的差异. --*/--定义数据类型 EXEC sp_addtyp ...

  8. 服务引用定义配置(服务的注册与发现)

    本文大部分摘自极客时间胡忠想老师的<从0开始学微服务>课程,对原文做了简单概括和修改 XML 配置方式的服务发布和引用的具体流程,简单来说就是 服务提供者定义好接口,并且在服务发布配置文件 ...

  9. OSS图片处理服务绑定域名时提示“域名绑定在自己的其他Bucket上”

    问题描述 使用OSS图片处理服务绑定域名并验证时,系统提示如下错误. 问题原因 可能目标域名已经绑定在其他Bucket上.使用OSS的自定义域名和图片处理服务时都需要绑定域名,而绑定域名都需要添加CN ...

最新文章

  1. mysql低权限用户getshell_GetShell的姿势总结
  2. Linux服务器上挂载window本地iso镜像文件的方法。
  3. struts2之OGNL用法
  4. hdu4885 有 限制的最短路
  5. 关于64位WIN7下正确建立JAVA开发环境(转
  6. WINCE6.0+S3C2443的启动过程---eboot2
  7. 不吹不黑,赞一下应用运维管理的cassacdra
  8. 转载:linux安装rlwrap软件包
  9. GDCM:gdcm::FileChangeTransferSyntax的测试程序
  10. linux查看上次重启日志和ip,Linux實時查看日志,訪問前10IP 和相關命令
  11. ES6~ES12——Array Includes、Object values、Object entries、Object fromEntries、flat、flatMap、空值合并运算符、可选链等
  12. python selenium --一些常用方法
  13. 7建站php_2019最受欢迎的企业网站CMS建站系统排行榜
  14. 在 NXP iMX8 上进行 4K 视频播放测试
  15. PDMan-国产免费通用数据库建模工具(极简,漂亮)
  16. 05因果图法和决策表法
  17. Oracle 11g RAC 修改服务器各类ip地址【转载】
  18. python kfold交叉验证_KFold交叉验证
  19. 【转载】研究生退学记——谨以此记录我半途而废的研究生生涯
  20. 幻数浅析(Magic Number)

热门文章

  1. 完全重新安装IIS7
  2. U盘加密软件怎么选?
  3. php服务器搭建iis,PHP+IIS 服务器环境的搭建
  4. 逗号算命系统 v1.02
  5. armadillo使用,armadillo提高编译效率和速度
  6. 一个显示器分屏显示两个画面_测了两个爆款游戏显示器,结果我发现他们都有坑...
  7. 裤子千万条,棉裤第一条!南方的小伙伴你穿棉裤吗?
  8. 实验 snort安装配置与规则编写
  9. 数据库存储时间戳,13位时间戳转换位10位时间戳
  10. redis.conf之save配置项解读