Androidはシステムのシャットダウンと再起動を実現

4863 ワード

Androidはシステムのシャットダウンと再起動を実現
一、APPをシステム権限に昇格する
AndroidMenifestでxmlに次のコードを追加します.
android:sharedUserId="android.uid.system"

二、シャットダウン権限の追加

注意:AndroidMenifestでテストしました.xmlにこの権限を追加すると警告があり、追加しなくてもシャットダウンが可能なので、具体的には実行の実際の効果が主です.
三、ソースコードでプロジェクトをコンパイルする必要があるため、プロジェクトのためにmkファイルを作成し、プロジェクトルートディレクトリの下に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 := PowerActionDemo  
LOCAL_CERTIFICATE := platform  
  
include $(BUILD_PACKAGE)

四、実現コード
4.1、シャットダウンコード
4.1.1放送方式による実現
/**
     *   
     *
     * @param v
     */
    public void shutDown(View v) {
        try {
            //    "android.intent.action.ACTION_REQUEST_SHUTDOWN“    Intent.ACTION_REQUEST_SHUTDOWN  
            Intent intent = new Intent("android.intent.action.ACTION_REQUEST_SHUTDOWN");
            //    "android.intent.extra.KEY_CONFIRM"   Intent.EXTRA_KEY_CONFIRM  ,
            //   false  true,            
            intent.putExtra("android.intent.extra.KEY_CONFIRM", true);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

注意:
コードの「android.intent.action.ACTION_REQUEST_SHUTDOWN」がIntent.ACTION_REQUEST_SHUTDOWN;
「android.inttent.extra.KEY_CONFIRM」がIntent.EXTRA_KEY_CONFIRM.
2つの属性が上位層に開放されていないため、呼び出さずに直接書きました.
4.1.2反射呼び出しによる実現
①、PowerManagerクラスはシャットダウンのshutdownインタフェースを提供していないが、IBinderというAndroid特有の通信モードでPowerManagerServiceクラスと通信する.PowerManagerServiceは、PowerManagerクラスで定義インタフェースの具体的な実装であり、さらにPowerクラスを呼び出して次の階層と通信する.PowerManagerServiceではshutdownインタフェースを実現し、Powerサービスではシャットダウン機能を実現しました.②、PowerManagerの実装はIPowerManagerによってPowerサービスを呼び出すインタフェースである.IPowerManagerは、AIDLファイルが自動的に生成されるクラスで、遠隔通信が容易です.
③、IPowerManage.aidlファイルディレクトリ「framework/base/core/java/android/os/I PowerManagement.aidl」
④、IPowerManagerはshutdownインタフェースを実現しているので、PowerサービスのIBinderを入手できれば、shutdownメソッドを反射的に呼び出すことでシャットダウン機能を実現できる.サービスマネージャは、システムのサービスプログラムを管理しており、すべてのサービスのIBinderを保存しており、サービス名でこのサービスのIBinderを取得することができます.ただし、ServiceManagerというクラスもHIDEであり、呼び出しを反射する必要があります.2回、2回の反射呼び出しでパワーサービスが実現するシャットダウン機能を呼び出すことができます.
/**
     *   
     * @param view
     */
    public void shutDown(View view) {
        try {
            //  ServiceManager 
            Class> ServiceManager = Class.forName("android.os.ServiceManager");
            //  ServiceManager getService  
            Method getService = ServiceManager.getMethod("getService", java.lang.String.class);
            //  getService  RemoteService
            Object oRemoteService = getService.invoke(null, Context.POWER_SERVICE);
            //  IPowerManager.Stub 
            Class> cStub = Class.forName("android.os.IPowerManager$Stub");
            //  asInterface  
            Method asInterface = cStub.getMethod("asInterface", android.os.IBinder.class);
            //  asInterface    IPowerManager  
            Object oIPowerManager = asInterface.invoke(null, oRemoteService);
            //  shutdown()  
            Method shutdown = oIPowerManager.getClass().getMethod("shutdown", boolean.class, boolean.class);
            //  shutdown()  
            shutdown.invoke(oIPowerManager, false, true);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

4.2、再起動コード
4.2.1放送方式で実現
 /**
     *   
     *
     * @param v
     */
    public void reBoot(View v) {
        try {
            Intent intent2 = new Intent(Intent.ACTION_REBOOT);
            intent2.putExtra("nowait", 1);
            intent2.putExtra("interval", 1);
            intent2.putExtra("window", 0);
            sendBroadcast(intent2);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

4.2.2 PowerManagerを呼び出すreboot方法の実現
/**
     *   
     * @param view
     */
    public void reBoot(View view) {
        try {
            PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
            pm.reboot("");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }