`
cloudtech
  • 浏览: 4683933 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

android 系统重启与关机:java 代码实现

 
阅读更多

在应用层如何通过代码实现 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 开始编译(可以参考 http://blog.csdn.net/androidbluetooth/article/details/7058717


如果编译成功,在/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 是主要代码。


继续追踪你就会了解整个流程了。



粘贴一篇关于权限的文章:

http://www.5bay.cn/android%E7%AC%94%E8%AE%B0/androidquanxianzhishareduseridheqianming.html


最近在做个东西,巧合碰到了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 userandroid.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系统中,实现关机和重启功能并不是一件简单的事情,因为涉及到系统的底层操作和权限控制。下面将详细讲解如何在Android应用中实现这一功能。 首先,我们要理解Android的权限模型。由于涉及到设备的安全性...

    android代码控制关机重启

    在Android系统中,控制设备的关机和重启是高级功能,通常由系统权限较高的应用程序或者服务执行。在本文中,我们将深入探讨如何通过代码实现这一功能,并了解相关的安全性和限制。 首先,我们要知道,Android系统...

    android重启和关机

    本文将深入探讨Android设备的重启和关机机制,并基于提供的代码片段解析如何通过编程方式实现这两种操作。 首先,理解Android设备的重启过程。重启通常包括两部分:系统层的重启和硬件层的重启。在系统层,当收到...

    android 4.1 重启,关机, 应用开机自启动,获取系统签名

    3. **Android重启与关机功能**: 实现设备重启和关机功能需要较高的系统权限,通常只有系统应用或拥有ROOT权限的应用才能做到。在非系统应用中,可以使用Intent来调用系统的重启或关机服务,但这通常会受到安全限制...

    Android 关机和重启(reboot and shutdown)源码.zip

    首先,我们要知道在Android系统中,关机和重启的实现主要依赖于系统的内核层和用户空间的服务。在内核层,Android通过调用特定的系统调用来实现这些操作,而在用户空间,Android框架层的`SystemServer`服务则负责...

    Android关机和重启(reboot and shutdown)源码.rar

    这个压缩包文件“Android关机和重启(reboot and shutdown)源码.rar”很可能包含的是Android操作系统执行关机和重启操作的核心源代码。下面我们将深入探讨Android系统中的关机和重启过程以及相关知识点。 1. **...

    Android代码-关机和重启reboot.zip

    总结起来,在Android平台上实现关机和重启功能涉及系统权限、广播Intent以及可能的底层操作。对于普通应用,除非有特别的需求和用户的明确授权,否则不建议直接进行这类操作。开发者应当遵循最佳实践,尊重用户的...

    Android简单通讯源码:手机控制PC的关机、重启

    在Android平台上实现手机控制PC的关机和重启功能,涉及到的主要技术点包括网络通信协议、设备间的数据传输以及Android权限管理。以下是对这些知识点的详细解释: 1. **网络通信协议**:在这个项目中,手机作为...

    Unity调用Android系统PowerManager类功能.zip

    在Unity引擎中调用Android系统的PowerManager类是开发者为了实现特定功能,如控制设备的电源状态,例如关机、重启、使设备进入睡眠模式或唤醒设备等。这通常需要通过Unity的Android插件机制来实现,并且由于涉及到...

    Android关机和重启的调用代码[借鉴].pdf

    由于Android是基于Linux的,因此其关机和重启操作与Linux系统中的相应机制密切相关。以下是对标题和描述中涉及的知识点的详细说明: 1. **权限要求**: 在Android系统中,执行关机或重启操作需要具有较高的权限,...

    Android实现关机与重启的几种方式(推荐)

    在Android平台上,实现设备的关机与重启功能通常需要管理员级别的权限,因为这些操作涉及到系统的安全性和稳定性。在默认的SDK中,Google并未提供直接的API供应用开发者使用。但是,开发者可以通过一些间接的方式来...

    Android 关机和重启(reboot and shutdown)源码-IT计算机-毕业设计.zip

    2. **重启(Reboot)**:与关机类似,重启命令会触发一系列的清理和启动流程。Android系统中的重启分为两种类型:正常重启和安全模式重启。在`init.cpp`中,`android::system::Reboot()`函数处理了这些情况。正常...

    Android关机重启

    在Android系统中,实现设备的关机和重启功能涉及到一系列的步骤和技术。下面将详细解析这些知识点,并且根据提供的代码片段进行深入分析。 首先,我们来看Android如何实现关机和重启。这两个操作主要由`...

    Android 简单通讯源码:手机控制PC的关机、重启、.zip

    该Android项目是一个实现手机控制PC关机和重启功能的简单通信示例,主要涉及的技术点包括Android应用开发、Java编程语言以及设备间的通信协议。在这个项目中,开发者使用了Java编程语言来构建Android应用程序,实现...

    android定时关机,重启

    在Android系统中,实现定时关机和重启的功能通常涉及到对底层命令的调用,因为Android是一个基于Linux内核的操作系统,所以我们可以利用Linux命令来实现这些功能。在本篇文章中,我们将深入探讨如何在Android应用中...

    Android 关机和重启(reboot and shutdown)源码.zip源码资源下载

    本资源包"Android 关机和重启(reboot and shutdown)源码.zip"提供了Android系统实现关机和重启功能的源代码,帮助开发者深入理解这一过程。以下是关于这个主题的详细知识点: 1. **系统服务**: - 在Android中,...

    关机重启TV版源码

    【标题】"关机重启TV版源码"指的是一个专为安卓网络电视盒子设计的应用程序源代码,该程序允许用户实现设备的关机和重启功能。在深入探讨这个主题之前,我们首先要理解基础的Android系统架构和权限管理。 在Android...

    Android自动开关机实现.zip

    总的来说,实现Android自动开关机需要深入理解Android系统架构,熟悉系统权限、广播接收器、定时任务、系统服务交互以及原生代码的使用。这个项目可以作为学习Android系统级编程的实践案例,通过研究源码和文档,...

    Android源码——关机和重启(reboot and shutdown)源码.zip

    本压缩包文件提供了Android源码中与关机和重启相关的代码,这对于理解Android系统底层工作原理非常有帮助。我们将探讨以下几个关键知识点: 1. **SystemServer进程**: Android系统的关机和重启操作主要由...

Global site tag (gtag.js) - Google Analytics