Android编程实现系统重启与关机的方法
本文实例讲述了Android编程实现系统重启与关机的方法。分享给大家供大家参考,具体如下:
最近在做个东西,巧合碰到了sharedUserId的问题,所以收集了一些资料,存存档备份。
安装在设备中的每一个apk文件,Android给每个APK进程分配一个单独的用户空间,其manifest中的userid就是对应一个Linux用户都会被分配到一个属于自己的统一的Linux用户ID,并且为它创建一个沙箱,以防止影响其他应用程序(或者其他应用程序影响它)。
用户ID在应用程序安装到设备中时被分配,并且在这个设备中保持它的永久性。
通过SharedUserid拥有同一个Userid的多个APK可以配置成运行在同一个进程中.所以默认就是可以互相访问任意数据.也可以配置成运行成不同的进程,同时可以访问其他APK的数据目录下的数据库和文件.就像访问本程序的数据一样.
对于一个APK来说,如果要使用某个共享UID的话,必须做三步:
1、在Manifest节点中增加android:sharedUserId属性。
2、在Android.mk中增加LOCAL_CERTIFICATE的定义。
如果增加了上面的属性但没有定义与之对应的LOCAL_CERTIFICATE的话,APK是安装不上去的。
提示错误是:
Packagecom.test.MyTesthasnosignaturesthatmatchthoseinshareduserandroid.uid.system;ignoring!
也就是说,仅有相同签名和相同sharedUserID标签的两个应用程序签名都会被分配相同的用户ID。
例如所有和media/download相关的APK都使用android.media作为sharedUserId的话,那么它们必须有相同的签名media。
3、把APK的源码放到packages/apps/目录下,用mm进行编译。
举例说明一下。
系统中所有使用android.uid.system作为共享UID的APK,都会首先在manifest节点中增加:
android:sharedUserId="android.uid.system"
然后在Android.mk中增加
LOCAL_CERTIFICATE:=platform
可以参见Settings等。
系统中所有使用android.uid.shared作为共享UID的APK,都会在manifest节点中增加
android:sharedUserId="android.uid.shared"
然后在Android.mk中增加
LOCAL_CERTIFICATE:=shared
可以参见Launcher等
系统中所有使用android.media作为共享UID的APK,都会在manifest节点中增加
android:sharedUserId="android.media"
然后在Android.mk中增加
LOCAL_CERTIFICATE:=media
可以参见Gallery等。
另外,应用创建的任何文件都会被赋予应用的用户标识,并且正常情况下不能被其他包访问。
当通过getSharedPreferences(String,int)、openFileOutput(String、int)或者openOrCreateDatabase(String、int、SQLiteDatabase.CursorFactory)
创建一个新文件时,开发者可以同时或分别使用MODE_WORLD_READABLE和MODE_WORLD_RITEABLE标志允许其他包读/写此文件。当设置了这些标志后,这个文件仍然属于自己的应用程序,但是它的全局读/写和读/写权限已经设置,所以其他任何应用程序可以看到它。
关于签名:
build/target/product/security目录中有四组默认签名供Android.mk在编译APK使用:
1、testkey: 普通APK,默认情况下使用。
2、platform:该APK完成一些系统的核心功能。经过对系统中存在的文件夹的访问测试,这种方式编译出来的APK所在进程的UID为system。
3、shared: 该APK需要和home/contacts进程共享数据。
4、media:该APK是media/download系统中的一环。
应用程序的Android.mk中有一个LOCAL_CERTIFICATE字段,由它指定用哪个key签名,未指定的默认用testkey
在应用层如何通过代码实现Android系统的重启,分享给大家。
这篇文章是在android系统开发的基础之上进行实践的,所以如果你是纯粹的app开发,可能要让你失望了。
该代码在真机上测试成功,在模拟器上面测试失败。
在linux下面,重启pc,非root用户需要执行sudoreboot,所以在android下重启机器也需要一定的权限。
应用程序界面:
1.新建一个android工程reboot
2.编写Android.mk
LOCAL_PATH:=$(callmy-dir) include$(CLEAR_VARS) LOCAL_MODULE_TAGS:=optional LOCAL_SRC_FILES:=$(callall-java-files-under,src) LOCAL_PACKAGE_NAME:=reboot LOCAL_CERTIFICATE:=platform include$(BUILD_PACKAGE) #Usethefolloingincludetomakeourtestapk. include$(callall-makefiles-under,$(LOCAL_PATH))
具体含义可自行查阅资料。注意:
LOCAL_CERTIFICATE:=platform
3.编写补充AndroidMenifest.xml
<?xmlversion="1.0"encoding="utf-8"?> <manifestxmlns:android="http://schemas.android.com/apk/res/android" package="mark.zhang" android:versionCode="1" android:versionName="1.0"> <uses-sdkandroid:minSdkVersion="7"/> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:sharedUserId="android.uid.system"> <activity android:label="@string/app_name" android:name=".RebootActivity"> <intent-filter> <actionandroid:name="android.intent.action.MAIN"/> <categoryandroid:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application> </manifest>
注意:
android:sharedUserId="android.uid.system"
4.编写逻辑代码RebootActivity.java
packagemark.zhang; importandroid.app.Activity; importandroid.content.Intent; importandroid.os.Bundle; importandroid.view.View; publicclassRebootActivityextendsActivity{ //是否显示关机确认的对话框 //false不显示确认关机的对话框,直接关机 //true显示确认关机的对话框,让用户选择是否确认关机 publicstaticfinalbooleanshowShutdownDialog=false; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); } /** *发送广播. * *@paramview */ publicvoidonReboot(Viewview) { Intentreboot=newIntent(Intent.ACTION_REBOOT); reboot.putExtra("nowait",1); reboot.putExtra("interval",1); reboot.putExtra("window",0); sendBroadcast(reboot); } /** *启动Activity. * *@paramview */ publicvoidonShutdown(Viewview) { publicvoidonShutdown(Viewview) { Intentshutdown=newIntent(Intent.ACTION_REQUEST_SHUTDOWN); shutdown.putExtra(Intent.EXTRA_KEY_CONFIRM,showShutdownDialog); shutdown.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(shutdown); } } }
注意:
Intent.ACTION_REQUEST_SHUTDOWN Intent.EXTRA_KEY_CONFIRM
会报错,这是因为该属性是 {@hide}的。
不要担心放到系统编译就可以了,注意下面的步骤即可。
5.将整个工程放到android源码里面编译
a.手动复制reboot到src/packages/app下面
b.mm-j4开始编译(可以参考《Android入门之源码开发基础教程》)
如果编译成功,在/out/target/product/generic/system/app目录下面,会多一个reboot.apk文件。
6.安装apk
该apk必须放到system/app下面,即adbpushreboot.apk/system/app
思考:
关机或者重启,一个是发送广播,一个是启动Activity。
通过查找相应的action或者string资源(如关机关键字)就可以找到对应的类。
我们知道,framwork的mk文件、资源文件等都在:
/frameworks/base/core/res、frameworks/base/core/res/res
比如关机的那个Activity就是ShutDownActiviy,其又调用ShutdownThread.shutdown。
重启的相关的类在WatchDog.java(定义了相关的量),其内部类RebootRequestReceiver是主要代码。
继续追踪你就会了解整个流程了。
更多关于Android相关内容感兴趣的读者可查看本站专题:《Android开发入门与进阶教程》、《Android多媒体操作技巧汇总(音频,视频,录音等)》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》
希望本文所述对大家Android程序设计有所帮助。