您好,登錄后才能下訂單哦!
今天在做應用升級的模塊的時候,給大家分享一下升級的相關代碼模塊,在升級的過程前期的下載,和現在彈出的相關窗體這些的沒有什么難度的,就是有個重要的地方,在每次要刷新下載進度更新的時候,要給個有條件更新,如果每次夠讓他跟新的,會導致應用邊卡,引發CF等問題,下面是相關的代碼分享,若其他問題可以私聊我!!!
本應用用到了兩個開源庫:
需要的人找我私聊
public class MainActivity extends Activity {
private int mCurVersion;
private ObjUpData updata;
private static NotificationManager mNm;
private static RemoteViews mrRemoteViews;
private static Notification notification;
private static int tmp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mNm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// 點擊下載
findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
updatautil();
}
});
//若點擊下載后,在點別的會倒是CF
findViewById(R.id.button2).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "卡了!!我就呵呵了", Toast.LENGTH_SHORT).show();
}
});
}
public int getCurrentVersion() {
PackageInfo info = null;
try {
PackageManager pm = getPackageManager();
info = pm.getPackageInfo(getPackageName(), 0);
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.e("getCurrentVersion", "info.versionCode=" + info.versionCode);
return info.versionCode;
}
private void updatautil() {
// 小模塊:實現版本升級
// 打開應用
// ---->有新版本,彈出dialog(更新了xx功能,修復了xxbug,提升自動定位的準確性...);
// 如果點擊取消就不更新,
// 點擊確定才開始下載最新安裝包
// --->下載完成,下拉點擊,跳轉到安裝界面
// 有新版本,彈出dialog
// 獲取當前版本
mCurVersion = getCurrentVersion();
// 獲取新版本,下載文件,解析得到文件中所有數據
HttpUtil.post("http://192.168.1.103:8080/tins//equRgController/doDownloadNewVersion.do",//下載路徑
new RequestParams(), new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, String content) {
Log.e("HttpUtil.post", "statusCode=" + statusCode + "headers=" + headers + "content=" + content);
UpData data = new Gson().fromJson(content, UpData.class);
updata = data.getObj();
// 得到新版本號
int newVersion = updata.getVersion();
// 將新版本號跟就版本進行比較
if (newVersion > mCurVersion) {
// 彈出dialog提示是否需要更新并顯示更新簡介
showMyDialog();
}
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable error, String content) {
}
});
}
private void showMyDialog() {
final Dialog mDialog = new Dialog(this);
mDialog.setTitle("發現新版本");
View view = getLayoutInflater().inflate(R.layout.dialog_item, null);
TextView textView = (TextView) view.findViewById(R.id.textView1);
textView.setText(updata.getDesc());
view.findViewById(R.id.button2).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mDialog.dismiss();
new MyAsyn(mNm).execute(updata.getLoadUrl());
ShowPedding();
}
});
view.findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mDialog.dismiss();
}
});
mDialog.setContentView(view);
mDialog.show();
}
//啟動異步下載
static class MyAsyn extends AsyncTask<String, Integer, Integer> {
private NotificationManager mNm;
public MyAsyn(NotificationManager mNm) {
this.mNm = mNm;
}
@Override
protected Integer doInBackground(String... params) {
int length = 0;
FileOutputStream fos = null;
try {
URL url = new URL(params[0]);
URLConnection openConnection = url.openConnection();
InputStream is = openConnection.getInputStream();
length = openConnection.getContentLength();
byte[] buffer = new byte[1024];
int end = 0;
int sum = 0;
Log.e("doInBackground", "Environment.getExternalStorageDirectory().getPath()="
+ Environment.getExternalStorageDirectory().getPath());
fos = new FileOutputStream(Environment.getExternalStorageDirectory().getPath() + "/TTins.apk");
// fos = new FileOutputStream("/mnt/sdcard/TTins.apk");
while (-1 != (end = is.read(buffer))) {
fos.write(buffer, 0, end);
int resent = sum * 100 / length;
sum += end;
if (resent % 6 == 0&&tmp!=resent) {
tmp=resent;
publishProgress(length, sum, resent);
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return length;
}
@Override
protected void onProgressUpdate(Integer... values) {
mrRemoteViews.setProgressBar(R.id.progressBar1, values[0], values[1], false);
mrRemoteViews.setTextViewText(R.id.textView1, "已下載" + values[2] + "%");
mNm.notify(1, notification);
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(Integer result) {
mrRemoteViews.setProgressBar(R.id.progressBar1, result, result, false);
mrRemoteViews.setTextViewText(R.id.textView1, "下載完成");
mNm.notify(1, notification);
super.onPostExecute(result);
}
}
private void ShowPedding() {
// private static void ShowPedding(Activity activity,
// NotificationManager mNm) {
String fileName = Environment.getExternalStorageDirectory().getAbsolutePath() + "/TTins.apk";
// 創建URI
Uri uri = Uri.fromFile(new File(fileName));
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(uri, "application/vnd.android.package-archive");
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
mrRemoteViews = new RemoteViews(getPackageName(), R.layout.remote_item);
notification = new NotificationCompat.Builder(this).setTicker("開始下載").setSmallIcon(R.drawable.ic_launcher)
.setContentIntent(pendingIntent).setContent(mrRemoteViews).build();
mNm.notify(1, (Notification) notification);
}
}
彈出dialog的XML文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:background="#ffffff"
android:layout_alignParentTop="true" >
<ImageView
android:id="@+id/p_w_picpathView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/p_w_picpathView1"
android:layout_centerHorizontal="true"
android:layout_marginTop="22dp"
android:text="Large Text"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textView1"
android:layout_marginTop="23dp"
android:layout_toLeftOf="@+id/p_w_picpathView1"
android:text="取消" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/button1"
android:layout_alignBottom="@+id/button1"
android:layout_toRightOf="@+id/p_w_picpathView1"
android:text="確定" />
</RelativeLayout>
</RelativeLayout>
下面分享一下要用的兩個XML文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ProgressBar
android:id="@+id/progressBar1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textView1"
android:layout_toLeftOf="@+id/button1"
android:layout_toRightOf="@+id/p_w_picpathView1" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:text="Button" />
<ImageView
android:id="@+id/p_w_picpathView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/p_w_picpathView1"
android:text="Large Text"
android:textAppearance="?android:attr/textAppearanceLarge" />
</RelativeLayout>
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。