Android编程实现系统重启与关机的方法

本文实例讲述了Android编程实现系统重启与关机的方法。分享给大家供大家参考,具体如下:

最近在做个东西,巧合碰到了sharedUserId 的问题,所以收集了一些资料,存存档备份。

安装在设备中的每一个apk文件,Android 给每个 APK 进程分配一个单独的用户空间,其 manifest 中的 userid 就是对应一个 Linux 用户都会被分配到一个属于自己的统一的 Linux 用户 ID,并且为它创建一个沙箱,以防止影响其他应用程序(或者其他应用程序影响它)。

用户 ID 在应用程序安装到设备中时被分配,并且在这个设备中保持它的永久性。

通过 Shared User id 拥有同一个User id的多个APK可以配置成运行在同一个进程中.所以默认就是可以互相访问任意数据. 也可以配置成运行成不同的进程,同时可以访问其他APK的数据目录下的数据库和文件.就像访问本程序的数据一样.
对于一个 APK 来说,如果要使用某个共享 UID 的话,必须做三步:

1、在 Manifest 节点中增加 android:sharedUserId 属性。

2、在 Android.mk 中增加 LOCAL_CERTIFICATE 的定义。

如果增加了上面的属性但没有定义与之对应的 LOCAL_CERTIFICATE 的话,APK是安装不上去的。

提示错误是:

Package com.test.MyTest has no signatures that match those in shared user android.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)或者 openOrCreate Database(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 用户需要执行 sudo reboot,所以在 android 下重启机器也需要一定的权限。

应用程序界面:
 
1. 新建一个 android 工程 reboot
 
2. 编写 Android.mk

LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := reboot LOCAL_CERTIFICATE := platform include $(BUILD_PACKAGE) # Use the folloing include to make our test apk. include $(call all-makefiles-under,$(LOCAL_PATH))

具体含义可自行查阅资料。注意:

LOCAL_CERTIFICATE := platform

3. 编写补充 AndroidMenifest.xml

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="mark.zhang" android:versionCode="1" android:versionName="1.0" > <uses-sdk android: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 > <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>

注意:

android:sharedUserId="android.uid.system"

4. 编写逻辑代码 RebootActivity.java

package mark.zhang; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; public class RebootActivity extends Activity { // 是否显示关机确认的对话框 // false 不显示确认关机的对话框,直接关机 // true 显示确认关机的对话框,让用户选择是否确认关机 public static final boolean showShutdownDialog = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } /** * 发送广播. * * @param view */ public void onReboot(View view) { Intent reboot = new Intent(Intent.ACTION_REBOOT); reboot.putExtra("nowait", 1); reboot.putExtra("interval", 1); reboot.putExtra("window", 0); sendBroadcast(reboot); } /** * 启动 Activity. * * @param view */ public void onShutdown(View view) { public void onShutdown(View view) { Intent shutdown = new Intent(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 下面,即 adb push reboot.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程序设计有所帮助。

时间: 2024-10-25 04:18:09

Android编程实现系统重启与关机的方法的相关文章

Android编程实现系统重启与关机的方法_Android

本文实例讲述了Android编程实现系统重启与关机的方法.分享给大家供大家参考,具体如下: 最近在做个东西,巧合碰到了sharedUserId 的问题,所以收集了一些资料,存存档备份. 安装在设备中的每一个apk文件,Android 给每个 APK 进程分配一个单独的用户空间,其 manifest 中的 userid 就是对应一个 Linux 用户都会被分配到一个属于自己的统一的 Linux 用户 ID,并且为它创建一个沙箱,以防止影响其他应用程序(或者其他应用程序影响它). 用户 ID 在应用

Android编程获取系统隐藏服务实现锁屏的方法_Android

本文实例讲述了Android编程获取系统隐藏服务实现锁屏的方法.分享给大家供大家参考,具体如下: 实现原理:当按锁屏键时,会发出一个广播,当界面接收到一个广播就可以实现锁频.我们可以调用IDevicePolicyManager服务中的lockNow方法来发送一个广播实现锁屏. IDevicePolicyManager是被系统隐藏掉的,需要通过反射还获取此服务. 步骤: 1.创建MyAdmin的广播接收者继承DeviceAdminReceiver 2.通过反射 ,获取IDevicePolicyMa

android编程实现系统图片剪裁的方法_Android

本文实例讲述了android编程实现系统图片剪裁的方法.分享给大家供大家参考,具体如下: package cn.test; import java.io.File; import java.text.SimpleDateFormat; import java.util.Date; import android.app.Activity; import android.content.ContentResolver; import android.content.ContentUris; impo

Android编程调用系统自带的拍照功能并返回JPG文件示例【附demo源码下载】

本文实例讲述了Android编程调用系统自带的拍照功能返回JPG文件.分享给大家供大家参考,具体如下: package com.eboy.testcamera1; import java.io.File; import java.io.FileOutputStream; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.os.Bund

Android编程获取系统隐藏服务实现锁屏的方法

本文实例讲述了Android编程获取系统隐藏服务实现锁屏的方法.分享给大家供大家参考,具体如下: 实现原理:当按锁屏键时,会发出一个广播,当界面接收到一个广播就可以实现锁频.我们可以调用IDevicePolicyManager服务中的lockNow方法来发送一个广播实现锁屏. IDevicePolicyManager是被系统隐藏掉的,需要通过反射还获取此服务. 步骤: 1.创建MyAdmin的广播接收者继承DeviceAdminReceiver 2.通过反射 ,获取IDevicePolicyMa

android编程实现系统图片剪裁的方法

本文实例讲述了android编程实现系统图片剪裁的方法.分享给大家供大家参考,具体如下: package cn.test; import java.io.File; import java.text.SimpleDateFormat; import java.util.Date; import android.app.Activity; import android.content.ContentResolver; import android.content.ContentUris; impo

win8系统快键关机设置方法

win8系统快键关机设置方法   步骤/方法 1.先看下正常的关机方法吧:我们需要在右侧的的开始菜单中找到设置按钮,通过设置按钮进入到关机界面. 2.关机界面同样显示在右侧,点击"电源"按键之后,会出现"睡眠""关机"和"重启"三个按钮,用户可选择相应设置. 点击一下就关机了,win8关机很快的哦-- win8的关机步骤要走4步,比起win7多两步,比xp多一步 3.现在设置在"开始"屏幕中创建关机图标.右

xp系统远程控制开关机的方法

  大家都知道,电脑中有一个功能就是远程操控,可以对远方的电脑实习操控,这其实也就是客户端在获取许可之后,对电脑进行操控.现在有一种更加便捷的方法,可以实现远程关闭电脑或是重启电脑,这样的话的确是方便了很多.下面小编就教大家如何实现XP系统远程控制开关!不过也有拒绝访问的问题,这时就需要关闭远程了,小伙伴们赶紧跟着小编的节奏一起来看看吧! xp系统远程控制开关机的方法教程操作如下: 1.第一步也是打开我们电脑中的开始菜单,电脑左下角圆形图标点击就是开始菜单了. 2.我们打开了开始菜单了以后就可以

Android编程实现TextView字体颜色设置的方法小结_Android

本文实例讲述了Android编程实现TextView字体颜色设置的方法.分享给大家供大家参考,具体如下: 对于setTextView(int a)这里的a是传进去颜色的值.例如,红色0xff0000是指0xff0000如何直接传入R.color.red是没有办法设置颜色的,只有通过文章中的第三种方法先拿到资源的颜色值再传进去. 复制代码 代码如下: tv.setTextColor(this.getResources().getColor(R.color.red)); 关键字: android t