2015-01-25 2 views
0

내 앱이 최소화되거나 닫히거나 사용자가 죽이면 다운로드를 계속 진행할 수 있도록 안드로이드에 다운로드 관리자를 만들고 싶다. Back Button Pressed가 백그라운드에서 실행될 때이 코드를 사용하지만 사용자가 앱을 종료 할 때 다운로드가 중지됩니다. 누구나이 문제를 해결하기 위해 제안 할 수 있습니까?나는 내 앱을 안드로이드에서 닫을 때 멈추지 않는 스레드를 만들고 싶다

내가 내 MainActivity에이 코드를 사용 :

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.TextView; 

public class MainActivity extends Activity { 

    private TextView textView; 
    Thread thread; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    textView = (TextView) findViewById(R.id.status); 
    } 

    public void onClick(View view) { 

     Thread thread = new Thread(new Runnable() { 
      public void run() 
      { 
       try { 
        Intent intent = new Intent(MainActivity.this, DownloadService.class); 
        intent.putExtra("filename", "index.mp3"); 
        intent.putExtra("urlpath", 
          "http://s1.mihandownload.com/2015/saeedahmadi/Technology-mihandownload-com.rar"); 
        startService(intent); 
        textView.setText("Service started"); 
       } catch(Exception v) { 
        System.out.println(v); 
       } 
      }}); 
     thread.start(); 
    } 
} 

이 코드 내은 DownloadService

import java.io.BufferedInputStream; 
import java.io.BufferedOutputStream; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import android.annotation.TargetApi; 
import android.app.Activity; 
import android.app.IntentService; 
import android.app.NotificationManager; 
import android.content.Context; 
import android.content.Intent; 
import android.os.AsyncTask; 
import android.os.Build; 
import android.os.Environment; 
import android.support.v4.app.NotificationCompat; 
import android.support.v4.app.NotificationCompat.Builder; 
import android.util.Log; 
import android.widget.ProgressBar; 

public class DownloadService extends IntentService { 

    ProgressBar progressBar; 
    NotificationManager mNotifyManager; 
    Builder mBuilder; 
    int id = 1; 

    HttpURLConnection connection; 
    String DESTINATION_PATH; 
    Activity myActivity; 
    float val=0.0f; 

    public DownloadService() { 
    super("DownloadService"); 
    } 


    @TargetApi(Build.VERSION_CODES.HONEYCOMB) 
@Override 
    protected void onHandleIntent(Intent intent) { 

     mNotifyManager =(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
     mBuilder = new NotificationCompat.Builder(this); 
     mBuilder.setContentTitle("Picture Download") 
      .setContentText("Download in progress") 
      .setSmallIcon(R.drawable.ic_launcher); 
     mBuilder.setOngoing(true); 
     mBuilder.setProgress(100, 0, false); 
     mNotifyManager.notify(id, mBuilder.build()); 

     String URL = intent.getStringExtra("urlpath"); 
     String DESTINATION_PATH = intent.getStringExtra("filename"); 

     AsyncDownload asyncCallWS = new AsyncDownload(); 
     if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) 
      asyncCallWS.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, URL,DESTINATION_PATH); 
     else 
      asyncCallWS.execute(URL,DESTINATION_PATH);  

    } 

    private class AsyncDownload extends AsyncTask<String, Void, Void> { 
     String fileName=""; 
     @Override 
     protected Void doInBackground(String... params) { 
      fileName = params[1]; 
      downloadFile(params[0], getFilename(params[1])); 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      Log.i("AsyncDownload", "onPostExecute"); 
      Log.i("AsyncDownload", fileName); 

     } 

    } 

    private void downloadFile(String myUrl, String DESTINATION_PATH) { 
     try{ 
      URL url = new URL(myUrl); 
      connection = (HttpURLConnection) url.openConnection(); 
      int downloaded = 0; 
      File file=new File(DESTINATION_PATH); 
      if(file.exists()){ 
       if(file.length()!=0){ 
        downloaded = (int) file.length(); 
       } 
      } 
      connection.setRequestProperty("Range", "bytes=" + downloaded + "-"); 
      connection.setDoInput(true); 
      connection.setDoOutput(true); 

      BufferedInputStream in = new BufferedInputStream(connection.getInputStream()); 
      FileOutputStream fos; 
      if(downloaded==0){ 
       fos = new FileOutputStream(DESTINATION_PATH); 
      }else{ 
       fos = new FileOutputStream(DESTINATION_PATH,true); 
      } 
      setProgres(((file.length()*1.0f)/connection.getContentLength())*100); 
      BufferedOutputStream bout = new BufferedOutputStream(fos, 1024); 
      byte[] data = new byte[1024]; 
      int x = 0; 
      while ((x = in.read(data, 0, 1024)) >= 0) { 
       bout.write(data, 0, x); 
       downloaded += x; 
       Log.e("file Name", DESTINATION_PATH); 
       setProgres(((file.length()*1.0f)/connection.getContentLength())*100); 
      } 
      bout.close(); 
      fos.close(); 
     }catch(Exception exception){ 
      exception.printStackTrace(); 
     } 
    } 



    private String getFilename(String fileName) { 
     String filepath = Environment.getExternalStorageDirectory()+"/test/"+fileName; 
     return filepath; 
    } 

    private void setProgres(final float value) { 
     Log.e("",String.valueOf(value)); 
     mBuilder.setProgress(100, (int)value, false); 
     mNotifyManager.notify(id, mBuilder.build()); 

    } 

} 

답변

0

에 당신은 전경 서비스를 만들어야합니다. 이는 사용자가 서비스를 인식하고 메모리가 부족할 때 시스템을 죽일 후보가 아니라는 것을 의미합니다. 를 forground 서비스를 시작하는 당신은 당신은 안드로이드 개발자 웹 사이트 here에 대한 자세한 또한 here

을 읽을 수 startForeground(ONGOING_NOTIFICATION_ID, notification);

를 호출해야