安卓现实开发中遇到的问题及如何解决的

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wdx_1136346879/article/details/86656919

1,为什么要用Fragment.setArguments(Bundle bundle)来传递参数

	Fragment在Android3.0开始提供,并且在兼容包中也提供了Fragment特性的支持。Fragment的推出让我们编写和管理用户界面更快捷更方便了。(视为平板专门提供的)

	而不推荐通过构造方法直接来传递参数呢?为了弄清这个问题,我们可以做一个测试,分别测试下这两种方式的不同

	首先,我们来测试下通过构造方法传递参数的情况  传一个String1  在给一个默认的String2
	当竖屏的时候通过构造参数传过来的参数正常显示String,
	而 切换的横屏时,现实的是默认的String2


	通过Fragment.setArguments(Bundle bundle)来传递参数  横竖屏切换时数据不会变化,只会显示传过来的参数String1

	设备横竖屏切换的话,当前展示给用户的Activity默认情况下会重新创建并展现给用户,那依附于Activity的Fragment会进行如何处理呢,我们可以通过源码来查看
	先来看看Activity的onCreate(Bundle saveInstance)方法由于我们的Fragment是由FragmentManager来管理,所以可以跟进FragmentManager.restoreAllState()方法,
	通过对当前活动的Fragmnet找到下面的代码块  接下来我们可以看看FragmentState.instantitate()方法的实现

	通过此方法可以看到,最终会通过反射无参构造实例化一个新的Fragment,并且给mArgments初始化为原先的值,而原来的Fragment实例的数据都丢失了,并重新进行了初始化

	通过上面的分析,我们可以知道Activity重新创建时,会重新构建它所管理的Fragment,原先的Fragment的字段值将会全部丢失,但是通过Fragment.setArguments(Bundle bundle)方法设置的bundle会保留下来。
	所以尽量使用Fragment.setArguments(Bundle bundle)方式来传递参数
	(项目中也深刻体验出来,横屏时有些数据显示不出来,当时研究了很久才明白其中的道理)

,2,静默下载apk(有助于用户升级新版本,省流量,为用户着想)

,3,(社交软件的APP)登陆的逻辑设计(有助于吸附用户,有些用户很讨厌上来就注册登陆而不知到app里面到底什么内容)

,4,button设置背景图片变形,在Drawable下设置一个将你的background以XML Bitmap的形式定义

	<?xml version="1.0" encoding="utf-8"?>  



,5,
Android5.0 以及以上的系统 设置当一个安全站点企图加载来自一个不安全站点资源时 当WebView加载的链接为Https开头,
但是链接里面的内容,比如图片为Http链接,这时候,图片就会加载不出来,

原因:
从Android5.0开始,WebView默认不支持同时加载Https和Http混合模式。
WebView Http换成Https 图片加载出现问题 有些加载不出来,有些可以 if (Build.VERSION.SDK_INT >= 21) {
h5.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW );
}

6,isAdd() 关于Fragment的
7,BUG问题 主要就是NUllPointException,OOM,IndexOutofBoundsException,引起的崩溃,这三个是占90%以上的’其他的就是app
自己的如 数据库,等

8,activity写死竖屏,每个都要在清单文件里配置好烦,统一写theme又无效,哪位大神知道怎么解决.
答案:::不是有基类么,里面写死就可以,然后代码覆盖xml
9,onSaveInstanceState使用详解-之解决问题:android程序崩溃后,app异常
1,问题
1)问题一:按home键后,app后台运行,若内存紧张时,再次进入app会出现异常。
2)改变手机设置中字体大小,app再次进入出现异常。
手机切换字体后,app异常崩溃。configChanges详解
2,解决方案
1)写一个继承Activity的BaseActivity,重写onSaveInstanceState方法,用于app异常退出时保存临时数据。并在oncreate方法中读取Bundle参数,获取异常退出时保存的数据用于保存Activity的状态信息(UI控件的状态信息)和用户保存的信息。。
2)所有activity都继承BaseActivity,并在onCreate中读取Bundle,用于获取异常退出时保存的数据。
3)Demo
3,原因
1)过程
出现1中的两个问题,甚至类似问题,如横竖屏切换出现异常,主要原因是系统重新刷新了界面,调用了activity的onDestroy(),onCreate(),onResume()方法。但上次activity的信息为保存,以至于重新刷新界面时出现数据丢失(如用户登录信息、视频进度、上个activity切换到当前activity传递的数据),继而出现异常。
2)onSaveInstanceState()
i>场景
通常onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存。
在activity被杀掉之前调用保存每个实例的状态,以保证该状态可以在onCreate(Bundle)或者onRestoreInstanceState(Bundle) (传入的Bundle参数是由onSaveInstanceState封装好的)中恢复。这个方法在一个activity被杀死前调用,当该activity在将来某个时刻回来时可以恢复其先前状态。
ii>触发
系统即将要自动清理销毁Activity或Fragment前才会调用。
①系统内存不足,销毁activity。
②用户按下HOME键或长按HOME键,选择运行其他的程序时。
③按下电源按键(关闭屏幕显示或锁屏)时。
④从activity A中启动一个新的activity时。
当我们在activity A时,此时通知栏有其他的通知,我们点击通知启动activity B,此时我们进入别的应用。
⑤屏幕方向切换时,例如从竖屏切换到横屏时。
iii>不触发
例如在应用中按返回键,onSaveInstanceState()就不会被调用。
因为在这种情况下,用户的行为决定了不需要保存Activity的状态。
4)onRestoreInstanceState()
这个方法在一个activity被杀死后,当该activity在将来某个时刻回来时调用。
根据测试,发现onRestoreInstanceState调用的时间不定,可能在activity的oncreat方法里很多代码都执行完了才调用,依然会造成数据丢失。所以根据实际情况,
可能oncreat中读取传入的Bundle参数更好一点。

10,右滑退出页面,一个小小的动作,对用户都影响很大,

展开阅读全文