DownLoadManager的使用
2016-03-11 15:11
295 查看
最近项目版本更新,需要干掉以前的那种应用更新功能,当用户点击确定更新的时候更新在后头默默的更新,同时在通知栏里面显示进度,下载完应用之后再跳到安装页面。本代码的逻辑是在引导页启动一个异步的IntentService,检查更新之后使用downLoadManager下载 核心代码如下:
清单文件:
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".MyReceiver">
<intent-filter >
<action android:name="android.intent.action.DOWNLOAD_COMPLETE"/>
<action android:name="android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED"/>
</intent-filter>
</receiver>
<service android:name=".DownLoadService" />
Activity里面的版本号匹配:
/**
* 2 * 获取版本号 3 * @return 当前应用的版本号 4
*/
public String getVersion() {
try {
PackageManager manager = this.getPackageManager();
PackageInfo info = manager.getPackageInfo(this.getPackageName(), 0);
String version = info.versionName;
return this.getString(R.string.app_name) + version;
} catch (Exception e) {
e.printStackTrace();
return "找不到版本号";
}
}
// 版本号检查的工具方法
// 版本号检查的工具方法
private void checkTool(JSONObject response) {
JSONObject jsonObj = (JSONObject) response.opt("data");
String version = jsonObj.optString("version");
if (!getVersion().equals(version)) {
Dialog dialog = null;
String title = jsonObj.optString("title");
String content = jsonObj.optString("content");
final String downLoadUrl = jsonObj.optString("downloadUrl");
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(title);
builder.setMessage(content);
builder.setNegativeButton("取消",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
// TODO Auto-generated method stub
arg0.cancel();
}
});
builder.setPositiveButton("确定",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface d, int arg1) {
// TODO Auto-generated method stub
d.cancel();
Intent intent = new Intent(MainActivity.this,
DownLoadService.class);
intent.putExtra("downLoadUrl", downLoadUrl);
MainActivity.this.startService(intent);
}
});
dialog = builder.create();
dialog.show();
}
}
// 检查版本
public void checkUpdate(final String versionCode, String url) {
RequestQueue requestQueue = Volley.newRequestQueue(this);
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(
Request.Method.GET, url, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
if (response.optBoolean("success")) {
checkTool(response);
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError arg0) {
arg0.printStackTrace();
System.out.println("sorry,Error");
}
});
requestQueue.add(jsonObjectRequest);
}
DownLodService里面代码如下:
protected void onHandleIntent(Intent intent) {
// TODO Auto-generated method stub
String serviceString = Context.DOWNLOAD_SERVICE;
final DownloadManager downloadManager;
downloadManager = (DownloadManager)getSystemService(serviceString);
String downLoadUrl = intent.getStringExtra("downLoadUrl");
Log.e("download", "enter the service download"+downLoadUrl);
DownloadManager.Request request = new DownloadManager.Request(
Uri.parse("http://count.liqucn.com/d.php?id=444776&urlos=android&from_type=web"));
request.setAllowedNetworkTypes(Request.NETWORK_WIFI);
// 设置通知栏标题
request.setNotificationVisibility(Request.VISIBILITY_VISIBLE);
request.setTitle("下载");
request.setDescription("贵金属正在下载");
request.setAllowedOverRoaming(false);
// 设置文件存放目录
/* File file = new File(Environment.DIRECTORY_DOWNLOADS);
if(!file.exists()){
file.mkdirs();
}*/
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "myApp.apk");
MyReceiver.myReference =downloadManager.enqueue(request);
最后在广播里面监听下载完成的事件:
public void onReceive(Context mContext, Intent intent) {
// TODO Auto-generated method stub
Log.e("MyReceiver", " enter thisi receiver");
if (intent.getAction().equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)) {
long id = intent
.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
System.out.println(id == myReference);
if (id == this.myReference) {
Intent startIntent = new Intent(Intent.ACTION_VIEW);
startIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startIntent.setDataAndType(
Uri.fromFile(new File(Environment
.getExternalStorageDirectory()
+ "/download/myApp.apk")),
"application/vnd.android.package-archive");
mContext.startActivity(startIntent);
}
Toast.makeText(mContext, "下载完毕", 0).show();
} else if (intent.getAction().equals(
DownloadManager.ACTION_NOTIFICATION_CLICKED)) {
// Toast.makeText(MainActivity.this, "别瞎点!!!",
// Toast.LENGTH_SHORT).show();
}
}
清单文件:
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".MyReceiver">
<intent-filter >
<action android:name="android.intent.action.DOWNLOAD_COMPLETE"/>
<action android:name="android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED"/>
</intent-filter>
</receiver>
<service android:name=".DownLoadService" />
Activity里面的版本号匹配:
/**
* 2 * 获取版本号 3 * @return 当前应用的版本号 4
*/
public String getVersion() {
try {
PackageManager manager = this.getPackageManager();
PackageInfo info = manager.getPackageInfo(this.getPackageName(), 0);
String version = info.versionName;
return this.getString(R.string.app_name) + version;
} catch (Exception e) {
e.printStackTrace();
return "找不到版本号";
}
}
// 版本号检查的工具方法
// 版本号检查的工具方法
private void checkTool(JSONObject response) {
JSONObject jsonObj = (JSONObject) response.opt("data");
String version = jsonObj.optString("version");
if (!getVersion().equals(version)) {
Dialog dialog = null;
String title = jsonObj.optString("title");
String content = jsonObj.optString("content");
final String downLoadUrl = jsonObj.optString("downloadUrl");
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(title);
builder.setMessage(content);
builder.setNegativeButton("取消",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
// TODO Auto-generated method stub
arg0.cancel();
}
});
builder.setPositiveButton("确定",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface d, int arg1) {
// TODO Auto-generated method stub
d.cancel();
Intent intent = new Intent(MainActivity.this,
DownLoadService.class);
intent.putExtra("downLoadUrl", downLoadUrl);
MainActivity.this.startService(intent);
}
});
dialog = builder.create();
dialog.show();
}
}
// 检查版本
public void checkUpdate(final String versionCode, String url) {
RequestQueue requestQueue = Volley.newRequestQueue(this);
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(
Request.Method.GET, url, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
if (response.optBoolean("success")) {
checkTool(response);
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError arg0) {
arg0.printStackTrace();
System.out.println("sorry,Error");
}
});
requestQueue.add(jsonObjectRequest);
}
DownLodService里面代码如下:
protected void onHandleIntent(Intent intent) {
// TODO Auto-generated method stub
String serviceString = Context.DOWNLOAD_SERVICE;
final DownloadManager downloadManager;
downloadManager = (DownloadManager)getSystemService(serviceString);
String downLoadUrl = intent.getStringExtra("downLoadUrl");
Log.e("download", "enter the service download"+downLoadUrl);
DownloadManager.Request request = new DownloadManager.Request(
Uri.parse("http://count.liqucn.com/d.php?id=444776&urlos=android&from_type=web"));
request.setAllowedNetworkTypes(Request.NETWORK_WIFI);
// 设置通知栏标题
request.setNotificationVisibility(Request.VISIBILITY_VISIBLE);
request.setTitle("下载");
request.setDescription("贵金属正在下载");
request.setAllowedOverRoaming(false);
// 设置文件存放目录
/* File file = new File(Environment.DIRECTORY_DOWNLOADS);
if(!file.exists()){
file.mkdirs();
}*/
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "myApp.apk");
MyReceiver.myReference =downloadManager.enqueue(request);
最后在广播里面监听下载完成的事件:
public void onReceive(Context mContext, Intent intent) {
// TODO Auto-generated method stub
Log.e("MyReceiver", " enter thisi receiver");
if (intent.getAction().equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)) {
long id = intent
.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
System.out.println(id == myReference);
if (id == this.myReference) {
Intent startIntent = new Intent(Intent.ACTION_VIEW);
startIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startIntent.setDataAndType(
Uri.fromFile(new File(Environment
.getExternalStorageDirectory()
+ "/download/myApp.apk")),
"application/vnd.android.package-archive");
mContext.startActivity(startIntent);
}
Toast.makeText(mContext, "下载完毕", 0).show();
} else if (intent.getAction().equals(
DownloadManager.ACTION_NOTIFICATION_CLICKED)) {
// Toast.makeText(MainActivity.this, "别瞎点!!!",
// Toast.LENGTH_SHORT).show();
}
}
相关文章推荐
- Android IPC进程间通讯机制
- android之定时器AlarmManager
- axis备忘
- Windows XP Service Pack 3 RC1 v.3244 winxp补丁3 提供下载
- Run As Service runassrv.exe 详细参数第1/2页
- 安装MySQL在最后的start service停住了解决方法
- android使用Messenger绑定Service的多种实现方法
- asp.net Web Service 接口大量数据传输解决方案
- Silverlight中动态获取Web Service地址
- android调用web service(cxf)实例应用详解
- 在Android中 获取正在运行的Service 实例
- ASP.NET State service状态服务的问题解决方法
- 卸载ZkeysPHP 后iis网站出现Service Unavailable 解决办法
- IIS Admin Service 服务因 2149647636 (0x80210514) 服务性错误而停止
- Service Temporarily Unavailable的503错误是怎么回事?
- Android中Service服务详解(一)
- android教程之service使用方法示例详解
- SSB(SQLservice Service Broker) 入门实例介绍
- Android应用程序四大组件之使用AIDL如何实现跨进程调用Service