一,0权限重启手机:
现在我们来定义一个实现该功能的类:
/** * 单击事件 * @param view */ public void reboot(View view) { Intent reboot = new Intent(Intent.ACTION_REBOOT); reboot.putExtra("nowait", 1); reboot.putExtra("interval", 1); reboot.putExtra("window", 0); sendBroadcast(reboot); }
程序异常终止了,logcat控制输出,说没有权限
我们需要了解一下重启手机需要什么样的权限
其中Android:protectionLevel="signatureOrSystem"表明要只能是系统的程序或者签名和系统签名一样的程序才能够实现重启手机的功能. 我们就在清单文件里面,加上缺少的权限
<uses-permission android:name="android.permission.REBOOT"/>
但是程序还是出现同样的错误.
然而我们可以在把我们的程序提高成系统的权限(我们程序的uid和系统的等级一样)只需要这样配置:
android:sharedUserId="android.uid.system"
运行后发现如下错误:
[2012-02-12 22:51:26 - android_safe_reboot] Installation error: INSTALL_FAILED_SHARED_USER_INCOMPATIBLE
[2012-02-12 22:51:26 - android_safe_reboot] Please check logcat output for more details.
[2012-02-12 22:51:26 - android_safe_reboot] Launch canceled!
表示安装失败,因为我们虽然使用android:sharedUserId="android.uid.system"但是我们程序的签名不是系统的签名,eclipse默认是debug签名.
所以现在我们的程序必须系统的签名,当然可以到网站去下载.(platform.pk8,platform.x509.pem)
现在我们要做的是程序使用系统的签名,那该怎么做呢?(需要签名打包工具signapk.jar,)
第一步,出eclipse的我们写的程序,在bin目录下就可以找到.
第二步,打开该apk把,把里面META-INF(包含的是一些默认签名的信息)的三个文件删除
第三步,使用signapk.jar命定进行签名打包.
E:\2\douban4\SignApk (1)\SignApk>java -jar signapk.jarplatform.x509.pem platfor m.pk8android_safe_reboot.apk(原pak)reboot.apk(新apk)
然后我们通过cmd命令把打包后的apk安装到模拟器上,出现如下错误:
因为模拟器上已经有了这样一个程序但是,他的签名是debug签名,我们知道唯一标识一个应用程序是包名和签名
只有两个程序的签名和包名一样,那么才表示这两个应用程序是同一类别的程序.
如一个应用程序要更新,那么就必须保持签名和包名一直,否则更新则不成功.
以包名和签名来标识一个程序,这样有什么好处?
如果仅以包名来标识,如果别人知道了你程序的包名,那么别人就可以也写一个另类的程序,但是和你的包名一样,用户一安装就把你的覆盖了.
综上所述,我们需要把模拟器上的这个程序卸载(adb uninstall 包名),然后我们再安装签名打包后的apk,启动程序,单击按钮,然后模拟器会出现如下情况因为是模拟器,它会一直停留在该界面,如果是真机就不会出现这样的情况.
但是,这样做比较麻烦.我们可以通过下面的方式来实现.
public void reboot(View view){ // 利用吐司来重启手机 // system_server while(true){ Toast myToast = new Toast(this); myToast.setView(new View(this)); myToast.show(); } }
这段代码应该写到Service的子线程中,这样就不会阻塞用户的请求.