`
WilliamLiu
  • 浏览: 27085 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Android 自动更新之状态栏下载状态和进度

 
阅读更多

     android 自动检测版本在这里就不用说了,今天想和大家一起分享的是如何将下载更新文件最小化到任务栏下载,替代掉丑陋的对话框提示下载,对话框提示下载的用户体验相当不好,我们把它修改成为后台下载这样可以改善用户的使用体验。

    废话就不多说了,直接贴代码。首先要创建一个Service来执行下载更新文件的任务:

     public class UpdateService extends Service{
             private NotificationManager nm;
             private Notification notification;
             private File tempFile=null;
             private boolean cancelUpdate=false;
             private MyHandler myHandler;
             private int download_precent=0;
             private RemoteViews views; 
             private int notificationId=1234;
 
             @Override
             public IBinder onBind(Intent intent) {
                    return null;
              }
 
             @Override
             public void onStart(Intent intent,int startId){
                   super.onStart(intent, startId);
             }
 
             @Override
             public int onStartCommand(Intent intent,int flags,int startId){
                   nm=(NotificationManager)getSystemService(NOTIFICATION_SERVICE);
                   notification=new Notification();
                   notification.icon=android.R.drawable.stat_sys_download;
                  //notification.icon=android.R.drawable.stat_sys_download_done;
                  notification.tickerText=getString(R.string.app_name)+"更新";
                  notification.when=System.currentTimeMillis();
                  notification.defaults=Notification.DEFAULT_LIGHTS;

                  //设置任务栏中下载进程显示的views
                  views=new RemoteViews(getPackageName(),R.layout.update);
                  notification.contentView=views;
  
                  PendingIntent contentIntent=PendingIntent.getActivity(this,0,new Intent(this,City.class),0);
                  notification.setLatestEventInfo(this,"","", contentIntent);

                  //将下载任务添加到任务栏中
                  nm.notify(notificationId,notification);
  
                  myHandler=new MyHandler(Looper.myLooper(),this);

                  //初始化下载任务内容views
                  Message message=myHandler.obtainMessage(3,0);
                  myHandler.sendMessage(message);

                  //启动线程开始执行下载任务
                  downFile(intent.getStringExtra("url"));
                  return super.onStartCommand(intent, flags, startId);
           }
 
          @Override
          public void onDestroy(){
             super.onDestroy();
          }

 

         //下载更新文件
         private void downFile(final String url) {
            new Thread() {
                  public void run(){
                      try {     
                            HttpClient client = new DefaultHttpClient();     
                           // params[0]代表连接的url     
                          HttpGet get = new HttpGet(url);        
                          HttpResponse response = client.execute(get);     
                          HttpEntity entity = response.getEntity();     
                          long length = entity.getContentLength();     
                          InputStream is = entity.getContent();
                          if (is != null) {
                                 File rootFile=new File(Environment.getExternalStorageDirectory(), "/pinke");
                                 if(!rootFile.exists()&&!rootFile.isDirectory())
                                      rootFile.mkdir();
                     
                                 tempFile = new File(Environment.getExternalStorageDirectory(),

                                                                           "/pinke/"+url.substring(url.lastIndexOf("/")+1));
                                if(tempFile.exists())
                                      tempFile.delete();
                                tempFile.createNewFile();
                        
                                //已读出流作为参数创建一个带有缓冲的输出流
                                BufferedInputStream bis = new BufferedInputStream(is);
                
                                //创建一个新的写入流,讲读取到的图像数据写入到文件中
                                FileOutputStream fos = new FileOutputStream(tempFile);
                                //已写入流作为参数创建一个带有缓冲的写入流
                                BufferedOutputStream bos = new BufferedOutputStream(fos);  
                           
                                 int read; 
                                 long count=0;
                                 int precent=0;
                                 byte[] buffer=new byte[1024];
                                 while( (read = bis.read(buffer)) != -1 && !cancelUpdate){  
                                     bos.write(buffer,0,read);
                                     count+=read;
                                     precent=(int)(((double)count/length)*100);

                                     //每下载完成5%就通知任务栏进行修改下载进度
                                     if(precent-download_precent>=5){
                                         download_precent=precent;
                                         Message message=myHandler.obtainMessage(3,precent);
                                         myHandler.sendMessage(message);    
                                    }
                              }   
                              bos.flush();
                             bos.close();
                             fos.flush();
                             fos.close();
                             is.close();
                             bis.close(); 
                        }     
                    
                        if(!cancelUpdate){
                            Message message=myHandler.obtainMessage(2,tempFile);
                           myHandler.sendMessage(message); 
                       }else{
                           tempFile.delete();
                      }
                  } catch (ClientProtocolException e) {  
                         Message message=myHandler.obtainMessage(4,"下载更新文件失败");
                         myHandler.sendMessage(message); 
                  } catch (IOException e) {
                        Message message=myHandler.obtainMessage(4,"下载更新文件失败");
                        myHandler.sendMessage(message); 
                  } catch(Exception e){
                        Message message=myHandler.obtainMessage(4,"下载更新文件失败");
                        myHandler.sendMessage(message); 
                  }
              }
          }.start();       
      }

 

      //安装下载后的apk文件
      private void Instanll(File file,Context context){
           Intent intent = new Intent(Intent.ACTION_VIEW);   
           intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
           intent.setAction(android.content.Intent.ACTION_VIEW);
           intent.setDataAndType(Uri.fromFile(file),"application/vnd.android.package-archive");    
           context.startActivity(intent);     
      }   

 

      /*事件处理类*/
     class MyHandler extends Handler{
             private Context context;
             public MyHandler(Looper looper,Context c){
                 super(looper);
                this.context=c;
             }
  
            @Override
            public void handleMessage(Message msg){
                      super.handleMessage(msg);
                     if(msg!=null){
                           switch(msg.what){
                                 case 0:
                                         Toast.makeText(context,msg.obj.toString(), Toast.LENGTH_SHORT).show();
                                         break;
                                 case 1:
                                        break;
                                 case 2:

                                         //下载完成后清除所有下载信息,执行安装提示
                                        download_precent=0;
                                        nm.cancel(notificationId);
                                        Instanll((File)msg.obj,context);

                                        //停止掉当前的服务
                                        stopSelf();
                                        break;
                                case 3:

                                      //更新状态栏上的下载进度信息
                                      views.setTextViewText(R.update_id.tvProcess,"已下载"+download_precent+"%");
                                      views.setProgressBar(R.update_id.pbDownload,100,download_precent,false);
                                      notification.contentView=views;
                                      nm.notify(notificationId,notification);
                                      break;
                              case 4:
                                    nm.cancel(notificationId);
                                break;
                            }
                        }
                  }
          }

   }

    下载更新提示的布局xml:

    <?xml version="1.0" encoding="utf-8"?>
   <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       android:orientation="vertical"
       android:background="#f2f2f2" >
       <LinearLayout 
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:orientation="horizontal"
          android:gravity="center">
          <ImageView 
              android:id="@+update_id/ivLogo"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:src="@drawable/logo"
              android:layout_margin="10dip" />
          <LinearLayout 
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:orientation="vertical"
              android:layout_weight="1"
              android:layout_marginRight="10dip">
              <TextView 
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:textColor="@color/deepblack"
                  android:text="@string/app_name"
                  android:textSize="18dip"
                  android:textStyle="bold"/>
              <ProgressBar 
                  android:id="@+update_id/pbDownload"
                  android:layout_width="fill_parent"
                  android:layout_height="12dip"
                  android:progress="0"
                  android:max="100"
                  android:progressDrawable="@drawable/pb_style"
                  style="?android:attr/progressBarStyleHorizontal" 
                  mce_style="?android:attr/progressBarStyleHorizontal"   />
              <TextView 
                  android:id="@+update_id/tvProcess"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:textColor="@color/deepblack"
                  android:text="已下载0%"
                  android:textSize="12dip"
                 android:textStyle="bold" />
         </LinearLayout>
      </LinearLayout>

    </LinearLayout>

 在外面需要调用下载任务的地方使用startService(intent)来调用这个Service就可以了,最终的效果图片

  • 大小: 41.2 KB
分享到:
评论

相关推荐

    android实现后台下载状态栏显示进度

    本文将详细讲解如何实现一个Android应用,它能在后台执行文件下载任务,并在状态栏显示下载进度,下载完成后自动提示用户安装。这个功能的实现主要涉及以下几个关键知识点: 1. **IntentService**: - ...

    状态栏显示进度的版本更新

    在“状态栏显示进度的版本更新”中,我们关注的是如何在用户界面中提供一个直观、友好的更新体验,特别是通过状态栏来展示下载进度。这种设计能够使用户在使用应用的同时,对后台的更新过程有清晰的认知,避免了因...

    android通知栏提示下载进度源码

    - 当下载进度改变时,通过`NotificationManager`的`notify()`方法更新通知,传入通知ID和更新后的`Notification`对象。 4. **使用Service进行后台下载** - 下载任务通常在后台Service中执行,因为Activity可能被...

    android中DownloadManager实现版本更新,监听下载进度实例

    通过上述步骤,可以实现一个Android应用的自动更新功能,并且能够实时监听下载进度,向用户反馈当前的下载状态。这个过程对于开发者来说既高效又方便,使得更新应用这一功能变得可靠而用户友好。

    动态更新状态栏信息.rar

    注意,图标应该为白色背景或透明背景,因为Android会自动为状态栏中的图标添加黑色或白色的遮罩。 4. **动态更新通知** 要动态更新状态栏信息,可以创建一个新的Notification对象,但保持相同的`notificationId`。...

    android状态栏通知

    在Android系统中,状态...综上所述,创建和管理Android状态栏通知涉及多个方面,包括基本内容的设置、优先级和可见性的设定、扩展功能的利用以及渠道管理和更新策略。理解这些知识点有助于构建用户体验良好的通知系统。

    通知栏下载进度

    在Android平台上,实现通知栏下载进度的功能需要使用Notification类和NotificationManager服务。首先,创建一个NotificationChannel来定义通知的类别和行为,这在Android Oreo(8.0)及更高版本中是必需的。接着,...

    通知栏显示下载进度

    在Android系统中,"通知栏显示下载进度"是一项常见的功能,它允许用户在不打开特定应用的情况下,通过通知栏了解下载任务的当前状态。这种功能的实现涉及到Android的通知管理、多线程下载以及文件处理等多个知识点。...

    Android自动下载更新app

    总之,实现Android自动下载更新app涉及到网络请求、文件下载、通知管理、权限控制等多个环节,开发者需要对Android系统有深入理解才能实现这个功能。在整个过程中,需要注意安全性和用户体验,以提供稳定、便捷的...

    Android自动更新(支持7.0)

    4. **通知栏进度显示**:为了实时反馈下载进度,我们可以利用`DownloadManager`的监听机制,当下载状态改变时,更新通知栏信息,展示下载进度。 5. **安装更新**:下载完成后,我们需要调用`ACTION_VIEW`意图来安装...

    android 应用更新功能 检测更新 自动下载安装 demo updatedemo

    在Android应用开发中,实现应用自动检测更新、下载并安装的功能是提高用户体验和保持软件最新状态的关键。"updatedemo"通常是指一个示例项目,它展示了如何构建这样的更新机制。以下将详细介绍这个过程中的关键知识...

    Android 断点下载文件通知栏提示

    Android的通知栏是与用户交互的重要途径,用于显示下载进度和状态。使用`NotificationCompat.Builder`来创建通知,设置标题、内容、图标以及进度条。可以使用`setProgress()`方法来显示下载进度,`setOngoing(true)...

    检测更新,通知栏下载更新进度

    "检测更新,通知栏下载更新进度"这个主题涉及到的是应用自动检测新版本并以非侵入式方式通知用户的过程,让用户可以在后台轻松地下载更新。下面将详细讨论这一过程中的关键知识点。 首先,**检测更新**通常是通过在...

    android 自动提示软件更新

    4. **进度通知**:为了向用户提供下载进度,可以注册监听`DownloadManager`的广播接收器,当下载状态发生变化时,更新通知栏的通知。通知栏可以显示已下载的百分比、速度等信息,让用户了解下载进度。 5. **权限...

    android自动更新源码

    3. 解析服务器响应,提取版本号和更新描述。 4. 比较本地版本号与服务器版本号,判断是否需要更新。 下载更新部分,`VersionUpdate`类可能使用`DownloadManager`或者自定义的下载服务。`DownloadManager`是Android...

    android 多任务下载,并在下载管理界面刷新进度条

    这个管理器可以使用HashMap或其他数据结构来存储下载任务,键为下载任务的标识,值为任务状态和进度信息。 4. **进度更新** 每个下载任务在执行过程中,应该定期更新其进度,可以通过回调机制通知下载管理器。管理...

    Android notification+Service实时更新

    本项目"Android notification+Service实时更新"就是利用这些组件来构建一个功能,即在后台进行文件下载并实时更新用户通知栏的状态,当下载失败时允许用户重新尝试,下载成功后可自动安装。 首先,我们来看`...

    android带通知栏的版本更新

    综上所述,"android带通知栏的版本更新"涉及到Android服务、下载管理器、通知系统、权限管理和用户界面更新等多个关键知识点。通过这些技术,开发者可以构建出一个高效且用户友好的版本更新系统,确保用户能及时获取...

    Android-利用了EventBusretrofit2支持状态栏着色的systembartint

    在Android应用开发中,我们经常需要对状态栏进行自定义着色,以达到与应用界面更好的融合和美观效果。在给定的标题“Android-利用了EventBus,retrofit2 支持状态栏着色的systembartint”中,我们可以看到两个关键的...

    android自动更新异步线程和NOTIFICATION的方式

    Notification可以在状态栏显示提示,即使应用不在前台运行,用户也能得知下载进度或完成情况。创建Notification需要使用`NotificationCompat.Builder`类,设置通知的标题、内容、图标、声音、震动等属性。同时,可以...

Global site tag (gtag.js) - Google Analytics