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"