Android的log保存到文件上查看
Android的log保存到文件上查看
分类: Android 2012-07-31 10:59 1905人阅读 评论(0) 收藏 举报
androidstringfilepathexceptionaction
在调试的时候一般都是在logcat中看日志的信息,以便找出BUG和调试信息,但是如果在真机上的话不可能一直连接电脑查看日志,所以生成日志文件并保存,是一个比较普遍的需求,下面就是最近实现的一个例子。欢迎大家讨论并给出别的思路。
importjava.io.BufferedReader;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.InputStreamReader;
importjava.io.OutputStreamWriter;
importjava.text.ParseException;
importjava.text.SimpleDateFormat;
importjava.util.ArrayList;
importjava.util.Arrays;
importjava.util.Calendar;
importjava.util.Comparator;
importjava.util.Date;
importjava.util.List;
importandroid.app.AlarmManager;
importandroid.app.PendingIntent;
importandroid.app.Service;
importandroid.content.BroadcastReceiver;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.content.IntentFilter;
importandroid.os.Environment;
importandroid.os.IBinder;
importandroid.os.PowerManager;
importandroid.os.PowerManager.WakeLock;
importandroid.util.Log;
/**
*日志服务,日志默认会存储在SDcar里如果没有SDcard会存储在内存中的安装目录下面。1.本服务默认在SDcard中每天生成一个日志文件,
*2.如果有SDCard的话会将之前内存中的文件拷贝到SDCard中3.如果没有SDCard,在安装目录下只保存当前在写日志
*4.SDcard的装载卸载动作会在步骤2,3中切换5.SDcard中的日志文件只保存7天
*
*@authorAdministrator
*
*/
publicclassLogServiceextendsService{
privatestaticfinalStringTAG="LogService";
privatestaticfinalintMEMORY_LOG_FILE_MAX_SIZE=10*1024*1024;//内存中日志文件最大值,10M
privatestaticfinalintMEMORY_LOG_FILE_MONITOR_INTERVAL=10*60*1000;//内存中的日志文件大小监控时间间隔,10分钟
privatestaticfinalintSDCARD_LOG_FILE_SAVE_DAYS=7;//sd卡中日志文件的最多保存天数
privateStringLOG_PATH_MEMORY_DIR;//日志文件在内存中的路径(日志文件在安装目录中的路径)
privateStringLOG_PATH_SDCARD_DIR;//日志文件在sdcard中的路径
@SuppressWarnings("unused")
privateStringLOG_SERVICE_LOG_PATH;//本服务产生的日志,记录日志服务开启失败信息
privatefinalintSDCARD_TYPE=0;//当前的日志记录类型为存储在SD卡下面
privatefinalintMEMORY_TYPE=1;//当前的日志记录类型为存储在内存中
privateintCURR_LOG_TYPE=SDCARD_TYPE;//当前的日志记录类型
privateStringCURR_INSTALL_LOG_NAME;//如果当前的日志写在内存中,记录当前的日志文件名称
privateStringlogServiceLogName="Log.log";//本服务输出的日志文件名称
privateSimpleDateFormatmyLogSdf=newSimpleDateFormat(
"yyyy-MM-ddHH:mm:ss");
privateOutputStreamWriterwriter;
privateSimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHHmmss");//日志名称格式
privateProcessprocess;
privateWakeLockwakeLock;
privateSDStateMonitorReceiversdStateReceiver;//SDcard状态监测
privateLogTaskReceiverlogTaskReceiver;
/*
*是否正在监测日志文件大小;如果当前日志记录在SDcard中则为false如果当前日志记录在内存中则为true
*/
privatebooleanlogSizeMoniting=false;
privatestaticStringMONITOR_LOG_SIZE_ACTION="MONITOR_LOG_SIZE";//日志文件监测action
privatestaticStringSWITCH_LOG_FILE_ACTION="SWITCH_LOG_FILE_ACTION";//切换日志文件action
@Override
publicIBinderonBind(Intentintent)
{
returnnull;
}
@Override
publicvoidonCreate()
{
super.onCreate();
init();
register();
deploySwitchLogFileTask();
newLogCollectorThread().start();
}
privatevoidinit()
{
LOG_PATH_MEMORY_DIR=getFilesDir().getAbsolutePath()+File.separator
+"log";
LOG_SERVICE_LOG_PATH=LOG_PATH_MEMORY_DIR+File.separator
+logServiceLogName;
LOG_PATH_SDCARD_DIR=Environment.getExternalStorageDirectory()
.getAbsolutePath()
+File.separator
+"MyApp"
+File.separator
+"log";
createLogDir();
/*******************************************************
*try{writer=newOutputStreamWriter(newFileOutputStream(
*LOG_SERVICE_LOG_PATH,true));}catch(FileNotFoundExceptione){
*Log.e(TAG,e.getMessage(),e);}
******************************************************
*/
PowerManagerpm=(PowerManager)getApplicationContext()
.getSystemService(Context.POWER_SERVICE);
wakeLock=pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,TAG);
CURR_LOG_TYPE=getCurrLogType();
Log.i(TAG,"LogServiceonCreate");
}
privatevoidregister()
{
IntentFiltersdCarMonitorFilter=newIntentFilter();
sdCarMonitorFilter.addAction(Intent.ACTION_MEDIA_MOUNTED);
sdCarMonitorFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
sdCarMonitorFilter.addDataScheme("file");
sdStateReceiver=newSDStateMonitorReceiver();
registerReceiver(sdStateReceiver,sdCarMonitorFilter);
IntentFilterlogTaskFilter=newIntentFilter();
logTaskFilter.addAction(MONITOR_LOG_SIZE_ACTION);
logTaskFilter.addAction(SWITCH_LOG_FILE_ACTION);
logTaskReceiver=newLogTaskReceiver();
registerReceiver(logTaskReceiver,logTaskFilter);
}
/**
*获取当前应存储在内存中还是存储在SDCard中
*
*@return
*/
publicintgetCurrLogType()
{
if(!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED))
{
returnMEMORY_TYPE;
}else
{
returnSDCARD_TYPE;
}
}
/**
*部署日志切换任务,每天凌晨切换日志文件
*/
privatevoiddeploySwitchLogFileTask()
{
Intentintent=newIntent(SWITCH_LOG_FILE_ACTION);
PendingIntentsender=PendingIntent.getBroadcast(this,0,intent,0);
Calendarcalendar=Calendar.getInstance();
calendar.add(Calendar.DAY_OF_MONTH,1);
calendar.set(Calendar.HOUR_OF_DAY,0);
calendar.set(Calendar.MINUTE,0);
calendar.set(Calendar.SECOND,0);
//部署任务
AlarmManageram=(AlarmManager)getSystemService(ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),
AlarmManager.INTERVAL_DAY,sender);
recordLogServiceLog("deployNextTasksucc,nexttasktimeis:"
+myLogSdf.format(calendar.getTime()));
}
/**
*日志收集1.清除日志缓存2.杀死应用程序已开启的Logcat进程防止多个进程写入一个日志文件3.开启日志收集进程4.处理日志文件移动
*OR删除
*/
classLogCollectorThreadextendsThread{
publicLogCollectorThread(){
super("LogCollectorThread");
Log.d(TAG,"LogCollectorThreadiscreate");
}
@Override
publicvoidrun()
{
try
{
wakeLock.acquire();//唤醒手机
clearLogCache();
List<String>orgProcessList=getAllProcess();
List<ProcessInfo>processInfoList=getProcessInfoList(orgProcessList);
killLogcatProc(processInfoList);
createLogCollector();
Thread.sleep(1000);//休眠,创建文件,然后处理文件,不然该文件还没创建,会影响文件删除
handleLog();
wakeLock.release();//释放
}catch(Exceptione)
{
e.printStackTrace();
recordLogServiceLog(Log.getStackTraceString(e));
}
}
}
/**
*每次记录日志之前先清除日志的缓存,不然会在两个日志文件中记录重复的日志
*/
privatevoidclearLogCache()
{
Processproc=null;
List<String>commandList=newArrayList<String>();
commandList.add("logcat");
commandList.add("-c");
try
{
proc=Runtime.getRuntime().exec(
commandList.toArray(newString[commandList.size()]));
StreamConsumererrorGobbler=newStreamConsumer(
proc.getErrorStream());
StreamConsumeroutputGobbler=newStreamConsumer(
proc.getInputStream());
errorGobbler.start();
outputGobbler.start();
if(proc.waitFor()!=0)
{
Log.e(TAG,"clearLogCacheproc.waitFor()!=0");
recordLogServiceLog("clearLogCacheclearLogCacheproc.waitFor()!=0");
}
}catch(Exceptione)
{
Log.e(TAG,"clearLogCachefailed",e);
recordLogServiceLog("clearLogCachefailed");
}finally
{
try
{
proc.destroy();
}catch(Exceptione)
{
Log.e(TAG,"clearLogCachefailed",e);
recordLogServiceLog("clearLogCachefailed");
}
}
}
/**
*关闭由本程序开启的logcat进程:根据用户名称杀死进程(如果是本程序进程开启的Logcat收集进程那么两者的USER一致)
*如果不关闭会有多个进程读取logcat日志缓存信息写入日志文件
*
*@paramallProcList
*@return
*/
privatevoidkillLogcatProc(List<ProcessInfo>allProcList)
{
if(process!=null)
{
process.destroy();
}
StringpackName=this.getPackageName();
StringmyUser=getAppUser(packName,allProcList);
/*
*recordLogServiceLog("appuseris:"+myUser);
*recordLogServiceLog("========================");for(ProcessInfo
*processInfo:allProcList){
*recordLogServiceLog(processInfo.toString());}
*recordLogServiceLog("========================");
*/
for(ProcessInfoprocessInfo:allProcList)
{
if(processInfo.name.toLowerCase().equals("logcat")
&&processInfo.user.equals(myUser))
{
android.os.Process.killProcess(Integer
.parseInt(processInfo.pid));
//recordLogServiceLog("killanotherlogcatprocesssuccess,theprocessinfois:"
//+processInfo);
}
}
}
/**
*获取本程序的用户名称
*
*@parampackName
*@paramallProcList
*@return
*/
privateStringgetAppUser(StringpackName,List<ProcessInfo>allProcList)
{
for(ProcessInfoprocessInfo:allProcList)
{
if(processInfo.name.equals(packName))
{
returnprocessInfo.user;
}
}
returnnull;
}
/**
*根据ps命令得到的内容获取PID,User,name等信息
*
*@paramorgProcessList
*@return
*/
privateList<ProcessInfo>getProcessInfoList(List<String>orgProcessList)
{
List<ProcessInfo>procInfoList=newArrayList<ProcessInfo>();
for(inti=1;i<orgProcessList.size();i++)
{
StringprocessInfo=orgProcessList.get(i);
String[]proStr=processInfo.split("");
//USERPIDPPIDVSIZERSSWCHANPCNAME
//root10416300c00d4b280000cd5cS/init
List<String>orgInfo=newArrayList<String>();
for(Stringstr:proStr)
{
if(!"".equals(str))
{
orgInfo.add(str);
}
}
if(orgInfo.size()==9)
{
ProcessInfopInfo=newProcessInfo();
pInfo.user=orgInfo.get(0);
pInfo.pid=orgInfo.get(1);
pInfo.ppid=orgInfo.get(2);
pInfo.name=orgInfo.get(8);
procInfoList.add(pInfo);
}
}
returnprocInfoList;
}
/**
*运行PS命令得到进程信息
*
*@returnUSERPIDPPIDVSIZERSSWCHANPCNAMEroot10416300c00d4b28
*0000cd5cS/init
*/
privateList<String>getAllProcess()
{
List<String>orgProcList=newArrayList<String>();
Processproc=null;
try
{
proc=Runtime.getRuntime().exec("ps");
StreamConsumererrorConsumer=newStreamConsumer(
proc.getErrorStream());
StreamConsumeroutputConsumer=newStreamConsumer(
proc.getInputStream(),orgProcList);
errorConsumer.start();
outputConsumer.start();
if(proc.waitFor()!=0)
{
Log.e(TAG,"getAllProcessproc.waitFor()!=0");
recordLogServiceLog("getAllProcessproc.waitFor()!=0");
}
}catch(Exceptione)
{
Log.e(TAG,"getAllProcessfailed",e);
recordLogServiceLog("getAllProcessfailed");
}finally
{
try
{
proc.destroy();
}catch(Exceptione)
{
Log.e(TAG,"getAllProcessfailed",e);
recordLogServiceLog("getAllProcessfailed");
}
}
returnorgProcList;
}
/**
*开始收集日志信息
*/
publicvoidcreateLogCollector()
{
StringlogFileName=sdf.format(newDate())+".log";//日志文件名称
List<String>commandList=newArrayList<String>();
commandList.add("logcat");
commandList.add("-f");
//commandList.add(LOG_PATH_INSTALL_DIR+File.separator+logFileName);
commandList.add(getLogPath());
commandList.add("-v");
commandList.add("time");
commandList.add("*:I");
//commandList.add("*:E");//过滤所有的错误信息
//过滤指定TAG的信息
//commandList.add("MyAPP:V");
//commandList.add("*:S");
try
{
process=Runtime.getRuntime().exec(
commandList.toArray(newString[commandList.size()]));
recordLogServiceLog("startcollectingthelog,andlognameis:"
+logFileName);
//process.waitFor();
}catch(Exceptione)
{
Log.e(TAG,"CollectorThread==>"+e.getMessage(),e);
recordLogServiceLog("CollectorThread==>"+e.getMessage());
}
}
/**
*根据当前的存储位置得到日志的绝对存储路径
*
*@return
*/
publicStringgetLogPath()
{
createLogDir();
StringlogFileName=sdf.format(newDate())+".log";//日志文件名称
if(CURR_LOG_TYPE==MEMORY_TYPE)
{
CURR_INSTALL_LOG_NAME=logFileName;
Log.d(TAG,"Logstoredinmemory,thepathis:"
+LOG_PATH_MEMORY_DIR+File.separator+logFileName);
returnLOG_PATH_MEMORY_DIR+File.separator+logFileName;
}else
{
CURR_INSTALL_LOG_NAME=null;
Log.d(TAG,"LogstoredinSDcard,thepathis:"
+LOG_PATH_SDCARD_DIR+File.separator+logFileName);
returnLOG_PATH_SDCARD_DIR+File.separator+logFileName;
}
}
/**
*处理日志文件1.如果日志文件存储位置切换到内存中,删除除了正在写的日志文件并且部署日志大小监控任务,控制日志大小不超过规定值
*2.如果日志文件存储位置切换到SDCard中,删除7天之前的日志,移动所有存储在内存中的日志到SDCard中,并将之前部署的日志大小监控取消
*/
publicvoidhandleLog()
{
if(CURR_LOG_TYPE==MEMORY_TYPE)
{
deployLogSizeMonitorTask();
deleteMemoryExpiredLog();
}else
{
moveLogfile();
cancelLogSizeMonitorTask();
deleteSDcardExpiredLog();
}
}
/**
*部署日志大小监控任务
*/
privatevoiddeployLogSizeMonitorTask()
{
if(logSizeMoniting)
{//如果当前正在监控着,则不需要继续部署
return;
}
logSizeMoniting=true;
Intentintent=newIntent(MONITOR_LOG_SIZE_ACTION);
PendingIntentsender=PendingIntent.getBroadcast(this,0,intent,0);
AlarmManageram=(AlarmManager)getSystemService(ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(),
MEMORY_LOG_FILE_MONITOR_INTERVAL,sender);
Log.d(TAG,"deployLogSizeMonitorTask()succ!");
//recordLogServiceLog("deployLogSizeMonitorTask()succ,starttimeis"
//+calendar.getTime().toLocaleString());
}
/**
*取消部署日志大小监控任务
*/
privatevoidcancelLogSizeMonitorTask()
{
logSizeMoniting=false;
AlarmManageram=(AlarmManager)getSystemService(ALARM_SERVICE);
Intentintent=newIntent(MONITOR_LOG_SIZE_ACTION);
PendingIntentsender=PendingIntent.getBroadcast(this,0,intent,0);
am.cancel(sender);
Log.d(TAG,"canelLogSizeMonitorTask()succ");
}
/**
*检查日志文件大小是否超过了规定大小如果超过了重新开启一个日志收集进程
*/
privatevoidcheckLogSize()
{
if(CURR_INSTALL_LOG_NAME!=null&&!"".equals(CURR_INSTALL_LOG_NAME))
{
Stringpath=LOG_PATH_MEMORY_DIR+File.separator
+CURR_INSTALL_LOG_NAME;
Filefile=newFile(path);
if(!file.exists())
{
return;
}
Log.d(TAG,"checkLog()==>Thesizeofthelogistoobig?");
if(file.length()>=MEMORY_LOG_FILE_MAX_SIZE)
{
Log.d(TAG,"Thelog'ssizeistoobig!");
newLogCollectorThread().start();
}
}
}
/**
*创建日志目录
*/
privatevoidcreateLogDir()
{
Filefile=newFile(LOG_PATH_MEMORY_DIR);
booleanmkOk;
if(!file.isDirectory())
{
mkOk=file.mkdirs();
if(!mkOk)
{
mkOk=file.mkdirs();
}
}
/*************************************
*file=newFile(LOG_SERVICE_LOG_PATH);if(!file.exists()){try{
*mkOk=file.createNewFile();if(!mkOk){file.createNewFile();}}
*catch(IOExceptione){Log.e(TAG,e.getMessage(),e);}}
************************************
*/
if(Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED))
{
file=newFile(LOG_PATH_SDCARD_DIR);
if(!file.isDirectory())
{
mkOk=file.mkdirs();
if(!mkOk)
{
recordLogServiceLog("movefilefailed,dirisnotcreatedsucc");
return;
}
}
}
}
/**
*将日志文件转移到SD卡下面
*/
privatevoidmoveLogfile()
{
if(!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED))
{
//recordLogServiceLog("movefilefailed,sdcarddoesnotmount");
return;
}
Filefile=newFile(LOG_PATH_SDCARD_DIR);
if(!file.isDirectory())
{
booleanmkOk=file.mkdirs();
if(!mkOk)
{
//recordLogServiceLog("movefilefailed,dirisnotcreatedsucc");
return;
}
}
file=newFile(LOG_PATH_MEMORY_DIR);
if(file.isDirectory())
{
File[]allFiles=file.listFiles();
for(FilelogFile:allFiles)
{
StringfileName=logFile.getName();
if(logServiceLogName.equals(fileName))
{
continue;
}
//StringcreateDateInfo=
//getFileNameWithoutExtension(fileName);
booleanisSucc=copy(logFile,newFile(LOG_PATH_SDCARD_DIR
+File.separator+fileName));
if(isSucc)
{
logFile.delete();
//recordLogServiceLog("movefilesuccess,lognameis:"+fileName);
}
}
}
}
/**
*删除内存下过期的日志
*/
privatevoiddeleteSDcardExpiredLog()
{
Filefile=newFile(LOG_PATH_SDCARD_DIR);
if(file.isDirectory())
{
File[]allFiles=file.listFiles();
for(FilelogFile:allFiles)
{
StringfileName=logFile.getName();
if(logServiceLogName.equals(fileName))
{
continue;
}
StringcreateDateInfo=getFileNameWithoutExtension(fileName);
if(canDeleteSDLog(createDateInfo))
{
logFile.delete();
Log.d(TAG,"deleteexpiredlogsuccess,thelogpathis:"
+logFile.getAbsolutePath());
}
}
}
}
/**
*判断sdcard上的日志文件是否可以删除
*
*@paramcreateDateStr
*@return
*/
publicbooleancanDeleteSDLog(StringcreateDateStr)
{
booleancanDel=false;
Calendarcalendar=Calendar.getInstance();
calendar.add(Calendar.DAY_OF_MONTH,-1*SDCARD_LOG_FILE_SAVE_DAYS);//删除7天之前日志
DateexpiredDate=calendar.getTime();
try
{
DatecreateDate=sdf.parse(createDateStr);
canDel=createDate.before(expiredDate);
}catch(ParseExceptione)
{
Log.e(TAG,e.getMessage(),e);
canDel=false;
}
returncanDel;
}
/**
*删除内存中的过期日志,删除规则:除了当前的日志和离当前时间最近的日志保存其他的都删除
*/
privatevoiddeleteMemoryExpiredLog()
{
Filefile=newFile(LOG_PATH_MEMORY_DIR);
if(file.isDirectory())
{
File[]allFiles=file.listFiles();
Arrays.sort(allFiles,newFileComparator());
for(inti=0;i<allFiles.length-2;i++)
{//"-2"保存最近的两个日志文件
File_file=allFiles[i];
if(logServiceLogName.equals(_file.getName())
||_file.getName().equals(CURR_INSTALL_LOG_NAME))
{
continue;
}
_file.delete();
Log.d(TAG,"deleteexpiredlogsuccess,thelogpathis:"
+_file.getAbsolutePath());
}
}
}
/**
*拷贝文件
*
*@paramsource
*@paramtarget
*@return
*/
privatebooleancopy(Filesource,Filetarget)
{
FileInputStreamin=null;
FileOutputStreamout=null;
try
{
if(!target.exists())
{
booleancreateSucc=target.createNewFile();
if(!createSucc)
{
returnfalse;
}
}
in=newFileInputStream(source);
out=newFileOutputStream(target);
byte[]buffer=newbyte[8*1024];
intcount;
while((count=in.read(buffer))!=-1)
{
out.write(buffer,0,count);
}
returntrue;
}catch(Exceptione)
{
e.printStackTrace();
Log.e(TAG,e.getMessage(),e);
recordLogServiceLog("copyfilefail");
returnfalse;
}finally
{
try
{
if(in!=null)
{
in.close();
}
if(out!=null)
{
out.close();
}
}catch(IOExceptione)
{
e.printStackTrace();
Log.e(TAG,e.getMessage(),e);
recordLogServiceLog("copyfilefail");
returnfalse;
}
}
}
/**
*记录日志服务的基本信息防止日志服务有错,在LogCat日志中无法查找此日志名称为Log.log
*
*@parammsg
*/
privatevoidrecordLogServiceLog(Stringmsg)
{
if(writer!=null)
{
try
{
Datetime=newDate();
writer.write(myLogSdf.format(time)+":"+msg);
writer.write("\n");
writer.flush();
}catch(IOExceptione)
{
e.printStackTrace();
Log.e(TAG,e.getMessage(),e);
}
}
}
/**
*去除文件的扩展类型(.log)
*
*@paramfileName
*@return
*/
privateStringgetFileNameWithoutExtension(StringfileName)
{
returnfileName.substring(0,fileName.indexOf("."));
}
classProcessInfo{
publicStringuser;
publicStringpid;
publicStringppid;
publicStringname;
@Override
publicStringtoString()
{
Stringstr="user="+user+"pid="+pid+"ppid="+ppid
+"name="+name;
returnstr;
}
}
classStreamConsumerextendsThread{
InputStreamis;
List<String>list;
StreamConsumer(InputStreamis){
this.is=is;
}
StreamConsumer(InputStreamis,List<String>list){
this.is=is;
this.list=list;
}
publicvoidrun()
{
try
{
InputStreamReaderisr=newInputStreamReader(is);
BufferedReaderbr=newBufferedReader(isr);
Stringline=null;
while((line=br.readLine())!=null)
{
if(list!=null)
{
list.add(line);
}
}
}catch(IOExceptionioe)
{
ioe.printStackTrace();
}
}
}
/**
*监控SD卡状态
*
*@authorAdministrator
*
*/
classSDStateMonitorReceiverextendsBroadcastReceiver{
publicvoidonReceive(Contextcontext,Intentintent)
{
if(Intent.ACTION_MEDIA_UNMOUNTED.equals(intent.getAction()))
{//存储卡被卸载
if(CURR_LOG_TYPE==SDCARD_TYPE)
{
Log.d(TAG,"SDcarisUNMOUNTED");
CURR_LOG_TYPE=MEMORY_TYPE;
newLogCollectorThread().start();
}
}else
{//存储卡被挂载
if(CURR_LOG_TYPE==MEMORY_TYPE)
{
Log.d(TAG,"SDcarisMOUNTED");
CURR_LOG_TYPE=SDCARD_TYPE;
newLogCollectorThread().start();
}
}
}
}
/**
*日志任务接收切换日志,监控日志大小
*
*@authorAdministrator
*
*/
classLogTaskReceiverextendsBroadcastReceiver{
publicvoidonReceive(Contextcontext,Intentintent)
{
Stringaction=intent.getAction();
if(SWITCH_LOG_FILE_ACTION.equals(action))
{
newLogCollectorThread().start();
}elseif(MONITOR_LOG_SIZE_ACTION.equals(action))
{
checkLogSize();
}
}
}
classFileComparatorimplementsComparator<File>{
publicintcompare(Filefile1,Filefile2)
{
if(logServiceLogName.equals(file1.getName()))
{
return-1;
}elseif(logServiceLogName.equals(file2.getName()))
{
return1;
}
StringcreateInfo1=getFileNameWithoutExtension(file1.getName());
StringcreateInfo2=getFileNameWithoutExtension(file2.getName());
try
{
Datecreate1=sdf.parse(createInfo1);
Datecreate2=sdf.parse(createInfo2);
if(create1.before(create2))
{
return-1;
}else
{
return1;
}
}catch(ParseExceptione)
{
return0;
}
}
}
@Override
publicvoidonDestroy()
{
super.onDestroy();
recordLogServiceLog("LogServiceonDestroy");
if(writer!=null)
{
try
{
writer.close();
}catch(IOExceptione)
{
e.printStackTrace();
}
}
if(process!=null)
{
process.destroy();
}
unregisterReceiver(sdStateReceiver);
unregisterReceiver(logTaskReceiver);
}
}
最后不要忘记在配置文件中加入
Xml代码
<uses-permission android:name="android.permission.READ_LOGS" />
更多相关文章
- Android应用程序中Manifest.java文件的介绍
- Android多文件断点续传(三)——实现文件断点续传
- Android中内存占用的含义:(VSS,PSS,RSS,USS)
- Android 导入android源码有错,R.java文件不能自动生成解决方法
- Android 开发日志之仿三星Launcher
- Android App 内存泄露之资源