安卓开发,各类问题综

各类杂碎问题


1.用真机和模拟器一起测试程序,抽掉usb之后eclipse不停的弹出DeviceMonitor]Connection attempts: 1

去ddms页面,ddms

点击右边的箭头,然后选择resetADB


2.使用真机测试的时候,通知栏没有usb选项或者有选项调试授权框不弹出

通知栏没有usb选项的:首先换个数据线,这个换起来比价方便,要么去手机看看usb调试打开了没有,没有开发人员选项的点设置,点关于手机,点击版本,连续点击版本号
如果上面做完了还是不出来,还是去换数据线

调试授权框不弹出的:你可以去任务管理器,点进程,找adb,然后结束它,重启eclipse,插拔usb,但是一般不管用~~~不要打我~~~

有个比较麻烦的方法,下载360手机助手PC版,下载之前会让你下载360,因此我把腾讯管家卸载了,因为应用宝用了和没用没什么区别(这里没有黑的成分),然后连接手机,然后你会发现授权框出来了,公司的魅族,华为,三星都是如此。


3.华为手机

华为手机:很多都是键位内嵌到屏幕里面,这里会引起一个问题,当它加载activity的时候,虚拟键位并不会被activity覆盖,那么,当他竖屏的时候,他的实际高度为activity 的高度加上虚拟键位的高度,当他横屏的时候,实际宽度等于activity的宽度加上虚拟键位的宽度。这会导致一些问题,

例如当你横屏的时候你要显示一个popupWindow,从右到左显示,你会发现在其他手机里没什么问题,到了华为就少了一截。

另外,做字体适配的时候,会在res下建立一个文件夹values-1920x1080这样的,当有虚拟键位的时候,即使它原本是1920x1080,实际的宽或高会减少虚拟键位占用的空间,变成例如1850x1080这样。

在代码中,你可以使用这一行代码暂时隐藏虚拟键位,一旦发生交互,首次交互将显示虚拟键位

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
在做视频等应用的时候,可以暂时隐藏一下。

4.eclipse的logcat输出不全问题

有的时候需要打印的数据过多,例如一个字符串的长度过长,会导致logcat不能输出全部的字符串内容,因为长度超过了logcat的最大长度,这个时候你可以试试把字符串的内容写到文本中,然后导出到电脑上查看全部内容。


5.apk反编译与防止反编译

反编译方法1:转载于http://blog.csdn.net/vipzjyno1/article/details/21039349/

利用apktool或者dex2jar和jd-gui来进行反编译

反编译方法2:利用工具直接查看apk的源码文件

下载地址为:下载

下载并解压,然后打开Smali2JavaUI.exe,点击左边选择打开一个项目,选择一个apk文件

然后你就会看到源码(加密和防加密你懂的,并不一定能看到。)


防止反编译:花了一段时间去弄混淆,但是网上看到的教程真的是不敢恭维,

简单粗暴一点的,百度搜爱加密,方便快捷。


6.eclipse下,仅查看某一个项目的输出

打开项目的manifest文件,找到根节点的pakage属性并复制,点击logcat左边的绿色加号,把复制的内容粘贴到第一行和最后一行点ok就行。之所以不直接复制src下的包名是防止中途改了应用包名,这个时候你复制src下的包名是没用的。


7.socket基于TCP/IP传输时,数据包沾包拆包的问题和解决思路

在写关于tcp网络的时候,都会用到socket的字节流,当你同时发送多条消息的时候,由于TCP本身的算法,有时候并不会因为你调用了发了第一条的方法就马上把第一条消息发出去,它可能会等待一段时间看看有没有第二条信息,如果有就一起发送过去,由于tcp是长连接形式,所以一次的数据量并不太大,当传输内容过大时可能分两次或者更多次来进行传输。

因为需要标识当前这一条数据的长度,所以大部分的传输数据为:长度+实际信息,例如:8这是一条真的信息

以下是实际传输后,数据包可能存在的形式(A为前面一个数据包,B为后面一个数据包):

1.一个完整的包

2.第一次发了A的一半,第二次发了A的后面一半和B的全部

3.第一次发了A的全部和B的一半,第二次发了B的后面一半

4.AB一起发送过来后面还带着C的一半或者全部

5.xxxxxxxx

解决思路:

接到数据包之后保存到一个缓存变量中,

List<byte[]> buf = new ArrayList<byte[]>();

获取一个数据包首先拿到长度(一般直接拿到数据包前面四个字节并保存到新的字节数组中然后转换成int类型),判断所有数据包长度是否满足获取条件,满足则开始从缓存里面拿一个完整的包否则进行等待,

从缓存里面拿满一个完整的包的过程中记录拿了几个byte数组,最后一个byte数组是否满足, 最后一个长度=当前数据包总长度-前面几个byte长度的和

满足则直接删除,不满足则说明后面有其他数据包的内容,截取出来并保存。


每次获取到一个完整的包都需要把刚才已经拿出来的部分全部删除掉,思路一样。


8.在全屏横屏状态下,不让输入法占满屏幕

 android:imeOptions="flagNoExtractUi"

安卓全屏横屏状态下,editText点击一下之后会默认占满全屏,这个时候如果不希望让输入法占满全屏

在editText的标签里加上这个属性就行了。

9.程序退出后重新进入登录页的时候,重置静态集合

部分手机即使把程序从后台中退出,再次进入程序时,静态的集合例如 list 还是会带有上次程序运行时留下的数据,比如三星。这个时候如果直接在这个集合上进行修改则有很大的概率出现数据错误。

10. 不要把覆盖页 ( 引导页 ) 放在根布局的最后

很多时候程序需要覆盖页进行提示并忽略用户的本次操作。由于需要遮挡其他组件,一般选择把覆盖页以imageView的形式放在根布局的最后,控制visible来显示和隐藏。但这个功能会在部分手机出现莫名异常,比如三星。即使imageView为gone,依然被加载。解决的办法是findview找到根布局,然后动态的添加组件到根布局中,再设置显示隐藏和点击事件。

11. 关于夜神模拟器无法成功连接android studio

打开夜神模拟器和android studio 的情况下,打开cmd,切换到夜神模拟器的安装目录下的bin目录

输入nox_adb.exe connect 127.0.0.1:62001

稍等一下,除去已连接的提示之外,会提示连接成功。用了很长时间了还没碰到其他提示。


猜你喜欢

转载自blog.csdn.net/qq_26559913/article/details/52353359
今日推荐