1 APP下载自动升级的方法
当我们的APP升级到新版本时,一般采用的方法就是程序检测服务器上的版本,如果比当
前版本更新,则下载服务器上的版本,然后安装。这里就不讨论下载的过程了,如果不会
请参考之前的文章 Android文件下载进度条的实现,这里只讨论下载完后执行安装的操作
。
首先,安装程序需要特殊权限。打开AndroidMenifest.xml,在</application>后、
</manifest>之前加上后面的代码: <uses-permission android:name=”
android.permission.INSTALL_PACKAGES” />,这样你的APP就有安装软件权限了。
接下是安装的关键代码,下载完后执行:
Uri uri = Uri.fromFile(new File("/sdcard/temp.apk")); //这里是APK路径
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(uri,"application/vnd.android.package-archive");
startActivity(intent);
2实现开机自启动
,我们只需要监听一个开机启动的Broadcast(广播)即可。首先写一个Receiver(即广播
监听器),继承BroadcastReceiver,如下所示:
public class BootReceiver extends BroadcastReceiver {
private PendingIntent mAlarmSender;
@Override
public void onReceive(Context context, Intent intent) {
// 在这里干你想干的事(启动一个Service,Activity等),本例是启
动一个定时调度程序,每30分钟启动一个Service去更新数据
mAlarmSender = PendingIntent.getService(context, 0, new Intent
(context,
RefreshDataService.class), 0);
long firstTime = SystemClock.elapsedRealtime();
AlarmManager am = (AlarmManager) context
.getSystemService(Activity.ALARM_SERVICE);
am.cancel(mAlarmSender);
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
firstTime,
30 * 60 * 1000, mAlarmSender);
}
}
<RECEIVER android:name=".service.BootReceiver">
<INTENT-FILTER>
<!-- 系统启动完成后会调用-->
<ACTION android:name="android.intent.action.BOOT_COMPLETED">
</ACTION>
</INTENT-FILTER>
</RECEIVER>
3 调用系统发短信
Uri smsToUri = Uri.parse("smsto:10086");
Intent intent = new Intent(
android.content.Intent.ACTION_SENDTO, smsToUri );
intent.putExtra("sms_body", "这是内容");
startActivity( intent );
4 检查SD卡是否可用
if (Environment.getExternalStorageState().equals
(Environment.MEDIA_MOUNTED)) {
setTitle("SD可用");
}else {
setTitle("SD不可用");
}
5 读取手机序列号IMEI,SIM序列号IMSI方法
IMEI是国际移动设备身份码的缩写,每台手机都有一个唯一的IMEI号码(貌似有国产山
寨机用同一个IMEI)。IMSI是国际移动用户识别码缩写,每张SIM卡都有唯一的一个IMSI号
码。因为他们都是唯一的,有些时候我们可以用他们来识别用户身份,不用再输帐号登录
(这样一来,没有IMEI和IMSI的android MP4,平板电脑就用不了了),以下是读取方法:
TelephonyManager tm = (TelephonyManager) this.getSystemService
(Context.TELEPHONY_SERVICE);
String imei = tm.getDeviceId();
String imsi =tm.getSubscriberId();
6 禁止切换横竖屏
Android系统在开启自动切换横竖屏的情况下,转动手机就会自动切换横竖屏,或者在推开
键盘时也会自动切换到横屏。但是有时我们的程序只针对竖屏做了优化,在横屏时显示就
会乱,影响用户体验,所以我们必须禁止系统自动切换。要达到这个目标,其实很简单。
在AndroidManifest.xml中,所有的Activity标签都加上android:screenOrientation属性
,横屏值为landscape,竖屏值为portrait。这样基本实现了锁定横屏或竖屏,但是在一些
有侧滑键盘的手机上(比如说我的Milestone),推开键盘的时候,Activity会自动重启,
要避免在这种情况下重启Activity,可以在androidmanifest.xml文件中的每个activity加
上android:configChanges=”keyboardHidden|orientation”属性,然后重写
onConfigurationChanged方法
Override
public void onConfigurationChanged(Configuration newConfig) {
// TODO Auto-generated method stub
super.onConfigurationChanged(newConfig);
setContentView(R.layout.main);
}
不过,这样载入的只是main.xml默认设置,如果在程序代码中修改过布局(改过TextView
的Text之类),是不会显示修改后的结果的。
7 在应用程序级别使用变量
Android应用程序开发中,有的时候我们在应用程序的任何一个地方都需要访问一个全
局变量,也就是在任何一个Activity中都可以访问的变量。它不会因为Activity的生命周
期结束而消失。要实现应用程序级的变量,我们可以通过Application这个类来实现。 首
先,我们新建一个类HelloApplication继承Android.app.Application类,然后在我们的类
中增加一些变量。如下所示:
public class HelloApplication extends Application {
private int globalVariable=1;
public int getGlobalVariable() {
return globalVariable;
}
public void setGlobalVariable(int globalVariable) {
this.globalVariable = globalVariable;
}
}
完成之后,我们在应用程序的任何一个Activity中可以通过如下方法访问我们的变量:
((HelloApplication)getApplication()).setGlobalVariable(10);
int valiable=((HelloApplication)getApplication()).getGlobalVariable();
public class DataStoreClass {
private static int globalVariable=1;
public static int getGlobalVariable() {
return globalVariable;
}
public static void setGlobalVariable(int newGlobalVariable) {
globalVariable = newGlobalVariable;
}
}
8
ANDROID的style:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="CodeFont" parent="@android:style/TextAppearance.Medium">
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:textColor">#00FF00</item>
<item name="android:typeface">monospace</item>
</style>
</resources>
应用
<TextView
style="@style/CodeFont"
android:text="@string/hello" />
9 android标题栏(titlebar)显示进度条
在后台线程中执行各种操作(网络连接、大数据存储)的时候,我们希望让客户能看到
后台有操作在进行,那么既能有效的提示用户,又不占用当前操作空间,最好的方法就是
在标题栏有个进度条。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);//
先给Activity注册界面进度条功能
setContentView(R.layout.main);
setProgressBarIndeterminateVisibility(true);//在需要显示进度条
的时候调用这个方法
setProgressBarIndeterminateVisibility(false);//在不需要显示进度
条的时候调用这个方法
}
10 自定义一个控件,比如可以修改一个textview,步骤如下:
1 首先继承edittext类
public class NeverEdit extends EditText {
/*构造方法-1*/
public NeverEdit(Context context) {
super(context);
}
/*构造方法-2:用XML布局需要此构造方法*/
public NeverEdit(Context context, AttributeSet attrs) {
super(context, attrs);
}
/*重新实现对按键安下事件处理*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
/*什么都不做*/
/*
* 返回真表示已经处理此事件
*/
return false;
}
2 在布局文件中
<com.NeverEdit
android:id="@+id/neveredit"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/append"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="添加" />
<Button
android:id="@+id/clear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="清除" />
3 主文件中
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ch4ex13);
/*获得实例变量以操作*/
appendBtn = (Button)findViewById(R.id.append);
clearBtn = (Button)findViewById(R.id.clear);
toBeEdited = (NeverEdit)findViewById(R.id.neveredit);
/*实现单击事件监听接口*/
btnClick = new OnClickListener() {
public void onClick(View v) {
if (v == appendBtn) {
/*若触发的View是添加按钮时,给NeverEdit添加字符串*/
toBeEdited.append("Android");
} else if (v == clearBtn) {
/*若触发的View是清除按钮时,清空NeverEdit*/
toBeEdited.getText().clear();
} else {
/*若触发的View是其他的话什么也不做*/
}
}
};
/*设置单击事件监听接口*/
appendBtn.setOnClickListener(btnClick);
clearBtn.setOnClickListener(btnClick);
结果就是编辑框不能被编辑了