安卓源代码修改之framework下面长按power键,修改安卓原生的关机、重启界面(一)

前几天工作中遇到一个问题,修改安卓源代码中的长按Power键之后弹出的界面,以及点击事件。下面给大家说一下我自己的一些心得。
我的需求是这样的,仿造华为手机,长按power之后出来一个Activity,然后四个图片,省电模式、情景模式、重启、关机。点击重启或关机按钮,其他三个按钮就会渐变的往后移动,直至消失,然后点击的按钮自己移动到中间。然后点击一下除了按钮之外的任何一个地方就要返回到上一级菜单。点击一下情景模式,其他三个按钮也会渐变消失,然后跳出一个dialog,让用户选择响铃、震动、静音。

刚开始,接到这个任务的时候,根本就没有想到过,自己能去改源代码。。但是上面给我限制了时间,让我必须得完成,所以就一股脑的认真对待这个任务了。其实修改源代码,改成自己想要的需求,只要认真做,真的一点也不难,不要总觉得自己没有涉及过源代码,觉得自己做不来啥的,你又没有尝试着去做,你怎么知道自己不行?是吧,所以下面我回归正题上!
主要修改代码的路径是frameworks\base\services\core\java\com\android\server\policy中的GlobalActions.java。
现在我们从头看一下长按power键的那个操作在哪里。frameworks\base\services\core\java\com\android\server\policy中的PhoneWindowManager这个类中有一个方法叫showGlobalActionsInternal()。只要长按power键就系统就会调用这个方法。代码不多,如下:
void showGlobalActionsInternal() {
sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);
if (mGlobalActions == null) {
mGlobalActions = new GlobalActions(mContext, mWindowManagerFuncs);
}
final boolean keyguardShowing = isKeyguardShowingAndNotOccluded();
mGlobalActions.showDialog(keyguardShowing, isDeviceProvisioned());
if (keyguardShowing) {
// since it took two seconds of long press to bring this up,
// poke the wake lock so they have some time to see the dialog.
mPowerManager.userActivity(SystemClock.uptimeMillis(), false);
}
}
好好看一下这段代码,就会知道,最终调用的是GlobalActions这个类,因为他new了一个GlobalActions类。(接下来就是无限的调用了,A方法调用B方法,B方法调用C方法,C方法调用D方法。。。。最终调用出了我们想要出来的界面。耐心一点就好了!)
然后我们看到了一句最重要的代码— mGlobalActions.showDialog,我们再跳转到GlobalActions类,找一下 showDialog这个方法。
public void showDialog(boolean keyguardShowing, boolean isDeviceProvisioned) {
mKeyguardShowing = keyguardShowing;
mDeviceProvisioned = isDeviceProvisioned;
if (mDialog != null) {
mDialog.dismiss();
mDialog = null;
// Show delayed, so that the dismiss of the previous dialog completes
mHandler.sendEmptyMessage(MESSAGE_SHOW);
} else {
handleShow();
}
}
这段代码中我们看到了handleShow();这个方法,那我们就再跳转到handleShow();这个方法看一下,然后我们看到createDialog();这个最终调用的方法。好好看完这个方法之后发现,原先长按power之后跳出来的Dialog,其实不是我们想象的那么建的的一个对话框,说白点就是,他不是Dialog,他是ListView,然后适配器填充了所有的数据之后显示在这个ListView上,让我们第一眼看的时候误以为是Dialog。。然后这个ListView是怎么显示的呢?这里他又new了一个新的类,GlobalActionsDialog,他是继承于Dialog的,但是这个太复杂了,说实话,我也没搞明白为什么要写的这么复杂。。。
好,废话少说,现在我们整体看一下,长按power键之后系统走的流程。phoneWindowManager–>showGlobalActionsInternal()—>showDialog()—>这时已经跑到GlobalActions.java中去了—>handleShow()—>createDialog()—>GlobalActionsDialog()。因为GlobalActionsDialog()太复杂,我不可能会把他改来改去然后改成我自己想要的,要是去改这个,给我一个月的时间我都不一定能做得来,所以我索性,把handleShow()这个方法中的所有代码都注释掉了,代码不多,不会影响其他,当然createDialog()就不会再被我调用了,然后我在handleShow()这个方法里重新startActivity了一个新的Activity。也就是说长按power键之后,就会startActivity,然后跳转到新的Activity上。然后这个Activity的布局,就不用我多说了吧,自己在eclipse上写好直接复制进去frameworks\base\core\res\res\layout这个路径下面就ok了。
下面是我在handleShow()这个方法中,把原先的注释掉之后,自己写的几行代码:
private void handleShow() {
Intent intent=new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setClass(mContext, Dialog_Activity2.class);
mContext.startActivity(intent);
}
把这几行代码一写,长按power键之后就会跳出一个Activity,上面显示的就是你自己写好的布局。当然,在这个成功出现之前,当然会报很多错误。所有报过的错误以及修改方法都列在下面:
1、把你自己写好的Activity,这里就是Dialog_Activity2了,把这个Activity放到指定的目录下,frameworks\base\services\core\java\com\android\server。
2、在AndroidManifest.xml文件中(frameworks\base\core\res路径下)定义你这个Activity。
activity android:name=”com.android.server.Dialog_Activity2”
android:taskAffinity=”com.xjp”
android:theme=”@style/Transparent”
Activity放到了哪里,就在这个文件中也要写好他的路径,不然也会报错,说找不到对应的Activity!!!
3、在上面的handleShow()方法中的intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)这一行以及2标题中的 android:taskAffinity=”com.xjp”这一行代码,这两行代码是必须要写进去的。不然就会编译不过,报错的大概意思就是说,“你startActivity跳转的时候,你当前的页面不是Activity,你必须给他设置属性这样才能跳转,intent需要setFlags”,至于这两行代码是啥意思,搞安卓的人大概都能明白,Activity的启动方式有四种,我写的这个NEW_TASK就是其中的一种(不懂得可以多查查资料),总之这两行是必须要加的!
4、然后framework有一个很独特的地方,你给他加了一个布局对不对,就是你自己写的那个布局,然后放进layout文件夹中的那个xml 。记住的一点就是必须给frameworks\base\core\res\res\values中的symbol.xml中给他定义,不然也是会报错的。以及你在你的这个布局中定义的所有的id、drawable、string等等都在这个文件中定义。例如:
< java-symbol type=”id” name=”textView4”
java-symbol type=”id” name=”imageButton1”
java-symbol type=”color” name=”transparent_background”
java-symbol type=”style” name=”Transparent”
java-symbol type=”layout” name=”long_press_activity”
java-symbol type=”anim” name=”single1”
java-symbol type=”drawable” name=”qingjing”
java-symbol type=”string” name=”shengdian”
眼尖的同学也看到了吧,color、style这种的也要定义的!!!!
5、因为这个需求还有渐变,移动,消失这些动画效果,所以在frameworks\base\core\res\res中的anim文件中,把自己所有的动画的XML文件也是要放进去的!

以上只是长按power键之后,正确的显示你自己写好的布局,不会让他报错。至于里面的四个按钮的点击事件,后期再发布!!

以上都是本人按照自己做出来的效果写出来的心得,希望能帮助到有需要的童鞋~~如有雷同纯属巧合!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值