Androidはシステムのシャットダウンと再起動を実現
4863 ワード
Androidはシステムのシャットダウンと再起動を実現
一、APPをシステム権限に昇格する
AndroidMenifestでxmlに次のコードを追加します.
二、シャットダウン権限の追加
注意:AndroidMenifestでテストしました.xmlにこの権限を追加すると警告があり、追加しなくてもシャットダウンが可能なので、具体的には実行の実際の効果が主です.
三、ソースコードでプロジェクトをコンパイルする必要があるため、プロジェクトのためにmkファイルを作成し、プロジェクトルートディレクトリの下にAndroidを追加する.mkファイル、内容は以下の通りです.
四、実現コード
4.1、シャットダウンコード
4.1.1放送方式による実現
注意:
コードの「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回の反射呼び出しでパワーサービスが実現するシャットダウン機能を呼び出すことができます.
4.2、再起動コード
4.2.1放送方式で実現
4.2.2 PowerManagerを呼び出すreboot方法の実現
一、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();
}
}