app手動更新通知欄下載
說到app手動更新,大伙兒都能寫出一套來,網(wǎng)上的代碼也比較多。思路也是各顯神通。比如通過在啟動app的時候,通過api接口獲得服務(wù)器最新的版本號,然后和本地的版本號比較,來判斷是否需要彈出提示框下載。也可以通過推送的自定義消息來實(shí)現(xiàn)。我們這里主要討論的是app通知欄下載。
在這里我和同事寫了兩套通知欄下載的代碼,但是看了同事的代碼之后,才感覺網(wǎng)上最近流傳的那種通過service啟動,子線程下載,間斷發(fā)送消息給通知欄,通知欄更新進(jìn)度,這一套邏輯實(shí)在太low了。
一.通過系統(tǒng)的DownloadManager 實(shí)現(xiàn)
實(shí)現(xiàn)步驟:
1:我們要創(chuàng)建一個service
2:在service啟動的時候創(chuàng)建一個廣播接受者
3:當(dāng)BroadcastReceiver接受到下載完成的廣播時,開始執(zhí)行安裝。
好了,大功告成,可以交差了。
首先我們這里我們只需要在彈出的對話框中,將點(diǎn)擊事件設(shè)置為:
public class DownloadService extends Service {
/**廣播接受者*/
private BroadcastReceiver receiver;
/**系統(tǒng)下載管理器*/
private DownloadManager dm;
/**系統(tǒng)下載器分配的唯一下載任務(wù)id,可以通過這個id查詢或者處理下載任務(wù)*/
private long enqueue;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
/**新建一個廣播接受者*/
receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
/**當(dāng)系統(tǒng)下載完成,就提示安裝*/
install(context );
/**銷毀當(dāng)前的service*/
stopSelf();
}
};
/**過濾器,用來監(jiān)聽系統(tǒng)下載完成時的廣播*/
IntentFilter filter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
/**注冊廣播*/
registerReceiver(receiver, filter);
/**開始下載*/
startDownload(intent.getStringExtra("downUrl"));
return Service.START_STICKY;
}
@Override
public void onDestroy() {
unregisterReceiver(receiver);
super.onDestroy();
}
private void startDownload(String downUrl) {
/**獲得系統(tǒng)下載器 */
dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
/**設(shè)置下載地址*/
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(downUrl));
/**設(shè)置下載文件的類型*/
request.setMimeType("application/vnd.android.package-archive");
/**設(shè)置下載存放的文件夾和文件名字*/
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "xxxx.apk");
/**設(shè)置下載時或者下載完成時,通知欄是否顯示*/ request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setTitle("xxxx");
/**執(zhí)行下載,并返回任務(wù)唯一id*/
enqueue = dm.enqueue(request);
}
public static void startDownload(Context context, String downUrl) {
Intent intent = new Intent(context, DownloadService.class);
intent.putExtra("downUrl", downUrl);
context.startService(intent);
}
/**安裝*/
public static void install(Context context) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "xxxx.apk")), "application/vnd.android.package-archive");
context.startActivity(intent);
}
public static void install(Context context ) {
install(context,true);
}
}
如果沒有對下載通知欄ui要求過多的話,就可以采用這種形式。下載過程完全交給系統(tǒng)去做,安全可靠。
關(guān)于更多downloadmanager,如果不愿去看源碼的話,可以看下trinea的講解:
http://www.trinea.cn/android/android-downloadmanager/