歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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://www.linuxidc.com/Linux/2012-05/59704.htm)

如果編譯成功,在 /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 是主要代碼。

繼續追蹤你就會了解整個流程了。

Copyright © Linux教程網 All Rights Reserved