一、软件功能
1.能够设置重启次数;
2.能够设置重启等待时间;
3.能够开机后自动运行;
4.能够随时取消重启计数。
二、技术要点
1.开机自动运行;
2.调用系统重启命令;
3.计数重启参数。
三、实现步骤
1.开机自动运行
<receiver android:name="BootReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <category android:name="android.intent.category.HOME" /> </intent-filter> </receiver>
写一个Receiver继承BroadCastReceiver,在manifest里面按照上面的方式设置一下intent-filter,然后在OnReceive方法中写跳转到Activity的代码,这样应应用即可实现开机启动。
2.调用系统重启命令
首先需要在manifest里面加入权限
android:sharedUserId="android.uid.system"
<uses-permission android:name="android.permission.REBOOT" />
然后便是调用Java代码如下
Intent reboot = new Intent(Intent.ACTION_REBOOT); reboot.setAction("android.intent.action.REBOOT"); reboot.putExtra("nowait", 1); reboot.putExtra("interval", 1); reboot.putExtra("window", 0); sendBroadcast(reboot);
最后很关键的一点是生成之后的apk需要用系统的证书签名,具体步骤如下
(1)在签名之前需要清空apk之前的签名(如果有的话),删除掉META-INF目录下CERT开头的两个文件;
(2)找到密钥文件,在Android源码目录中的位置是"build/target/product/security",下面的platform.pk8和platform.x509.pem两个文件,然后,用Android提供的SignApk工具来签名,signapk的源代码是在"build/tools/signapk"下,这时得为下面的编译工作做些准备:
编译jar
命令行cd到signapk.java代码目录下,
javac signapk.java
获取SignApk$SignatureOutputStream.class和SignApk.class
建立目录s/com/android/signapk,将两个class文件放入目录下
jar cvfm signapk.jar SignApk.mf -C s/ .
注意:"s/"后面的"."前面有空格
生成signapk.jar文件,得到了Android提供的签名程序signapk.jar
直接去网上下了一个别人已经弄好的signapk.jar
接着用命令行命令
java -jar signapk.jar platform.x509.pem platform.pk8 D:/Reboot.apk D:/RebootSigned.apk
签名后的apk就可以成功安装到目标机器上去了。
3.计数重启参数
首先存储参数我使用的是SharedPreferences方法,代码如下
prefs = PreferenceManager.getDefaultSharedPreferences(this); private void read_status() { this.rebootTimes = prefs.getInt(REBOOT_TIMES, 1); this.rebootFrequency = prefs.getInt(REBOOT_FREQUENCY, 20); this.totalTimes = prefs.getInt(TOTAL_TIMES, 20); } public void save_status(int rebootTimes, int rebootFrequency, int totalTimes) { Editor editor = prefs.edit(); editor.putInt(REBOOT_TIMES, rebootTimes); editor.putInt(REBOOT_FREQUENCY, rebootFrequency); editor.putInt(TOTAL_TIMES, totalTimes); editor.commit(); }
因为需要随时可以取消自动重启,所以这里使用的Handler的postDelayed()方法,线程定义如下
myTimerThread = new Runnable() { @Override public void run() { if (count > 0) { try { sendMsg(UpdateMsgText, String.valueOf(count--)); } catch (Exception e) { e.printStackTrace(); } timerHandler.postDelayed(myTimerThread, 1000); } else { startReboot(); } } };
上面的代码实现的就是每隔1秒运行一下此线程。
如果需要取消掉自动重启只需要把计划remove掉就可以了,代码如
timerHandler.removeCallbacks(myTimerThread);
关于自动重启软件就写到这里,欢迎大家指正。