1.获得应用程序的当前版本号:
PackageManager pm = getPackageManager();
PackageInfo info = pm.getPackageInfo(getPackageName(),0);
String versionName = info.versionName;
2.联网到服务器中获取最新应用程序的版本号,服务器的路径应该写在配置文件中,方便以后可能的修改:
在values路径下新建一个config.xml文件,Add一个Name为serverurl,Value为http://192.168.0.16/updateinfo.html的键值对,保存。
取的时候用:
URL url = new URL(getString(R.string.serverurl));
3.json解析
JSONObject obj = new JSONObject(result);
String version = obj.getString("version");
4.跳转后,登陆界面一定要关闭,要不然返回键能够返回登陆界面。。。多没技术含量。
5.调用系统安装工具安装apk,系统安装apk的界面是一个Activity,所以,在系统的清单文件中有这个Activity的配置信息,可以根据系统清单文件中的配置信息来调用这个Activity。
Intent intent = new Intent();
intent.setAction("android.intent.action.INSTALL_PACKAGE");
intent.addCategory("android.intent.category.DEFAULT");
intent.setDataAndType(Uri.fromFile(t),"application/vnd.android.package-archive");
startActivity(intent);
6.apk签名
在Android手机中不允许有两个应用程序有相同的包名。如果包名相同的情况下,系统会去检查这两个应用的签名是否相同,如果相同,会覆盖之前安装的应用,若不同,则安装失败。
签名步骤:右键应用程序-->Export-->Export Android Application-->Create new keystore-->Location:浏览出要保存的路径,创建要保存的文件,如mobilesafe.keystore-->Password-->Alias:别名、Validity写40-->保存。
经过签名的apk可以发布到应用市场上。
7.设置应用中所有的Activity都没有标题栏,只需要在styles文件中的包含name="AppTheme"属性的style节点下添加<item name="android:windowNoTitle">true</item>
8.弹出对话框时,要么设置返回键不可用(builder.setCancelable(false);)要么监听返回键被点击的事件(builder.setOnCancelListener(new OnCancelListener(){});)。
9.九宫格用GridView,android:numColumns="3"即可。
10.自定义滚动的TextView:
当TextView中的内容单行显示不完的时候,ellipsize属性值为start、middle、end时,省略号分别出现在前中后必须,为marquee时,当TextView获取焦点时,文本内容会滚动。要想使TextView一直有焦点,需定义一个FocusedTextView类继承TextView,实现3个构造函数。重写isFocused()方法,不管是否有焦点都直接返回true。然后以该类的全路径名来定义控件。如:
<span style="font-size:18px;"><com.uc.mobilesafe.ui.FocusedTextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:singleLine="true"
android:text="史上最新手机安全卫士,绝对保证您手机的安全,欢迎下载!"
android:textSize="18sp" /></span>11.自定义组合控件:
自己写的控件组合,以后还要用的话,可以写一个类如SettingItemView继承RelativeLayout,实现3个构造方法,3个构造方法都调用initView(context)方法,创建initView()方法,在该方法中,用:
View.inflate(context,R.layout.布局文件,this);把一个布局文件转换成View对象,并加载到父类(SettingItemView)中。然后就可以通过该类的全路径名定义该组合控件。一次定义,重复利用。
点击组合控件的每个位置都使组合控件中的checkbox起作用:
<span style="font-size:18px;"> /**
* 初始化布局文件
*
* @param context
*/
private void initView(Context context) {
// 把一个布局文件--->View,并且加载到父类SettingItemView中
View.inflate(context, R.layout.setting_item_view, this);
cb_update = (CheckBox) findViewById(R.id.cb_update);
tv_name = (TextView) findViewById(R.id.tv_name);
tv_desc = (TextView) findViewById(R.id.tv_desc);
}
/**
* 设置组合控件是否被选中
*/
public void setChecked(boolean checked) {
cb_update.setChecked(checked);
}
/**
* 校验组合控件是否被选中
*
* @return
*/
public boolean isChecked() {
return cb_update.isChecked();
}
/**
* 设置组合控件的描述信息
*
* @param description
*/
public void setDesc(String description) {
tv_desc.setText(description);
}</span>这里设置是否被选中是为了在处理点击事件时做出相应的响应。
还有,组合控件绑定时,checkbox要做处理:
android:clickable="false"
android:focusable="false"
这篇博客详细介绍了在Android开发中如何获取并比较应用版本号,从服务器获取更新信息,进行JSON解析,无标题栏设置,滚动TextView实现,自定义组合控件以及apk的签名安装等操作。同时提到了在登录界面处理、GridView实现九宫格、监听返回键以及自定义可滚动TextView的技巧。
1139

被折叠的 条评论
为什么被折叠?



