把下载服务下载到后台

时间:2017-04-04 12:35:49

标签: android

我正在使用this库进行下载 它运作良好,但我想在后台下载我的文件我不想使用AsyncTask,因为它有这么多的代码,我的项目很长。 所以请帮我在这个lib的后台下载 这是我的代码:

Ion.with(getApplicationContext())
                                .load("http://example.com/pdf.zip") // file address
                                .progress(new ProgressCallback() {
                                    @Override
                                    public void onProgress(long downloaded, long total) {





                                        progressBar.setProgress((int) downloaded);
                                        progressBar.setMax((int) total);


                                    }
                                })
                                .write(new File(direct + File.separator + "signal.zip")) //saving location
                                .setCallback(new FutureCallback<File>() {
                                    @Override
                                    public void onCompleted(Exception e, File result) {





                                        btn24.setText("show");

                                        btn24.setOnClickListener(new View.OnClickListener() {
                                        @Override
                                        public void onClick(View v) {

                                            Intent intent = new Intent(Card.this, Show.class);
                                            startActivity(intent);


                                        }
                                    });


                                }

                            });

这是我的活动代码:

 import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Build;
import android.os.Environment;
import android.os.StatFs;
import android.preference.PreferenceManager;
import android.support.design.widget.AppBarLayout;
import android.support.design.widget.CollapsingToolbarLayout;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;
import com.bumptech.glide.Glide;
import com.koushikdutta.async.future.FutureCallback;
import com.koushikdutta.ion.Ion;
import com.koushikdutta.ion.ProgressCallback;
import org.zeroturnaround.zip.ZipUtil;
import java.io.File;
import java.net.URL;
import uk.co.chrisjenx.calligraphy.CalligraphyContextWrapper;

public class Card extends AppCompatActivity {


    private Button btn1;



    private ProgressBar progresBar;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_card);

        //getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayShowTitleEnabled(false);

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);
        //toolbar.setNavigationIcon(R.drawable.toolbar_back_ltr);

        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });


        progressBar = (ProgressBar) findViewById(R.id.bar);











        btn1 = (Button) findViewById(R.id.button);




        if (Build.VERSION.SDK_INT >= 23) {
            if (ContextCompat.checkSelfPermission(Card.this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(Card.this, android.Manifest.permission.READ_EXTERNAL_STORAGE)
                    != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(Card.this,
                        new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE, android.Manifest.permission.READ_EXTERNAL_STORAGE},
                        1);
            } else {
            //do something
        }
    } else {
        //do something
    }





            btn1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {



direct = new File(Environment.getExternalStorageDirectory() + "/S/A");

if (!direct.exists()) {
    direct.mkdirs();
}


btn1.setText("Downloading . . .");
Ion.with(getApplicationContext())
        .load("http://example.com/pdf.zip") // file address
        .progress(new ProgressCallback() {
            @Override
            public void onProgress(long downloaded, long total) {



                progressBar.setProgress((int) downloaded);
                progressBar.setMax((int) total);


            }
        })
        .write(new File(direct + File.separator + "AmarVAEhtemal.zip")) // saving location
        .setCallback(new FutureCallback<File>() {
            @Override
            public void onCompleted(Exception e, File result) {






                btn1.setText("show");

                btn1.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {

                        Intent intent = new Intent(Card.this, Show.class);
                        startActivity(intent);


                    }
                });


            }

        });





                }
            });


        } 

    } 

1 个答案:

答案 0 :(得分:1)

使用前台服务来保护您的进程被杀死。

  1. 使用startService启动服务

  2. 使用startForeground(NOTIFICATION_ID, notification);来防止desctroying。

  3. 使用你的lib。

  4. PROFIT!

  5. 开始服务:

    Intent intent = new Intent(this, HelloService.class); startService(intent);

    服务类:

    public class ExampleService extends Service {
    
        @Override
        public void onCreate() {
            // The service is being created
    showForegroundNotification("some service");
        }
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            // The service is starting, due to a call to startService()
            return mStartMode;
        }
        @Override
        public IBinder onBind(Intent intent) {
            // A client is binding to the service with bindService()
            return mBinder;
        }
        @Override
    
        @Override
        public void onDestroy() {
            // The service is no longer used and is being destroyed
        }
    
    private static final int NOTIFICATION_ID = 1;
    
        private void showForegroundNotification(String contentText) {
            // Create intent that will bring our app to the front, as if it was tapped in the app
            // launcher
            Intent showTaskIntent = new Intent(getApplicationContext(), MyMainActivity.class);
            showTaskIntent.setAction(Intent.ACTION_MAIN);
            showTaskIntent.addCategory(Intent.CATEGORY_LAUNCHER);
            showTaskIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    
            PendingIntent contentIntent = PendingIntent.getActivity(
                    getApplicationContext(),
                    0,
                    showTaskIntent,
                    PendingIntent.FLAG_UPDATE_CURRENT);
    
            Notification notification = new Notification.Builder(getApplicationContext())
                    .setContentTitle(getString(R.string.app_name))
                    .setContentText(contentText)
                    .setSmallIcon(R.drawable.ic_notification)
                    .setWhen(System.currentTimeMillis())
                    .setContentIntent(contentIntent)
                    .build();
            startForeground(NOTIFICATION_ID, notification);
        }
    }
    

    启动前景示例

    https://gist.github.com/kristopherjohnson/6211176

    androidManifest.xml

    <service android:name=".ExampleService" . . . >
            </service>
    

    将传递额外数据用于:

    Intent intent = new Intent(this, HelloService.class); intent.putExtra("MYPARAMNAME","MYURL"); startService(intent);

    检索使用此:

    onStartCommand(Intent intent, ...
    Bundle extras = intent.getExtras();
    filename = extras.getString("MYPARAMNAME");