Android 应用更新和在服务器下载android应用

  下载android应用有两种表现形式:一种是交给Android系统的下载管理器;另一种是自己去监控下载。

  1.使用Android下载管理器下载应用并安装

     

public class UpdateService extends Service {

	// 安卓系统下载管理类
	DownloadManager manager;

	// 接收下载完的广播
	DownloadCompleteReceiver receiver;

	// 初始化下载器
	private void initDownManager(String url) {
		
		manager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
		
		receiver = new DownloadCompleteReceiver();

		//设置下载地址
		DownloadManager.Request down = new DownloadManager.Request(
				Uri.parse(url));
		
		// 设置允许使用的网络类型,这里是移动网络和wifi都可以
		down.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE
				| DownloadManager.Request.NETWORK_WIFI);
		
		// 下载时,通知栏显示途中
		down.setNotificationVisibility(Request.VISIBILITY_VISIBLE);
		
		// 显示下载界面
		down.setVisibleInDownloadsUi(true);
		
		// 设置下载后文件存放的位置
		down.setDestinationInExternalFilesDir(this,
				Environment.DIRECTORY_DOWNLOADS, "update.apk");
		
		// 将下载请求放入队列
		manager.enqueue(down);
		
		//注册下载广播
		registerReceiver(receiver, new IntentFilter(
				DownloadManager.ACTION_DOWNLOAD_COMPLETE));
	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		String url= intent.getStringExtra("url");
		// 调用下载
		initDownManager(url);
		
		return 0;
	}

	@Override
	public IBinder onBind(Intent intent) {
	
		return null;
	}

	@Override
	public void onDestroy() {

		// 注销下载广播
		if (receiver != null)
			unregisterReceiver(receiver);
		
		super.onDestroy();
	}

	// 接受下载完成后的intent
	class DownloadCompleteReceiver extends BroadcastReceiver {
		
		@Override
		public void onReceive(Context context, Intent intent) {

			//判断是否下载完成的广播
			if (intent.getAction().equals(
					DownloadManager.ACTION_DOWNLOAD_COMPLETE)) {
				System.out.println("download complete!");
				//获取下载的文件id
				long downId = intent.getLongExtra(
						DownloadManager.EXTRA_DOWNLOAD_ID, -1);
				
				//自动安装apk
				installAPK(manager.getUriForDownloadedFile(downId));
				
				//停止服务并关闭广播
				UpdateService.this.stopSelf();

			}
		}

		/**
		 * 安装apk文件
		 */
		private void installAPK(Uri apk) {
			
			// 通过Intent安装APK文件
			Intent intents = new Intent();
			System.out.println("auto install");
			intents.setAction("android.intent.action.VIEW");
			intents.addCategory("android.intent.category.DEFAULT");
			intents.setType("application/vnd.android.package-archive");
			intents.setData(apk);
			intents.setDataAndType(apk,"application/vnd.android.package-archive");
			intents.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
			//android.os.Process.killProcess(android.os.Process.myPid());
			// 有的设备不加上这句的话在apk安装完成之后点击单开始可能会崩溃
			startActivity(intents);

		}

	}
}
2. 自己监控下载。
public class UpdateDialog extends Dialog implements OnClickListener{

	Button download,cancel;
	String apkurl="http://....../";
	String savePath="/**/**/update/";
	String saveFileName=savePath+"/adf.apk";
<pre name="code" class="java">        ProgressBar mProgress;//进度条
	Context mContext;
<span style="font-size:24px;"></span><pre name="code" class="java">        private static final int DOWN_UPDATE = 1;//下载更新

	private static final int DOWN_OVER = 2;//下载完成

	private static final String TAG = "UpdateManager";

	private int progress;//进度

	private Thread downLoadThread;//下载线程

