- 浏览: 534619 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
tangyunliang:
大哥你太历害了谢谢
Android基于XMPP Smack Openfire开发IM【四】初步实现两个客户端通信 -
u013015029:
LZ,请问下,在// 添加消息到聊天窗口 , 这里获取Ed ...
Android基于XMPP Smack Openfire开发IM【四】初步实现两个客户端通信 -
endual:
怎么保持会话,我搞不懂啊
Android基于XMPP Smack Openfire开发IM【一】登录openfire服务器 -
donala_zq:
显示:[2013-11-30 11:50:36 - Andro ...
android-----------新浪微博 -
donala_zq:
哥,运行不了啊
android-----------新浪微博
运行效果图:
工程结构图:
xml:
AndroidManifest.xml
项目源码:
工程结构图:
package com.cn.do1.downloadtest; import com.cn.do1.downloadtest.service.DownloadService; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.KeyEvent; import android.view.View; import android.view.View.OnClickListener; public class DownloadTest extends Activity implements OnClickListener{ @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.down_file); Intent intent = new Intent(this,DownloadService.class); startService(intent); bindListener(); } void bindListener(){ findViewById(R.id.btn_load_btn_one).setOnClickListener(this); findViewById(R.id.btn_load_btn_two).setOnClickListener(this); findViewById(R.id.btn_load_btn_three).setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_load_btn_one: DownloadService.downNewFile("http://m.appchina.com/market/e/882602/0/16/44DFFDF6E89D0CC2F5CB41CE041E9BB7/packagename.apk?refererPage=m.cherry.soft_list", 351, "百度知道"); break; case R.id.btn_load_btn_two: DownloadService.downNewFile("http://m.appchina.com/market/e/886657/feature/1/360F5D5A76A3E0E397451CE9EA503DE6/com.sogou.novel?refererPage=m.cherry.soft_main", 1071, "搜狗小说"); break; case R.id.btn_load_btn_three: DownloadService.downNewFile("http://m.appchina.com/market/e/885495/feature/2/360F5D5A76A3E0E397451CE9EA503DE6/com.king2.yyh?refererPage=m.cherry.soft_main", 1072, "君王2(新服开启)"); break; default: break; } } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub if(keyCode==KeyEvent.KEYCODE_BACK) { System.exit(0); return false; } return super.onKeyDown(keyCode, event); } }
package com.cn.do1.downloadtest.service; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import com.cn.do1.downloadtest.DownloadTest; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.app.Service; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.IBinder; import android.os.Looper; import android.os.Message; import android.widget.Toast; public class DownloadService extends Service{ private static NotificationManager nm; private static Notification notification; private static boolean cancelUpdate = false; private static MyHandler myHandler; private static ExecutorService executorService = Executors.newFixedThreadPool(5); // 固定五个线程来执行任务 public static Map<Integer,Integer> download = new HashMap<Integer, Integer>(); public static Context context; @Override public IBinder onBind(Intent intent) { return null; } @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); } @Override public void onCreate() { super.onCreate(); nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); myHandler = new MyHandler(Looper.myLooper(), DownloadService.this); context = this; } @Override public void onDestroy() { super.onDestroy(); } public static void downNewFile(final String url,final int notificationId,final String name){ if(download.containsKey(notificationId)) return; notification = new Notification(); notification.icon = android.R.drawable.stat_sys_download; // notification.icon=android.R.drawable.stat_sys_download_done; notification.tickerText = name + "开始下载"; notification.when = System.currentTimeMillis(); notification.defaults = Notification.DEFAULT_LIGHTS; //显示在“正在进行中” notification.flags = Notification.FLAG_NO_CLEAR | Notification.FLAG_ONGOING_EVENT; PendingIntent contentIntent = PendingIntent.getActivity(context, notificationId,new Intent(context, DownloadTest.class), 0); notification.setLatestEventInfo(context, name, "0%", contentIntent); download.put(notificationId, 0); // 将下载任务添加到任务栏中 nm.notify(notificationId, notification); // 启动线程开始执行下载任务 downFile(url,notificationId,name); } // 下载更新文件 private static void downFile(final String url,final int notificationId,final String name) { executorService.execute(new Runnable() { @Override public void run() { // TODO Auto-generated method stub File tempFile = null; 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(),"/zhtrade"); if (!rootFile.exists() && !rootFile.isDirectory()) rootFile.mkdir(); tempFile = new File(Environment.getExternalStorageDirectory(),"/zhtrade/"+ url.substring(url.lastIndexOf("/"),url.indexOf("?"))+"_"+notificationId+".apk"); 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); // 每下载完成1%就通知任务栏进行修改下载进度 if (precent - download.get(notificationId) >= 1) { download.put(notificationId, precent); Message message = myHandler.obtainMessage(3,precent); Bundle bundle = new Bundle(); bundle.putString("name", name); message.setData(bundle); message.arg1 = notificationId; myHandler.sendMessage(message); } } bos.flush(); bos.close(); fos.flush(); fos.close(); is.close(); bis.close(); } if (!cancelUpdate) { Message message = myHandler.obtainMessage(2, tempFile); message.arg1 = notificationId; Bundle bundle = new Bundle(); bundle.putString("name", name); message.setData(bundle); myHandler.sendMessage(message); } else { tempFile.delete(); } } catch (ClientProtocolException e) { if (tempFile.exists()) tempFile.delete(); Message message = myHandler.obtainMessage(4, name+"下载失败:网络异常!"); message.arg1 = notificationId; myHandler.sendMessage(message); } catch (IOException e) { if (tempFile.exists()) tempFile.delete(); Message message = myHandler.obtainMessage(4, name+"下载失败:文件传输异常"); message.arg1 = notificationId; myHandler.sendMessage(message); } catch (Exception e) { if (tempFile.exists()) tempFile.delete(); Message message = myHandler.obtainMessage(4, name+"下载失败,"+e.getMessage()); message.arg1 = notificationId; myHandler.sendMessage(message); } } }); } // 安装下载后的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) { PendingIntent contentIntent = null; super.handleMessage(msg); if (msg != null) { switch (msg.what) { case 0: Toast.makeText(context, msg.obj.toString(),Toast.LENGTH_SHORT).show(); download.remove(msg.arg1); break; case 1: break; case 2: contentIntent = PendingIntent.getActivity(DownloadService.this, msg.arg1,new Intent(DownloadService.this, DownloadTest.class), 0); notification.setLatestEventInfo(DownloadService.this, msg.getData().getString("name")+"下载完成", "100%",contentIntent); nm.notify(msg.arg1, notification); // 下载完成后清除所有下载信息,执行安装提示 download.remove(msg.arg1); nm.cancel(msg.arg1); Instanll((File) msg.obj, context); break; case 3: contentIntent = PendingIntent.getActivity(DownloadService.this, msg.arg1,new Intent(DownloadService.this, DownloadTest.class), 0); notification.setLatestEventInfo(DownloadService.this, msg.getData().getString("name")+"正在下载", download.get(msg.arg1) + "%",contentIntent); nm.notify(msg.arg1, notification); break; case 4: Toast.makeText(context, msg.obj.toString(),Toast.LENGTH_SHORT).show(); download.remove(msg.arg1); nm.cancel(msg.arg1); break; } } } } }
xml:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:paddingLeft="3dp" android:paddingRight="3dp" > <Button android:id="@+id/btn_load_btn_one" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:text="开始一" /> <Button android:id="@+id/btn_load_btn_two" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/btn_load_btn_one" android:layout_centerHorizontal="true" android:layout_marginTop="20dip" android:text="开始二" /> <Button android:id="@+id/btn_load_btn_three" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_below="@+id/btn_load_btn_two" android:layout_marginTop="20dip" android:text="开始三" /> </RelativeLayout>
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.cn.do1.downloadtest" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="7" /> <uses-permission android:name="androd.permission.INSTALL_PACKAGES" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.INTERNET"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".DownloadTest"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name="com.cn.do1.downloadtest.service.DownloadService" android:label="DownloadService" ></service> </application> </manifest>
项目源码:
发表评论
-
android刮开效果
2013-12-04 14:58 0效果图: [img] [/img] package c ... -
火力篮球源码
2013-12-02 10:49 0效果图: [img] [/img] 源码: -
捏死它源码
2013-12-02 10:46 0捏死他源码: [img] [/img] 源码: -
Login的一些demo
2013-11-29 17:26 0login demo jar包混淆用的三个文件夹 -
圆形的进度条
2013-11-26 10:48 0效果图: [img] [/img] 源码: -
高仿丁丁优惠客户端
2013-11-26 10:45 0效果图: [img] [/img] [img] [/im ... -
仿腾讯新闻之内容定制
2013-11-19 13:51 0效果图: [img] [/img] [img] [/img ... -
客户端与服务端交互在线订餐app,功能流程仿俏江南app
2013-11-19 13:42 0知识点如下: 购物车模块 百度地图模块 ... -
视频聊天软件源码
2013-11-13 09:40 0效果图: [img] [/img] 源码: ... -
代码收藏:旋转木马效果
2013-10-21 09:41 0效果图: 源码: -
仿360悬浮窗效果
2013-10-11 16:40 0demo运行效果: 源码: -
Activity的一些进入退出动画
2013-09-26 09:11 0效果图: -
动画:图片移动到右下角
2013-09-25 15:17 0图片移动到右下角动画,简单学习一下。 -
仿360悬浮窗效果
2013-09-17 15:32 0效果不错 注释清楚 悬浮窗 -
android上的软件提示导航界面
2013-07-24 11:44 0... -
悬浮view(全部内存与使用内存)
2013-07-22 11:32 898http://daikainan.iteye. ... -
Android应用开发——Tencent微博(抽屉UI类型)
2013-06-13 09:17 0源码: -
android底部菜单栏demo
2013-06-20 09:26 869效果图: 源码: -
android二级listview列表
2013-06-09 10:18 0实现大众点评客户端的横向listview二级列表,先看一下样式 ... -
android书架效果
2013-06-09 10:09 0效果图: 源码:
相关推荐
"Service下载apk通过notification显示下载进度"这个主题涉及到的是如何利用Service来下载APK,并且通过通知栏(Notification)实时更新下载进度,下载完成后自动安装APK。这里将详细讲解这一过程的关键知识点。 ...
这个服务通过通知(notification)向用户展示下载进度,并在下载完成后自动进行安装。 【核心知识点】 1. **Android Service**:Service是Android系统中的一个组件,用于在后台执行长时间运行的操作,即使用户离开...
功能:从网上下载apk存储到手机指定目录,并在通知栏里显示其下载进度,如果下载错误,或者不想要该apk可以删除 涉及知识: 文件流、网络下载链接协议、读写权限、Handler、Notification、跑马灯
开发者可以注册一个广播接收器,监听下载状态的变化,如完成、失败等,然后使用`Intent`启动安装流程,通过`Intent.ACTION_VIEW`和`Intent.FLAG_ACTIVITY_NEW_TASK`标记指定下载完成的APK文件。 在描述中提到,由于...
在Android系统中,"通知栏显示下载进度"是一项常见的功能,它允许用户在不打开特定应用的情况下,通过通知栏了解下载任务的当前状态。这种功能的实现涉及到Android的通知管理、多线程下载以及文件处理等多个知识点。...
以上就是一个基本的Android Service下载文件并显示Notification进度的例子。它展示了如何在后台执行耗时操作,如文件下载,并通过Notification向用户反馈进度。请注意,实际的下载任务可能需要处理更多细节,例如...
5. **处理完成与失败**:当下载完成后,通知中可以提供一个安装按钮,点击后调用`Intent.ACTION_VIEW`启动下载完成的apk文件。如果下载失败,通知可以提供重试选项。在Android 8.0上,还需要处理权限问题,例如请求`...
总结来说,实现“android检测版本更新,通知栏显示下载进度”的功能,需要涉及以下几个关键步骤:检测新版本、创建`DownloadManager`请求、监听下载进度并更新通知栏、处理下载完成后的操作。通过以上方法,我们可以...
在下载过程中,我们通过`Notification`向用户显示进度。`Notification`是Android系统提供的一种在状态栏显示消息的方式。我们可以创建一个`NotificationCompat.Builder`,设置通知的标题、内容、图标等属性,并利用...
有2个下载案例 大家可酌情考虑运用...1. 服务1 okhttp + notification 通知栏带进度的下载apk 实现自动安装 点击通知栏安装 自定义通知栏样式 静默下载等 提供忽略当前版本 2. 服务2 运用downloadManager实现相同的效果
下载完成后,我们还需要在Intent中添加ACTION_VIEW的动作,指向下载好的APK文件,创建一个安装Intent,并使用`PendingIntent`与Notification关联,这样用户点击通知就能直接启动安装流程。 总结来说,Android应用的...
系统会提示用户确认安装,安装完成后,用户可以选择立即打开新版本的应用。 8. **权限管理**:由于涉及到文件下载和安装,应用需要获取相应的权限,如INTERNET权限(用于网络访问)和WRITE_EXTERNAL_STORAGE权限...
这个示例可能包含了设置DownloadManager、创建自定义Notification、监听下载状态变化以及处理下载完成后的APK安装等核心功能。通过分析和学习这个示例,开发者可以更好地理解如何在自己的应用中实现类似的功能。 在...
"Android检查更新,文件下载后自动安装demo"就是一个用于实现这一功能的示例项目。在这个项目中,开发者自定义了一个下载管理器,适用于Android 7.0及以上版本,解决了在不同Android系统版本中进行文件下载和更新的...
3. 安装更新:下载完成后,可以使用`Intent`启动安装过程。对于APK文件,可以通过`ACTION_VIEW` Intent启动系统安装器。注意,需要在AndroidManifest.xml中声明`<uses-permission>`来允许安装未知来源的应用。 4. ...
其次,**通知栏下载**是指在用户同意更新后,更新进程会在后台进行,同时在通知栏显示下载进度。这种设计允许用户继续使用手机或其他设备,而无需一直关注下载过程。Android系统提供了Notification API,开发者可以...
在Android开发中,当涉及到文件下载,特别是大型文件如APK的下载时,通常需要对下载进度进行实时监控,并向用户展示进度更新,同时在下载完成或失败时发送通知。本文将详细介绍如何实现这一功能。 首先,我们创建一...
5. **安装更新**:下载完成后,需要在后台静默安装APK。Android 7.0及以上版本需要在外部存储权限允许的情况下才能执行此操作。可以使用`Intent`和`ACTION_VIEW`来启动安装流程。 6. **处理异常情况**:确保在下载...
在自动更新过程中,我们可以通过Notification展示下载进度,提供取消更新的选项,以及在下载完成后通知用户安装更新。 以下是使用Notification的步骤: 1. **创建NotificationChannel**:对于Android O及以上版本...