您的位置:首页 > 移动开发 > Android开发

Android 一个欢迎页面应该干些什么?

2016-07-05 08:49 441 查看
玩过很多android的应用,发现刚打开使用的时候都会只有一个显示几秒钟的欢迎页面,展示应用的一些信息。但是你知道这短短的几秒钟它到底干了些什么么?

下面我来说一下我所知道的:

一、版本更新。

在这页面存在的时间,我们会向服务器获取信息,判断当前应用的版本与服务器的版本是否一致,如何不一致的话,就会弹出是否更新的对话框。

首先给我们得到当前版本的版本号:

<span style="white-space:pre">	//首先得到包管理器packageManager
private PackageManager packageManager= getPackageManager();
//利用包管理器拿到包信息
PackageInfo packinfo = packageManager.getPackageInfo(getPackageName(), 0);
//得到包信息就可以获取包名和版本号了
String versionName = packinfo.versionName;
int versionCode = packinfo.versionCode;</span>


得到了当前的包信息,我们就要与获取服务器的版本号,判断是否一致了(服务器无非就是返回一串json数据,里面包含版本号,下载地址而已)。请求服务器我就在这里不细讲,又不懂的童靴留言。

当我们请求到了服务器之后,就发送信息让handler执行相应的操作,因为网络请求输入耗时操作,不可以在主线程,所以新开一个子线程,子线程不可以修改UI,所以让handler处理。如何版本号一致那就不需要更新,如果不一致的话。:

我们就弹出一个对话框,让用户选择,这里我就简单弹出一个较丑的对话框了:

case SHOW_UPDATE_DIALOG:
AlertDialog.Builder builder = new Builder(SplashActivity.this);
builder.setTitle("更新提醒");
builder.setMessage(desc);
/**
* 对话框被取消事件
*/
builder.setOnCancelListener(new OnCancelListener() {
public void onCancel(DialogInterface dialog) {
// TODO Auto-generated method stub
//该方法是进入主页面的方法,应使用次数过多,所以封装起来,在下面我会贴出来
LoadMainUI();
}
});
builder.setPositiveButton("立即更新", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
System.out.println("下载"+downloadurl);
downloadNews(downloadurl);//这里执行下载操作。
}
});
builder.setNegativeButton("下次再说", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
LoadMainUI();
}
});
builder.show();
break;


进入主页面的代码(LoadMainUI()):

/**
* 进入主界面UI的方法downloadNews
* @param LoadMainUI
*/
public void LoadMainUI() {
Intent intent = new Intent(SplashActivity.this,HomeActivity.class);
startActivity(intent);
finish();
}


执行下载操作的代码(downloadNews):

这里我采用github上的开源框架xUtils,里面封装了上传,下载,请求等等的方法。下面给个地址去下载,有说明文档,而且还是中文的哟。https://github.com/wyouflf/xUtils 可能有新的班的,但是仓库地址不一样,它上面有说明。

<span style="font-size:18px; white-space: pre;">	</span><span style="font-size:18px;">private void downloadNews(String downloadurl) {
// TODO Auto-generated method stub
HttpUtils http = new HttpUtils();
final Message msg = Message.obtain();
http.download(downloadurl, "/storage/sdcard/temp.apk",true,new RequestCallBack<File>() {
@Override
public void onFailure(HttpException arg0, String arg1) {
// TODO Auto-generated method stub
UIUtils.showToast(SplashActivity.this, "下载失败"+arg1);
tv_download.setText("下载失败"+arg1);
msg.what = LOAD_MAINUI;
arg0.printStackTrace();
handler.sendMessage(msg);
}
@Override
public void onSuccess(ResponseInfo<File> arg0) {
// TODO Auto-generated method stub\
System.out.println("安装"+Environment.getExternalStorageDirectory()+"/.temp.apk");
/**
* 下载完成后事变激动安装
*/
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.setDataAndType(Uri.fromFile(new File("/storage/sdcard/temp.apk","")),
"application/vnd.adroid.package-archive"
);
startActivityForResult(intent, 0);
//intent.setAction();
}
@Override
public void onLoading(long total, long current, boolean isUploading) {
// testTextView.setText(current + "/" + total);
tv_download.setText("正在下载"+current+"/"+total);
}
});
}</span>

可以看到,获取了HttpUtil对象,调用download方法第一个就是我们的下载地址,上面我们请求服务器的时候已经把下载地址也获取到了的。第二个就是下载的保存路径,第三个参数就是一个请求回调了,OnLoading()表示正在下载,OnSuccess()表示下载成功,OnFailure()表示下载失败。在OnSuccess回调方法了,我们肯定下载完成后安装的了。所以就启动了系统的安装界面。

更新版本已经完成了。接下来就要对数据进行处理了;

二、资源数据的处理

我们的做项目的时候,还有一些外部数据库获着其他文件。是存放在assets目录下的,但是我们怎么访问呢?这就要在我们的初始化界面里把相应的资源拷贝到SD卡下面了:

因为是耗时操作,所以我们要在子线程中执行:

/**
* 拷贝资产目录下的数据库文件
* @param string
*/
private void copyDB(final String string) {
new Thread(){
public void run() {
try {
File file = new File(getFilesDir(),string);
if (file.exists()&&file.length()>0) {//如果文件存在就不复制了
System.out.println("文件已经存在,不需要复制了");
return;
}
InputStream is=getAssets().open(string);
FileOutputStream fos=openFileOutput(string, MODE_PRIVATE);//直接打开一个文件输出流
byte[] buffer = new byte[1024];
int length = 0;
while((length=is.read(buffer))!=-1) {
fos.write(buffer, 0, length);
}
fos.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

};
}.start();
}

这里就不展开讲了,很简单的文件操作。

我们只需要把assets下的想要操作文件的文件名传进去就行了。

在这里我就简单的用了一两个常用的操作更大家讲解,具体还有其它的操作就要看项目的需求了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息