	public static boolean interceptFlag = false;//是否中断
        public UpdateDialog(Context context,String apkurl)
          {
                super(context);this.apkurl+=apkurlmContext=context;
          }
        @Override
     protected void onCreate(Bundle savedInstanceState)
    {
             super.onCreate(savedInstanceState);
            setContentView(R.layout.update_dialog);
           download=(Button)findViewById(R.id.down);
          cancel=(Button)findViewById(R.id.downcan);
          mProgress=(ProgressBar)findViewById(R.id.progress_update);
           download.setOnClickListener(this);
        cancel.setOnClickListener(this);
       }
        @Override
             public void onClick(View v) {
               switch (v.getId()) 
              { 
                 case R.id.down://点击下载
                 downloadApk(); 
                 dismiss();
                 break;
                case R.id.downcan://取消下载
                 interceptFlag =true;
                 dismiss();
                 break;
               default:
               break;
              }}
            /** * 下载apk */
              private void downloadApk() 
             {
                   downLoadThread = new Thread(mdownApkRunnable);
                   downLoadThread.start();
              }
             ///** * 安装apk */
          private void installApk() 
          {
               File apkfile = new File(saveFileName);
             if (!apkfile.exists()) 
              {
               return;
               }
              Intent i = new Intent();
              i.setAction("android.intent.action.VIEW");
              i.addCategory("android.intent.category.DEFAULT");
              i.setType("application/vnd.android.package-archive");
              i.setData(Uri.parse("file://" + apkfile.toString()));
              i.setDataAndType(Uri.parse("file://" + apkfile.toString()),"application/vnd.android.package-archive");
              i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);mContext.startActivity(i);
           }
             private Runnable mdownApkRunnable = new Runnable() 
             {
               @Override
               public void run() 
              {
                try {
                          URL url = new URL(apkurl);
                          HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                           conn.connect();
                          int length = conn.getContentLength();
                          InputStream is = conn.getInputStream(); 
                           File file = new File(savePath);
                          if (!file.exists()) {
                           file.mkdir();
                              }
                    String apkFile = saveFileName;
                   File ApkFile = new File(apkFile);
                  FileOutputStream fos = new FileOutputStream(ApkFile);
                  int count = 0;
                    byte buf[] = new byte[1024];
                  do {
                    int numread = is.read(buf);
                   count += numread;
                   progress = (int) (((float) count / length) * 100);
                        // 更新进度//
                      mHandler.sendEmptyMessage(DOWN_UPDATE);
                 if (numread <= 0) {
                         // 下载完成通知安装
                   mHandler.sendEmptyMessage(DOWN_OVER);break;
                            }
                     fos.write(buf, 0, numread);
                     } while (!interceptFlag);
                      // 点击取消就停止下载.
                    fos.close();is.close();
                 } 
                catch (MalformedURLException e)
                 {}
               catch (IOException e) 
                  {}}};
                private Handler mHandler = new Handler() 
                 {
                     public void handleMessage(Message msg)
                     {
                      switch (msg.what) {
                            case DOWN_UPDATE:
                              mProgress.setProgress(progress);
                                break;
                            case DOWN_OVER:
                             //下载完成
                                dismiss();
                              installApk();
                                   break;
                             default:break;
                      }};};}

 

 
 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 应用可以通过网络请求来与服务器端进行交互。常见的网络请求方式有以下几种: 1. HttpUrlConnection:使用 Java 标准库提供的 HttpUrlConnection 类来建立和服务器的连接,发送请求和接收响应。 2. OkHttp:一个广泛使用的第三方网络请求库,提供了简单易用的 API,支持同步和异步请求,以及文件上传和下载等功能。 3. Retrofit:另一个广泛使用的第三方网络请求库,基于 OkHttp 实现,使用注解方式定义接口和请求参数,提供了强大的请求和响应转换功能。 4. Volley:Google 推出的网络请求库,提供了方便的 API,支持缓存和图片加载等功能,但已不再维护。 Android 应用需要在清单文件中声明网络权限,例如: ```xml <uses-permission android:name="android.permission.INTERNET" /> ``` 在应用代码中,可以使用上述任意一种网络请求方式来进行网络请求,并处理响应结果。例如,使用 HttpUrlConnection 发送 GET 请求并解析响应: ```java URL url = new URL("http://example.com/api/data"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.connect(); if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) { InputStream inputStream = conn.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String line; StringBuilder result = new StringBuilder(); while ((line = bufferedReader.readLine()) != null) { result.append(line); } bufferedReader.close(); inputStream.close(); String responseData = result.toString(); // 解析响应数据 } conn.disconnect(); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值