版权声明:本文为博主原创文章,未经博主允许不得转载。
通过DownloadManager来下载APK到本地,下载完成后收到广播再安装APK,可用在软件更新等场合。
添加权限
- <uses-permission android:name="android.permission.INTERNET"/>
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Activity源码
- package com.example.administrator.downloadtest;
- import android.app.Activity;
- import android.app.DownloadManager;
- import android.content.BroadcastReceiver;
- import android.content.Context;
- import android.content.Intent;
- import android.content.IntentFilter;
- import android.net.Uri;
- import android.os.Bundle;
- import android.view.View;
- import android.webkit.MimeTypeMap;
- import android.widget.Button;
- public class MainActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Button btDownload = (Button) findViewById(R.id.bt_download);
- btDownload.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- downloadApk();
- }
- });
- /**注册下载完成广播**/
- registerReceiver(downloadCompleteReceiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
- }
- /**下载APK**/
- private void downloadApk() {
- String apkUrl = "http://192.168.1.1/downloadtest.apk";
- Uri uri = Uri.parse(apkUrl);
- DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
- DownloadManager.Request request = new DownloadManager.Request(uri);
- // 设置允许使用的网络类型,这里是移动网络和wifi都可以
- request.setAllowedNetworkTypes(request.NETWORK_MOBILE| request.NETWORK_WIFI);
- //设置是否允许漫游
- request.setAllowedOverRoaming(false);
- //设置文件类型
- MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
- String mimeString = mimeTypeMap.getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(apkUrl));
- request.setMimeType(mimeString);
- //在通知栏中显示
- request.setNotificationVisibility(request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
- request.setTitle("download...");
- request.setVisibleInDownloadsUi(true);
- //sdcard目录下的download文件夹
- request.setDestinationInExternalPublicDir("/download", "downloadtest.apk");
- // 将下载请求放入队列
- downloadManager.enqueue(request);
- }
- private BroadcastReceiver downloadCompleteReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- /**下载完成后安装APK**/
- installApk();
- }
- };
- private void installApk() {
- Intent i = new Intent(Intent.ACTION_VIEW);
- String filePath = "/sdcard/download/downloadtest.apk";
- i.setDataAndType(Uri.parse("file://" + filePath), "application/vnd.android.package-archive");
- startActivity(i);
- }
- }
package com.cardvalue.sys.activitys;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Date;
import java.util.Map;
import java.util.Set;
import android.annotation.SuppressLint;
import android.app.DownloadManager;
import android.app.ProgressDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import cn.jpush.android.api.InstrumentedActivity;
import cn.jpush.android.api.JPushInterface;
import cn.jpush.android.api.TagAliasCallback;
import com.cardvlaue.sys.R;
import com.cardvalue.sys.annotation.EControl;
import com.cardvalue.sys.annotation.EventType;
import com.cardvalue.sys.annotation.FCallHandler;
import com.cardvalue.sys.annotation.FControl;
import com.cardvalue.sys.common.CMessage;
import com.cardvalue.sys.common.MD5Util;
import com.cardvalue.sys.common.MessageBox;
import com.cardvalue.sys.common.MyApplication;
import com.cardvalue.sys.newnetwork.BusinessServices;
import com.cardvalue.sys.newnetwork.Config;
import com.cardvalue.sys.newnetwork.Convert;
import com.cardvalue.sys.newnetwork.CustomHandler;
import com.cardvalue.sys.newnetwork.UserServices;
import com.cardvalue.sys.newnetwork.Utiltools;
import com.cardvalue.sys.widget.WelcomeDialog;
import com.cardvalue.sys.widget.WelcomeDialog.onAttendOrNotListener;
import com.cardvalue.sys.widget.WelcomeDialog.onCancelListener;
//import com.tencent.stat.StatService;
/**
* 欢迎页面
*/
public class WelcomeActivity extends InstrumentedActivity {
private Map<String, Object> active = null; // 活动页的相关信息
private Map<String, Object> showIcon = null; // 首页显示的图标
public CustomHandler handler;
public ProgressDialog dialog;
public UserServices userService = new UserServices();
public BusinessServices businessService = new BusinessServices();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.welcome);
// StatService.trackCustomEvent(this, "onCreate", "");
EControl control = new EControl(this);
control.setOnClickLisenner(clickLinstenner); // 设置所有的点击事件
control.InitControl(); // 开始初始化控件
handler = new CustomHandler(this); // 初始化handler
dialog = new ProgressDialog(this);
JPushInterface.init(getApplicationContext());
Utiltools.printE("Jpush data=========>"
+ JPushInterface.getRegistrationID(this));
handler.sendMessage(handler.obtainMessage(MSG_SET_ALIAS, "android"));
userService.setValue(this, handler, CMessage.NET_MSG_GETNEWVERSION);
if (hasNetworkAvailable()) {
userService.getVersionInformation();
} else {
MessageBox.ToastShow("没有可用网络连接,请检查你的网络!", WelcomeActivity.this);
// 没有网络的时候直接到home页
handler.sendEmptyMessageDelayed(NORMAL_MSG_HOME, 3000);
}
}
/***********************************************************************************************************************************************
* 定义控件,并指定控件对应的ID
***********************************************************************************************************************************************/
@FControl(id = R.id.imageView1)
public ImageView bg1; // 第一张背景图
@FControl(id = R.id.imageView2, eventType = EventType.ON_CLICK)
public ImageView bg2; // 第二张背景图
@FControl(id = R.id.btn, eventType = EventType.ON_CLICK)
public Button button; // 跳过按钮
@FControl(id = R.id.ry_wecome)
public RelativeLayout wLayout; // 第二张背景图及按钮的布局
/*********************************************************************************************************************************************
* 处理所有的onclick事件
*********************************************************************************************************************************************/
public OnClickListener clickLinstenner = new OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.imageView2: // 按下了活动图片后触发
String isForward = (String) active.get("forwardType"); // 判断是否跳转
if (isForward.equals("1")) {
handler.removeMessages(NORMAL_MSG_LOGIN);
Intent intent = new Intent(WelcomeActivity.this,
LoadWebPage.class);
intent.putExtra("title", "活动规则");
intent.putExtra("welcome", "welcome");
intent.putExtra("url", (String) active.get("forwordUrl"));
startActivity(intent);
WelcomeActivity.this.finish();
}
break;
case R.id.btn: // 按下了跳过按钮
handler.removeMessages(NORMAL_MSG_LOGIN);
startActivity(new Intent(WelcomeActivity.this, Home.class));
WelcomeActivity.this.finish();
break;
}
}
};
/**
* 获取最新的服务器版本信息
*/
@SuppressWarnings("unchecked")
@FCallHandler(id = CMessage.NET_MSG_GETNEWVERSION)
public void getNewVersion() {
handler.tempMap = (Map<String, Object>) handler.resultMap
.get("resultData");
int clientCode = Utiltools.getAppVersionCode(this); // 客户端的版本code
int serverCode = Integer.parseInt(handler.tempMap.get("versionCode")
.toString()); // 服务端的版本code
final String isForceUpdate = handler.tempMap.get("isForceUpdate")
.toString(); // 是否强制更新 0不强制更新(可以选择) 1:必须更新
active = (Map<String, Object>) handler.tempMap.get("welecomeSet");
Utiltools.printE("handler.tempMap" + "=====" + handler.tempMap);
Utiltools.printE("Convert.convertMap(active).size()" + "====="
+ Convert.convertMap(active).size());
if (Convert.convertMap(active).size() != 0) {
// http://www.cvbaoli.com/webak/resources/newm/images/welcome/welcome640-1136.png
String imgUrl = Config.getWeixinIp() + "resources/image/welcome/"
+ (String) active.get("picName") + "640-1136."
+ (String) active.get("suffix");
Utiltools.loadPic(this, imgUrl, bg2, R.drawable.welcome2,
R.drawable.welcome2); // 加载网络图片
Utiltools.printE("imgUrlimgUrl");
} else {
Utiltools.loadPic(this, "", bg2, R.drawable.welcome2,
R.drawable.welcome2);
Utiltools.printE("imgUrlimgUrl" + "===4444===");
}
// msg 中的内容根据是否强制更新的不同而进行改变
String msg = isForceUpdate.equals("0") ? Utiltools
.getString(R.string.updateSystem) : Utiltools
.getString(R.string.needUpdateSystem);
final WelcomeDialog mwelComeDialog = new WelcomeDialog(
WelcomeActivity.this, msg);
if (serverCode > clientCode) {// 服务器大于本地 就要更新
onAttendOrNotListener welCome = new onAttendOrNotListener() {
@SuppressLint("NewApi")
@Override
public void AttendOrNot() {
MessageBox.show(dialog, "", "正在下载最新版本,请稍后...");
String url = handler.tempMap.get("url").toString();
DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
DownloadManager.Request request = new DownloadManager.Request(
Uri.parse(url));
request.setDestinationInExternalPublicDir("/cardvalue",
"cardvalue.apk");
request.setVisibleInDownloadsUi(true);
request.setTitle("卡得万利");
downloadManager.enqueue(request);
}
};
onCancelListener onCancel = new onCancelListener() {
@Override
public void Cancel() {
if (isForceUpdate.equals("1")) {
mwelComeDialog.cancel();
WelcomeActivity.this.finish();
} else {
handler.sendEmptyMessage(NORMAL_MSG_START);
mwelComeDialog.cancel();
}
}
};
mwelComeDialog.setOnAttendOrNotListener(welCome);
mwelComeDialog.setCancelListener(onCancel);
mwelComeDialog.show();
} else {
handler.sendEmptyMessage(NORMAL_MSG_START);
}
}
/**
* 开始正常的流程
*/
@FCallHandler(id = NORMAL_MSG_START)
public void startProcess() {
Utiltools.printE("开始正常的流程=====" + Convert.convertMap(active).size());
if (Convert.convertMap(active).size() == 0) {
handler.sendEmptyMessageDelayed(NORMAL_MSG_LOGIN, 3000); // 5秒以后进入登录页
return;
}
bg1.setVisibility(View.GONE); // 设置背景1层消失
wLayout.setVisibility(View.VISIBLE); // 设置背景层显示
bg2.setVisibility(View.VISIBLE); // 设置背景2层的图片显示
button.setVisibility(View.VISIBLE); // 设置背景2层的按钮显示
handler.sendEmptyMessageDelayed(NORMAL_MSG_LOGIN, 5000); // 5秒以后进入登录页
}
@FCallHandler(id = NORMAL_MSG_HOME)
public void home() {
startActivity(new Intent(WelcomeActivity.this, Home.class));
WelcomeActivity.this.finish();
}
/**
* 开始登陆操作
*/
@FCallHandler(id = NORMAL_MSG_LOGIN)
public void login() {
Utiltools.printE("LOGIN====LOGIN");
String username = MyApplication.getApplication().getLocalCache()
.getString("username"); // 获取用户名
String password = MyApplication.getApplication().getLocalCache()
.getString("password"); // 获取密码
if (username.equals("") || password.equals("")) {
startActivity(new Intent(WelcomeActivity.this, Home.class));
WelcomeActivity.this.finish();
return;
}
String pushId = JPushInterface.getRegistrationID(this);
long data = System.currentTimeMillis() / 1000;
String pass1 = MD5Util.MD5(MD5Util.MD5(password) + "cvbaoli" + data)
+ "|" + data;
try {
userService.setValue(WelcomeActivity.this, handler,
CMessage.NET_MSG_LOGIN);
userService.login(username, URLEncoder.encode(pass1, "utf8"),
"mj_"+pushId, null);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
/**
* 登陆成功后的操作
*/
@FCallHandler(id = CMessage.NET_MSG_LOGIN)
public void loginSuccess() {
dialog.cancel();
MyApplication.getApplication().setLogin(true);
MyApplication.getApplication().getLocalCache()
.putString("exirDate", String.valueOf(new Date().getTime()));
startActivity(new Intent(WelcomeActivity.this, Home.class));
WelcomeActivity.this.finish();
}
/**
* 下载完成后广播接收类
*/
class DownloadCompleteReceiver extends BroadcastReceiver {
@SuppressLint("NewApi")
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)) {
DownloadManager downloadManager = (DownloadManager) context
.getSystemService(Context.DOWNLOAD_SERVICE);
DownloadManager.Query query = new DownloadManager.Query();
query.setFilterByStatus(DownloadManager.STATUS_SUCCESSFUL);
Cursor c = downloadManager.query(query);
// 获取文件名并开始安装
if (c.moveToFirst()) {
String fileName = c.getString(c
.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
fileName = fileName.replace("file://", "");
File file = new File(fileName);
Utiltools.print("weiweina", "file = " + fileName);
Intent intent1 = new Intent(Intent.ACTION_VIEW);
intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent1.setDataAndType(Uri.fromFile(file),
"application/vnd.android.package-archive");
startActivity(intent1);
WelcomeActivity.this.finish();
}
}
}
}
// 注册广播
public DownloadCompleteReceiver receiver = new DownloadCompleteReceiver();
@Override
protected void onResume() {
registerReceiver(receiver, new IntentFilter(
DownloadManager.ACTION_DOWNLOAD_COMPLETE));
super.onResume();
}
@Override
protected void onDestroy() {
if (receiver != null)
unregisterReceiver(receiver);
super.onDestroy();
}
/****************************************************************************************************************************************
* 自定义消息
****************************************************************************************************************************************/
private static final int NORMAL_MSG_START = 1; // 进入正常流程消息
public static final int NORMAL_MSG_LOGIN = 2; // 开始进行登陆操作
public static final int NORMAL_MSG_HOME = 3; // 延迟3秒到首页
public static final int MSG_SET_ALIAS = 10001;
public static final String MESSAGE_RECEIVED_ACTION = "com.cardvlaue.sys.MESSAGE_RECEIVED_ACTION";
public static final String KEY_TITLE = "title";
public static final String KEY_MESSAGE = "message";
public static final String KEY_EXTRAS = "extras";
private final TagAliasCallback mAliasCallback = new TagAliasCallback() {
@Override
public void gotResult(int code, String alias, Set<String> tags) {
switch (code) {
case 6002:
if (isConnected(getApplicationContext())) {
handler.sendMessageDelayed(
handler.obtainMessage(MSG_SET_ALIAS, alias),
1000 * 60);
}
break;
}
}
};
public static boolean isConnected(Context context) {
ConnectivityManager conn = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = conn.getActiveNetworkInfo();
return (info != null && info.isConnected());
}
@FCallHandler(id = MSG_SET_ALIAS)
public void setAlias() {
Utiltools.print("极光调用了......................");
JPushInterface.setAliasAndTags(getApplicationContext(),
(String) handler.msg.obj, null, mAliasCallback);
}
/**
* 判断网络是否连接
*/
private boolean hasNetworkAvailable() {
ConnectivityManager cm = (ConnectivityManager) this
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (cm == null) {
return false;
} else {
NetworkInfo[] info = cm.getAllNetworkInfo();
if (info != null) {
for (int i = 0; i < info.length; i++) {
if (info[i].getState() == NetworkInfo.State.CONNECTED) {
return true;
}
}
}
}
return false;
}
}