2014-12-14 2 views
0

백그라운드에서 많은 파일을 압축하는 서비스를 시작하면 약 8 %와 15-30 초 후에 항상 중단됩니다. 그 일을 방지하고 봉사 활동을 끝내려면 어떻게해야합니까? 이 서비스는 아무런 제약이 없으며 이것이 문제일까요?매번 전경 서비스가 종료됩니다.

// 편집 : 전경 서비스를 만들었지 만 여전히 종료됩니다.

public class PackingService extends Service { 
    String basePath = ""+ Environment.getExternalStorageDirectory(); 
    String source = basePath+"/data.zip"; 
    File dir = new File(basePath+"/data"); 


    @Override 
    public void onCreate() { 
     super.onCreate(); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     NotificationCompat.Builder nBuilder = new NotificationCompat.Builder(this) 
      .setSmallIcon(R.drawable.ic_launcher) 
      .setContentTitle("Zipping") 
      .setContentText("..."); 

     startForeground(1337, nBuilder.build()); 

     try{ 
      ZipFile zipFile = new ZipFile(source); 

      Log.d("ZIP", "Preparing files..."); 
      ArrayList filesToAdd = new ArrayList(); 
      addDirectory(dir, filesToAdd); 

      ZipParameters parameters = new ZipParameters(); 
      parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE); 
      parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_ULTRA); 

      zipFile.setRunInThread(true); 
      ProgressMonitor monitor = zipFile.getProgressMonitor(); 

      Log.d("ZIP", "Creating zip..."); 
      zipFile.createZipFile(filesToAdd, parameters); 

      int percent = -1; 
      while(monitor.getState() == ProgressMonitor.STATE_BUSY){ 
       if(percent != monitor.getPercentDone()) { 
        percent = monitor.getPercentDone(); 
        Log.d("Progress", percent + "%"); 
       } 
      } 
     } catch (ZipException e) { 
      e.printStackTrace(); 
     } 

     stopForeground(true); 

     return super.onStartCommand(intent, flags, startId); 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    public void addDirectory (File dir, ArrayList filesToAdd) { 
     if (dir.exists()) { 
      File[] files = dir.listFiles(); 
      for (int i = 0; i < files.length; ++i) { 
       File file = files[i]; 
       if (file.isDirectory()) { 
        addDirectory(file, filesToAdd); 
       } else { 
        filesToAdd.add(file); 
       } 
      } 
     } 
} 

로그 :

dalvikvm﹕ threadid=3: reacting to signal 3 
dalvikvm﹕ Wrote stack traces to '/data/anr/traces.txt' 

답변

0

나는 Service하지만 IntentService를 사용하지 않음으로써 문제를 해결했다. 그런 다음 전체 지퍼 코드를 onHandleIntentIntentService 메서드에 넣고 전에 startForeground을 호출하십시오. 지퍼 처리 완료 후 stopForeground으로 전화하면 모든 것이 완벽하게 작동합니다.

관련 문제