Firefly开源社区

【Android定制】定制设备重启功能

279

积分

10

威望

9

贡献

社区版主

Rank: 7Rank: 7Rank: 7

积分
279
QQ
发表于 2014-11-11 17:29:38     
本帖最后由 ZZP 于 2014-11-11 17:37 编辑

定制设备【重启】功能,需要确认两个问题:
1、关机对话框代码路径,如何添加【重启】选项
2、设备重启执行方式


带着以上两个问题,分别在Android源代码中进行跟踪消化:
针对问题1:
    在源码frameworks/base/policy/src/com/android/internal/policy/impl/GlobalActions.java 中,里边定义了【关机】【静音】【飞行模式】等全局功能选项,其被实例化使用位于同目录下的PhoneWindowManagershowGlobalActionsDialog方法中,该方法被调用正是响应Power按键长按事件(mPowerLongPress)。
    添加【重启】选项直接在GlobalActions中,参照【关机】选项代码格式添加即可。GlobalActions中添加代码:
+                       mItems.add(
+                       new SinglePressAction(
+                               com.android.internal.R.drawable.ic_lock_power_off,
+                               R.string.factorytest_reboot) {
+
+                           public void onPress() {
+                               // mWindowManagerFuncs.reboot(true);
+                                               // reboot
+                                               mWindowManagerFuncs.reboot(true);
+                           }
+
+                           public boolean onLongPress() {
+                               return true;
+                           }
+
+                           public boolean showDuringKeyguard() {
+                               return true;
+                           }
+
+                           public boolean showBeforeProvisioning() {
+                               return true;
+                           }
+                       });

针对问题2:
    回到GlobalActions中,先了解到【关机】功能是执行代码【 mWindowManagerFuncs.shutdown(true);】,接下来进一步跟踪代码WindowManagerFuncs类,发现其为接口WindowManagerPolicy(路径【frameworks/base/core/java/android/view/WindowManagerPolicy.java】)中定义,其接口实现类在WindowManagerService(路径【frameworks/base/services/java/com/android/server/wm/WindowManagerService.java】,简称WMS)中实现。


    在WMS中,shutdown方法和rebootSafeMode方法的实现类如下:
  1. @Override
  2. public void shutdown(boolean confirm) {
  3.     ShutdownThread.shutdown(mContext, confirm);
  4. }

  5. // Called by window manager policy. Not exposed externally.
  6. @Override
  7. public void rebootSafeMode(boolean confirm) {
  8.     ShutdownThread.rebootSafeMode(mContext, confirm);
  9. }
复制代码




    在这里了解到这些方法实际上是已经封装在ShutdownThread(路径【frameworks/base/services/java/com/android/server/power/ShutdownThread.java】)中,进一步查阅代码发现ShutdownThread类除了上边提到的关机和重启安全模式方法外,还有封装了重启(reboot)方法:
  1. public static void reboot(final Context context, String reason, boolean confirm) {
  2.     mReboot = true;
  3.     mRebootSafeMode = false;
  4.     mRebootReason = reason;
  5.     shutdownInner(context, confirm);
  6. }
复制代码


    显而易见,这里可以用同样的方式将reboot方法添加到WindowManagerFuncs接口中,与关机方法一样进一步在WMS中进行引用封装,具体代码添加如下:


接口WindowManagerPolicy.java中修改:

public interface WindowManagerFuncs {
    ...
         public void shutdown(boolean confirm);
         public void rebootSafeMode(boolean confirm);
+                 public void reboot(boolean confirm);
+                 public void reboot(String reason, boolean confirm);
    ...
}

WMS中实现重启方法:

+    // Called by window manager policy.  Not exposed externally.
+       @Override
+    public void reboot(boolean confirm) {
+               reboot(null, confirm);
+       }
+
+    // Called by window manager policy.  Not exposed externally.
+       @Override
+    public void reboot(String reason,boolean confirm) {
+               ShutdownThread.reboot(mContext, reason, confirm);
+       }



screen.png



回复

使用道具 举报

发表于 2014-11-11 17:36:12     
支持原创帖子
暴走的创客!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

友情链接 : 爱板网 电子发烧友论坛 云汉电子社区 粤ICP备14022046号-2
快速回复 返回顶部 返回列表