String.equals()的使用异常

        最近感触最深的就是我需要赶紧提升,个人工作能力,写作能力,股票分析能力,逆向思维模式等等。为什么有这种想法,一、对自己有了更高的期盼,二、对自己现在的状况不满意。做为一个闷骚型IT男,业余活动太小,周末都少有出门,接触外面的世界太少,不会待人,生活常识也少的可伶。发一下牢骚,今天开始写作,不管是对生活的感悟还是对事情的个人看法,当然也不能少了软件bug,希望能坚持把生活的一些经历记录下来。

        言归正传,这是关于framework中遇到的bug记录,项目需求,要添加一个实体reset按键,底层驱动容易实现,只要修改一下dtsi,上报一个键值即可,看硬件reset按键和power键一样是连接在pmic上的,并不是连在CPU上,所以我们只要修改pmic的dtsi就可以,如下:

String.equals()的使用异常_第1张图片

按键配置

pon_1是power键, pon_2是reset键。下一步我们配framework的KEYCODE。在Generic.kl 中添加key  356  REBOOT。PhoneWindowManager.java中interceptKeyBeforeQueueing()函数添加KEYCODE_REBOOT的拦截: 

     case KeyEvent.KEYCODE_REBOOT: { //add a power reset key by maoyuanqiu

          mPowerManager.reboot("reboot");

                break;    } 

但是这样修改后,按下reset按键走的是虽然重启了但是弹出的关机的界面。因此我在shutdownThread增加了一个重启的提示框beginShutdownSequence()函数添加了:

            else if( mReason.equals("reboot")){

            pd.setTitle(context.getText(com.android.internal.R.string.power_reboot));

            pd.setMessage(context.getText(com.android.internal.R.string.shutdown_progress));

            pd.setIndeterminate(true);

这样就可以了吗?代码没有问题了?



这样的修改经不起测试,按reset键没有暴露问题,但是当batteryService或者其他应用发送ACTION_REQUEST_SHUTDOWN广播时,系统会出现异常,系统重启到一半卡住不动。

01-01 03:06:51.960 E/AndroidRuntime( 3815): *** FATAL EXCEPTION IN SYSTEM PROCESS: PowerManagerService

01-01 03:06:51.960 E/AndroidRuntime( 3815): java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference

01-01 03:06:51.960 E/AndroidRuntime( 3815): at com.android.server.power.ShutdownThread.beginShutdownSequence(ShutdownThread.java:318)

01-01 03:06:51.960 E/AndroidRuntime( 3815): at com.android.server.power.ShutdownThread.shutdownInner(ShutdownThread.java:198)

01-01 03:06:51.960 E/AndroidRuntime( 3815): at com.android.server.power.ShutdownThread.shutdown(ShutdownThread.java:139)

01-01 03:06:51.960 E/AndroidRuntime( 3815): at com.android.server.power.PowerManagerService$4.run(PowerManagerService.java:2524)

01-01 03:06:51.960 E/AndroidRuntime( 3815): at android.os.Handler.handleCallback(Handler.java:751)

01-01 03:06:51.960 E/AndroidRuntime( 3815): at android.os.Handler.dispatchMessage(Handler.java:95)

01-01 03:06:51.960 E/AndroidRuntime( 3815): at android.os.Looper.loop(Looper.java:154)

01-01 03:06:51.960 E/AndroidRuntime( 3815): at android.os.HandlerThread.run(HandlerThread.java:61)

01-01 03:06:51.960 E/AndroidRuntime( 3815): at com.android.server.ServiceThread.run(ServiceThread.java:46)

log中很明确的说明com.android.server.power.ShutdownThread.beginShutdownSequence(ShutdownThread.java:318)  ShutdownThread.java:318 有问题,这里是我添加reset提示框的地方。即: else if( mReason.equals("reboot")){  有问题。为什么?String 类型的mReason没有自检,因此这里只需要修改为:if(mReason != null && mReason.equals("reboot"))。

你可能感兴趣的:(String.equals()的使用异常)