涉及到的源码(4.0)
ics/frameworks/base/policy/src/com/android/internal/policy/impl/目录下:
PhoneWindowManager.java
GlobalActions.java

ics/frameworks/base/core/java/com/android/internal/app/目录下:
ShutdownThread.java


1,跟踪Power键的长按事件,定位到弹出关机Dialog的源码是在PhoneWindowManager.java中
继续跟踪代码找到Runnable mPowerLongPress = new Runnable(),在该runnable里边调用showGlobalActionsDialog()方法便是显示长按power键弹出的关机提示对话框,如果你的机器是原生态的,默认提示“飞行模式”,“静音”和“关机”选项。
showGlobalActionsDialog创建关机对话框的代码在GlobalActions.java里边,主要代码如下:

private AlertDialog createDialog() {
……
mItems = new ArrayList();

// first: power off
mItems.add(
new SinglePressAction(
com.android.internal.R.drawable.ic_lock_power_off,
R.string.global_action_power_off) {

public void onPress() {
// shutdown by making sure radio and power are handled accordingly.
ShutdownThread.shutdown(mContext, true);
}

public boolean showDuringKeyguard() {
return true;
}

public boolean showBeforeProvisioning() {
return true;
}
});
[color=red] mItems.add(
new SinglePressAction(
com.android.internal.R.drawable.ic_lock_power_off,
R.string.global_action_reboot) {

public void onPress() {
// shutdown by making sure radio and power are handled accordingly.
ShutdownThread.reboot(mContext, true);
}

public boolean showDuringKeyguard() {
return true;
}

public boolean showBeforeProvisioning() {
return true;
}
});[/color]
// next: airplane mode
mItems.add(mAirplaneModeOn);

// last: silent mode
if (SHOW_SILENT_TOGGLE) {
mItems.add(mSilentModeAction);
}
……


如上,加入红色部分代码,由于ShutdownThread中已经有了reboot函数。
当然要在values/strings.xml中加入

重启
"正在重启..."

reboot方法的后两个参数解释如下:
reason 如果值为是null,正常重启;如果是recovery,系统重启进入recovery mode
confirm true显示关机提示框,需要用户【确认】;false不显示提示框,直接关机

2,另外一个问题是提示框的问题
在ShutdownThread.java的beginShutdownSequence(context)中加入对是否为reboot的判断:

……
if(mReboot){ // reboot progress
pd.setTitle(context.getText(com.android.internal.R.string.global_action_reboot));
pd.setMessage(context.getText(com.android.internal.R.string.reboot_progress));
}else{ // shutdown progress
pd.setTitle(context.getText(com.android.internal.R.string.power_off));
pd.setMessage(context.getText(com.android.internal.R.string.shutdown_progress));
}
……



3,编译
注意顺序
最后编译
因为修改涉及到系统资源文件又涉及到policy.jar包,所以按照以下顺序:
步骤1.编译frameworks/base/res,在out/target/product/X设备名X/system/framework/目录下生成framework-res.apk
步骤2.编译frameworks/base/,在out同样目录下生成framework.jar包(不能忽略,不然步骤3编译报错)
步骤3.编译frameworks/base/policy,在同样目录下生成policy.jar包

更多相关文章

  1. Ubuntu20.04 编译Android(安卓)10源码 并烧录源码到pixel3的避坑
  2. Android(安卓)NDK HelloJNI
  3. 图解Android和Linux发行版的区别
  4. apk反编译
  5. android全平台基于ffmpeg解码本地MP4视频推流到RTMP服务器
  6. 关于Android(安卓)动态加载 jar 文件
  7. Android:Gradle 解析
  8. Android开发手记一 NDK编程实例
  9. Android(安卓)Apk 反编译,Apk 修改以后再编译打包,签名

随机推荐

  1. Android中Handler的使用方法——在子线程
  2. Android(安卓)APK反编译得到Java源代码和
  3. Opera Mobile 在 Android(安卓)x86 上運
  4. Android(安卓)中电源状态切换
  5. Android占据80%的市场份额
  6. Android中TextView与EditText控件实现禁
  7. Android(安卓)Framework启动流程浅析
  8. Android的adb命令介绍
  9. Android(安卓)SDK 4.2 正式版发布
  10. android定位并获取城市