android tips(android零碎心得)

修改开机Logo:

源码位置:alps/mediatek/custom/$project_name/uboot/inc/cust_display.h

这个文件定义了logo。

Alps/mediatek/custom/common/uboot/logo/

这个位置放了关机动画的背景,包含了各种尺寸

 

一些经验;如何寻找从来不用的代码、图片位置(比如这次的logo)

1、 按照可能的关键字去搜。。。

2、 不行?去可能的地方去找(比如确定是底层的还是上层的)

3、 不行?那么去翻翻修改记录可能会找点一些线索



一些判断状态栏是否存在的血泪史:

前情概要:就是在状态栏意外终止后,可以按键重启状态栏,

先说简单的,如何重启状态栏:首先状态栏是属于framework的东西。所以用sdk是无法重启状态栏的,权限不够,需要share-userId。

Step1:确认下statusBarService的xml文件,export=true?如果是false,那么要改成true,否则也不能重启状态栏。

Location:/media/Work1/i1800_0214/alps/frameworks/base/packages/SystemUI

Step2:

 StartService(com.android.systemui.statusbar, com.android.systemui.statusbar.StatusBarService);

重启状态栏完成

 

然后说说,如何确认状态栏是否已经挂了。。。

Attempt 1:context.getSystemService(Context.STATUSBAR_SERVICE),通过返回指针是否为空来判断状态栏是否已经挂了。。。失败,因为不管挂不挂返回都不为空。

Attempt 2:context.getRunningService,来获取正在运行的Service,如果没有statusbarService那么重启状态栏Service,这个方案听着十分靠谱,但是依然失败。具体原因不知,但是根据观察,、我手动kill systemui这个进程,这个进程会马上重启。但是状态栏不见了,Service可能还在(不是可能,应该是肯定在)。以下是一些信息,用于以后研究:

1、 发现Service的OnCreate被多次调用,但是OnDestory从来没被调用过

2、 StartService之后,状态栏马上出现说明应该不是刷新问题

Attempt 3:我已经想不出什么招了,只能靠判断当前Activity的高度来判断状态栏是不是还在。这个方法我虽然不喜欢,但至少能判断出来

使用getWindowManager().getDefaultDisplay().getHeight(),我绝望的发现,他返回一个-1,坑爹啊。原来当使用match_parent的时候,它不会返回具体数值。。。这下我彻底绝望了。。(以下省略一万字对于绝望的描述)。

Attempt 4:无意中发现一个函数:

getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);它说它能返回实际的宽高。

这基本上是我解决这个bug的Last Hope,总算不负我望,它终于返回了一个我所希望的值。总算这个问题算是解决了。

 

后记:思路非常简单的一个bug,但却用了整整一天的时间来研究。后来,又来一个棘手的bug,思路也非常简单,但是coding却非常找不到道道,因为OO思想和以前用C语言的面向过程还是不一样的。加上android是个多进程的OS,比以前featurePhone单进程的OS不是一个档次,以前我以前我会多线程同步已经很牛b了,现在看来真是井底之蛙啊。现在改bug的几个难点就是如何几个模块之间进行通信,因为很多时候本模块可以访问其他模块的方法相当少,或者目前我知道得相当少。有的时候想要调用Activity的方法却无法获取该Activity的实体,想同步一些东西,却不得其法。这个有思路,没法coding的有心无力的感觉真的是蛋疼死人。Android Framework 真的是相当的庞大,像我这种当学了不到2~3个月的人来说,去研究framework真的是很吃力,因为app层的东西也刚懂得一知半解。。。呜呼,慢慢来吧


Android4.0 长按编辑框弹出复制粘贴选项的代码位置:

TextView:为什么不在EditText?,恩,就是这么奇妙。看似相当简单的TextView其中竟然饱含如此多的玄机。

 

长按响应:TextView.performLongClick,该方法:首先判断触摸的位置,如果在文字上面则selectCurrentWord,如果当前文本无法选择(如特殊符号等),则不会弹出复制全选选项。如果触摸位置不在文字上面,如果文本可编辑,那么会弹出粘贴选项。

 

Perform粘贴action 代码位置:

ActionPopupWindow类中,该类继承TextView内部类PinnedPopupWindow。

执行粘贴动作的代码在ActionPopupWindow.onClick

 

这个方法onTextContextMenuItem执行大多数:复制粘贴全选操作。


enforceCallingOrSelfPermission用来检查应用是否有权限


General 重写onMeasure过程:

从传入的MeasureSpec获取mode和size,

根据mode和size,设定自身的width和height

如果自身是一个parent,那么可以根据child的layoutparam来makeSpec。

将这个Spec传给child,进行child的measure过程

Eg

For(i=0; i<getChildCount(); i++){

       finalint childWidthMeasureSpec  =

MeasureSpec.makeMeasureSpec(widthSize, childWidthMode);

final intchildHeightMeasureSpec =

MeasureSpec.makeMeasureSpec(heightSize, childHeightMode);

child.measure(childWidthMeasureSpec, childHeightMeasureSpec);

}


Wrap_content & layout_weight=1.0 谁大?

layout_weight=1.0 指的是当parent view之中还有空余的空间,那么剩余空间将全部分给layout_weight=1.0的view。当一个view有了layout_weight=1.0的属性,layout_width或者height将会无效化。

 

Wrap_content指的是以最大可能将Wrap_content所在的view显示完整。所以当Wrap_content与layout_weight=1.0分别在两个身处同一个parent view的情况下,如果Wrap_content可能会把layout_weight=1.0覆盖掉部分。但是如果Wrap_content所在的view大得离谱,即使压榨layout_weight=1.0还是显示不全的话,那么layout_weight=1.0反而会显示正常,而Wrap_content则无法显示完整


View的Rotation相关函数:

setRotationY/X 以X/Y轴为中线进行旋转,一般需要配合以下函数达到满意效果:

setPivotX设定以X轴上面的某点作为支点进行旋转。一般用于Y轴旋转。

setPivotX设定以Y轴上面的某点作为支点进行旋转。一般用于X轴旋转。

setCameraDistance设置Camera的距离,这个Camera是虚拟的,不存在。可以认为是在Z轴上面的某点上面取景。


Difference between layout_gravity andgravity

前者表示其作为children时的位置,当它没有parent时无效。也就是说这个值时提供给parent做参考的,来确定自身在其parent的相对位置。当其parent不是FrameLayout 或者 LinearLayout时无效,(目前来看貌似只有这两个layout的LayoutParams有gravity属性)

后者表示其内部child相对于自身的位置,(从TextView继承出来)

 



连接Wifi后,状态栏数据连接E、H、G消失

因为连接wifi后,网络自动使用wifi,所以图标消失

要想使图标依然显示,修改

frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterViewGemini.java

 

apply()函数

mMobileType.setVisibility(!mWifiVisible ?View.VISIBLE : View.GONE);

mMobileTypeGemini.setVisibility(!mWifiVisible? View.VISIBLE : View.GONE);

 

将判断去掉即可





  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值