最近在写一个android的快速安装程序,具体功能有在第一次开机的时候自动运行,在以后的开机中从不运行,也就是说只自动运行一次,在这个程序里面有语言设置,时区设置,日期设置,时间设置,和wifi 设置。在写程序的期间碰到了很多问题,所以现在总结一下相关知识。
在程序中有几个技术点,自动运行,获得系统权限修改时间日期等,定时刷新,使用signapk进行签名。
一:只自动运行一次;
自动运行一次用了广播机制监听开机事件,发送广播让程序自己运行,至于运行一次我用的是sharepreferences来存储数据,在运行的时候做个判断,如果数据存在就不运行,如果数据不存在就运行,下面还是用代码进行说明吧。
//开机后接受广播让程序自己运行
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
//注意 继承的是BoradcastReceiver类
public class BootBroadcastReceiver extends BroadcastReceiver {
/** Called when the activity is first created. */
//@Override
static final String ACTION = "android.intent.action.BOOT_COMPLETED";
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ACTION)){
Intent start=new Intent(context,XXXX.class); //使用intent启动你需要启动的程序;
start.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(start);
}}
}
另外如果想让一个按钮自动点击, button.performClick();就可以搞定。
二:因为时间日期需要系统权限才能设置所以我们要给程序加上系统权限,在AndroidManifest.xml文件中<manifest >一栏中加上 android:sharedUserId="android.uid.system" 这个时候用eclipse无法编译,编译出的APk无法安装,这个是需要对APK 进行签名。先进入源码目录中 自己的目录\build\target\product\security 找到 【platform.pk8】和【platform.x509.pem】这两个文件,
并把这两个文件拷入自己的目录\build\tools\signapk中这个时候可以自己打一个signapk.jar的包,也可以在网上下,(建议下载,打包过程容易出错)把下载来的signapk包放入signapk文件夹中,这个时候签名的准备工作已经完了,然后将编译好的apk文件用解压缩文件打开,进入到META-INF文件夹中,删掉 .RSA和 .SF文件只剩一个.MF文件,这个时候APK文件放入一个目录中 为了方便直接放入D盘中,然后CMD打开DOS 进入到signapk文件夹下,输入java –jar signapk.jar platform.x509.pem platform.pk8 d:\aaa.apk d:\bbb.apk aaa.apk是删掉.RSA和 .SF文件的APK bbb.apk是签好名得APK。这个APK具有root权限可以修改日期和时间。
三:定时刷新用的了JAVA线程的知识。直接上代码了
//声明的变量
private final int UPDATE_TEXT=1;
private Timer mTimer;
private TimerTask mTimerTask;
private Handler mHandler;
//定时刷新
mHandler=new Handler(){
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
switch (msg.what) {
case UPDATE_TEXT:
// 需要刷新的功能代码写在这里
break;
default:
break;
}
}
};
mTimer = new Timer();
mTimerTask = new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
mHandler.sendEmptyMessage(UPDATE_TEXT);
}
};
mTimer.schedule(mTimerTask, 0,800);