Android基於IIS的APK下載(二)顯示更新列表

《Android基於IIS的APK下載(一)自定義更新控件中實現瞭更新控件的自定義,那麼我們要如何引用這些控件並呈現到UI中呢?

首先,我們來定義一下主界面,代碼如下。

activity_main.xml


    

註:

1、界面分成兩部分,第一部分是獲取更新列表的按鈕,第二部分是呈現更新列表。這兩部分我們用LinearLayout垂直佈局來實現。

2、在呈現更新列表的部分,我們使用ListView,然後代碼中灌入數據。灌入數據,我們使用Adapter的形式來實現。下面是實現的代碼。

UpdateItemsAdapter.java

package com.example.apkupdate;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.content.pm.PackageInfo;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import com.kitsp.contentsp.IntentSp;
import com.kitsp.httpsp.REQUEST_KEYS;
import com.kitsp.httpsp.REQUEST_MESSAGES;
import com.kitsp.httpsp.RequestSp;
import com.kitsp.widgetsp.MessageBoxSp;

public class UpdateItemsAdapter extends BaseAdapter {
	private List _updateItems = null;
	private Context _context = null;
	public UpdateItemsAdapter(List updateItems, Context context) {
		_updateItems = updateItems;
		_context = context;		
	}
	
	@Override
	protected void finalize() throws Throwable {
		// TODO Auto-generated method stub
		super.finalize();
	}

	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		if (_updateItems.isEmpty()) {
			return 0;
		}
		return _updateItems.size();
	}

	@Override
	public Object getItem(int position) {
		if (_updateItems.isEmpty()) {
			return null;
		}
		return _updateItems.get(position);
	}

	@Override
	public long getItemId(int position) {
		if (_updateItems.isEmpty()) {
			return 0;
		}
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		if (_context == null) {
			return null;
		}

		UpdateItem updateItem = (UpdateItem) getItem(position);
		if (updateItem == null) {
			return null;
		}

		View updateItemLayout = View.inflate(_context, R.layout.update_item,
				null);
		if (updateItemLayout == null) {
			return null;
		}

		ImageView app_imageView = (ImageView) updateItemLayout
				.findViewById(R.id.update_item_app_image);
		TextView appName_textView = (TextView) updateItemLayout
				.findViewById(R.id.update_item_app_name);
		TextView appOldVersion_textView = (TextView) updateItemLayout
				.findViewById(R.id.update_item_app_old_version);
		TextView appNewVersion_textView = (TextView) updateItemLayout
				.findViewById(R.id.update_item_new_version);
		final Button behavior_button = (Button) updateItemLayout
				.findViewById(R.id.update_item_behavior);
	
		String oldVersion=FetchPackageVersion(updateItem.GetFeaturePackage());
		if(oldVersion!=null&&oldVersion.length()>0)
		{
			updateItem.SetOldVersion(oldVersion);
		}
		
		appName_textView.setText(updateItem.GetName());		
		appOldVersion_textView.setText(updateItem.GetOldVersion());
		appNewVersion_textView.setText(updateItem.GetNewVersion());
		boolean isNewVersion = IsNewVersion(updateItem.GetOldVersion(),
				updateItem.GetNewVersion());

		updateItem.SetBehavior(isNewVersion ? UPDATE_BEHAVIORS.UPDATE
				: UPDATE_BEHAVIORS.NO_UPDATE);

		behavior_button.setEnabled(isNewVersion);
		behavior_button.setText(updateItem.GetBehavior());
		behavior_button.setTag(updateItem);

		behavior_button.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				ExecuteBehavior(behavior_button);
			}
		});
		return updateItemLayout;
	}
	
	private String FetchPackageVersion(String packageName) {

		if (packageName == null || packageName.length() <= 0) {
			return null;
		}

		List packages = _context.getPackageManager()
				.getInstalledPackages(0);
		for (int i = 0; i < packages.size(); i++) {
			PackageInfo packageInfo = packages.get(i);
			if (packageInfo.packageName.equals(packageName)) {
				return packageInfo.versionName;
			}
		}

		return null;
	}

	private boolean IsNewVersion(String oldVersion, String newVersion) {
		if (newVersion == null || newVersion.length() <= 0) {
			return false;
		}

		if (oldVersion == null || oldVersion.length()  news.length) ? news.length
				: olds.length;

		for (int index = 0; index  Integer.parseInt(news[index])) {
				return false;
			} else if (Integer.parseInt(olds[index]) olds.length) {
			return true;
		}
		return false;
	}
}

註:

1、UpdateItemsAdapter繼承自BaseAdapter,然後重載相應的方法。關鍵是getView的重載。

2、在getView中,我們獲取瞭update_item.xml的佈局,然後抓取相關的控件,並填入數據。在獲取update_item.xml的佈局時,需要一個context,所以UpdateItemsAdapter的構造函數中需要傳入一個context,以方便使用。

3、UpdateItem是自定義的一個類,具體可以參考後面的代碼。

4、在updateItem中有一個GetFeaturePackage()函數,獲取相應的特征包的名稱,根據該特征包的名稱從機器中獲取相應的版本信息。該特征包的名稱會在服務器中進行配置,以便於更靈活的更新。當然如果要實現各個包的更新,可以增加更詳細的明細表來實現。

5、IsNewVersion通過新舊版本的比較,判斷安裝包是否是最新的,然後在behavior_button中呈現相應的行為。

6、對於ExecuteBehavior(behavior_button)將會在後文中實現,該函數的主要功能就是根據不同的行為執行不同的動作,如更新、下載、安裝等。

UpdateItem.java

package com.example.apkupdate;


public class UpdateItem {
	
	private String _name="";
	private String _featurePackage="";
	private String _oldVersion=UPDATE_BEHAVIORS.NOT_INSTALL;
	private String _newVersion="";
	private String _url="";
	private String _behavior=UPDATE_BEHAVIORS.NOT_INSTALL;
	private String _savePath="";

	
	public void SetName(String name)
	{
		_name=name;
	}
	
	public String GetName()
	{
		return _name;
	}
	
	public void SetFeaturePackage(String featurePackage)
	{
		_featurePackage=featurePackage;
	}
	
	public String GetFeaturePackage()
	{
		return _featurePackage;
	}
	
	public void SetOldVersion(String oldVersion)
	{
		_oldVersion=oldVersion;
	}
	
	public String GetOldVersion()
	{
		return _oldVersion;
	}
	
	public void SetNewVersion(String newVersion)
	{
		_newVersion=newVersion;
	}
	
	public String GetNewVersion()
	{
		return _newVersion;
	}
	
	public void SetUrl(String url)
	{
		_url=url;
	}
	
	public String GetUrl()
	{
		return _url;
	}
	
	public void SetBehavior(String behavior)
	{
		_behavior=behavior;
	}
	
	public String GetBehavior()
	{
		return _behavior;
	}
	
	public void SetSavePath(String savePath)
	{
		_savePath=savePath;
	}
	
	public String GetSavePath()
	{
		return _savePath;
	}
}

UPDATE_BEHAVIORS.java

package com.example.apkupdate;

public class UPDATE_BEHAVIORS {
	public final static String NOT_INSTALL="Not Install";
	public final static String UPDATE="Update";
	public final static String INSTALL="Install";
	public final static String NO_UPDATE="No Update";
}

這裡我們已經將更新列表給顯示出來瞭,但是更新列表的數據從何而來呢?

請參看後文Android基於IIS的APK下載(三)用JSON傳輸更新數據
轉載請註明出處Android基於IIS的APK下載(二)顯示更新列表
完整代碼在此處下載https://github.com/sparkleDai/ApkUpdate

發佈留言