Android 系统重启与关机:Java 代码实现

在应用层如何通过代码实现 Android 系统的重启,分享给大家。

这篇博客是在 android 系统开发的基础之上进行实践的,所以如果你是纯粹的 app 开发,可能要让你失望了。

该代码在真机上测试成功,在模拟器上面测试失败。

在 linux 下面,重启 pc,非 root 用户需要执行 sudo reboot,所以在 android 下重启机器也需要一定的权限。

应用程序界面:

Android 系统重启与关机:Java 代码实现

1. 新建一个 android 工程 reboot

Android 系统重启与关机:Java 代码实现

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 开始编译(可以参考

如果编译成功,在 /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://127.0.0.1/wyygys.html