android--利用Service进行文件下载 - Go语言中文社区

android--利用Service进行文件下载


Service简介
Service(服务)是四大组件之一,能够长时间的在后台(不和用户交互)运行,能够给当前App或者其他App的组件提供服务。
Service是运行在主线程中的,不能执行耗时的操作,否则也会出现ANR(Application Not Response)错误。
Service生命周期:
1、当用户调用startService方法后,Service会先调用onCreate()方法创建Service,然后调用onStartCommand启动Service,当用户调用stopService方法或者在Service内部调用stopSelf()后,Service会调用onDestroy()销毁Service。
2、当用户调用bindService方法后,Service如果没有启动,会调用onCreate方法创建Service,如果启动了,会直接调用onBind方法进行绑定,当用户调用unbindService方法后,Service会调用onUnbind方法接触绑定,最后如果没有用户使用,会调用onDestroy销毁Service。
PS: 解除绑定后,如果需要重新绑定Service,需要将onUnbind方法返回值设置为true,重新绑定后调用onRebind生命周期方法。

使用Service进行文件下载:



下面就用代码模拟下载:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.day20_service_data.MainActivity">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="下载"
        android:onClick="download"/>
   <!-- <ProgressBar
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:max="100"
        style="@style/Base.Widget.AppCompat.ProgressBar.Horizontal"
        android:id="@+id/pb_progress"/>-->

</LinearLayout>

MainActivity.java
package com.example.day20_service_data;

import android.app.ProgressDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private ProgressBar progressBar;
    private ProgressDialog dialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //找到控件
       // progressBar = (ProgressBar) findViewById(R.id.pb_progress);
        //注册广播接收者
        IntentFilter filter = new IntentFilter();
        filter.addAction("www.huse.edu");
        registerReceiver(mReceiver,filter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //取消广播
        unregisterReceiver(mReceiver);
    }

    /**
     * 按钮事件
     * @param view
     */
    public void download(View view) {
        Intent intent = new Intent(this,MyDownLoadService.class);
        //携带额外数据
        intent.putExtra("url","http://www.baidu.com/xxx.txt");
        //发送数据给service
        startService(intent);
        //创建下载进度条
        dialog = new ProgressDialog(this);
        //设置最大值
        dialog.setMax(100);
        //设置为水平
        dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        dialog.setTitle("下载中......");
        //显示进度条
        dialog.show();
    }
    /**
     * 接收Service发送的进度数据
     */
    BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            //更新进度
            int progress = intent.getIntExtra("progress",0);
            //progressBar.setProgress(progress);
            dialog.setProgress(progress);
            if(progress == 100){
                Toast.makeText(MainActivity.this,"下载完成",Toast.LENGTH_SHORT).show();
                //关闭进度条
                dialog.dismiss();
            }
        }
    };
}
MyDownLoadService.java
package com.example.day20_service_data;

import android.app.Service;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.IBinder;
import android.os.SystemClock;
import android.support.annotation.IntDef;
import android.widget.Toast;

public class MyDownLoadService extends Service {

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        //接收从Activity发来的数据
        String url = intent.getStringExtra("url");
       // Toast.makeText(this,url,Toast.LENGTH_SHORT).show();
        //启动下载任务
        new DownLoadTask().execute(url);
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public IBinder onBind(Intent intent) {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    /**
     * 下载任务
     * 我这里就是模拟下载,就没有解析传递过来的URL了。
     */
    private class DownLoadTask extends AsyncTask<String,Void,String>{

        @Override
        protected String doInBackground(String... params) {
            for(int i = 1; i <= 10; i++){
                //模拟下载发送进度
                Intent intent = new Intent();
                intent.setAction("www.huse.edu");
                intent.putExtra("progress",10*i);
                //休息一秒
                SystemClock.sleep(1000);
                //发送广播
                sendBroadcast(intent);
            }
            return null;
        }
    }
}
如果你用的as直接创建的service就不用去清单文件中进行注册,但是你是创建的类然后继承的service就要去清单文件中进行注册。

运行结果:



版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/ITqingliang/article/details/72731047
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-06-27 23:17:53
  • 阅读 ( 1021 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