如何自制一个自动启动的软件?

如何自制一个自动启动的软件

2 个回答

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"

然后便是调用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);

关于自动重启软件就写到这里,欢迎大家指正。