最近的一些基础笔记

来源:互联网 发布:淘客cms系统 编辑:程序博客网 时间:2024/05/16 18:53

很多细节时间久了就忘了

1fragmentManager.popBackStack();最终执行的是FragmentTranaction.commit();如果执行时应用在后台,触发了onSaveInstanceState(),然后触发popBackStack(),则闪退。

 因为不是commitIgnoreState...

2使用sp作为字体大小单位,会随着系统的字体大小改变dp作为单位则不会.

 

3android.os.BadParcelableException: ClassNotFoundException when unmarshalling:

putExtra时存入了null导致的。

Android有两种不同的classloadersframework classloaderapk classloader,其中framework classloader知道怎么加载android classesapk classloader知道怎么加载你的代码,即可以知道你自定义的类,apk classloader继承自framework classloader,所以也知道怎么加载android classes。在应用刚启动时,默认class loaderapk classloader,但在系统内存不足应用被系统回收会再次启动,这个默认class loader会变为framework classloader了,所以对于自己的类会报ClassNotFoundException

如果是在要传递的JavaBean中有其中一个Field继承自Parcelable,那么有很简单的处理方法,只要把类似rect = in.readParcelable(null);改为config = in.readParcelable(Rect.class.getClassLoader());

但是我们这里是直接传递一个List,那要怎么办呢?

其实很简单,只需要在Client端读取Bundle中的数据之前加上如下一行代码:

bundle.setClassLoader(getClass().getClassLoader());这样就会使用apk classloader加载。

 

4Context有个createPackageContext方法,可以创建另外一个包的上下文,这个实例不同于它本身的Context实例,但是功能是一样的。

这个方法有两个参数:
1)packageName  包名,要得到Context的包名
2)flags  标志位,有CONTEXT_INCLUDE_CODECONTEXT_IGNORE_SECURITY两个选项。CONTEXT_INCLUDE_CODE的意思是包括代码,也就是说可以执行这个包里面的代码。CONTEXT_IGNORE_SECURITY的意思是忽略安全警告,如果不加这个标志的话,有些功能是用不了的,会出现安全警告。

限制:1)共享应用之间都需要配置相同的android:sharedUserId

<manifestandroid:sharedUserId="io.silvrr.installment"...

2)两个应用要有相同的签名

5merge、和rebase的区别 

  merge是用来合并2个不同分支的,合并后会生成一个新的commit

  Rebase是把当前修改内容复制一份到另一分支上,使两个分支一致,不会生成新的commit

6、关于onActivityResultonResume调用顺序问题

  系统会先调用onActivityResult再调用onResume,具体调用代码可以看ActivityThread4096

deliverResults(r, res.results);
if (resumed) {
    r.activity.performResume();
    r.activity.mTemporaryPause =false;
}

7、Activity OnCreate中 EventBus#register(Object)报错java.lang.NoClassDefFoundError: android/os/PersistableBundle

 //Starting with EventBus 2.2 we enforced methods to be public (might change with annotations again)

Method[] methods = clazz.getDeclaredMethods();

Method[] methods = clazz.getMethods();

bug修复方式,onCreate重写

protected voidonCreate(Bundle savedInstanceState) {}

不要重写

public voidonCreate(Bundle savedInstanceState, PersistableBundle persistentState) {}

原因:onCreate中EventBus注册时,会用反射去读取一些方法,但是PersistableBundleAPI21才提供的,在低于4.4的系统找不到这个类,导致闪退

8、假设Handler绑定子线程,只有在sendMessage之后,handleMessage里才是在该handler绑定线程

9startActivityForResult启动singleTask模式的activity,无回调的问题。

<p>Note that this method should only be used with Intent protocols
* that are defined to return a result.  In other protocols (such as
* {
@linkIntent#ACTION_MAIN} or {@linkIntent#ACTION_VIEW}), you may
* not get the result when you expect.  For example, if the activity you
* are launching uses the singleTask launch mode,it will not run in your
* task and thus you will immediately receive a cancel result.

根据这一段源码的注释,可以知道启动的singleTask模式的Activity与其他模式activity运行不在一个task中,数据不交互,所以启动时会直接触发RESULT_CANCEL

从柯元旦的《Android 内核剖析》的第十章“Ams内部原理“10.1.3中有这样的一段话:请注意:SINGLE_TASK标识以及SINGLE_INSTANCE两个标识必须在r.result==0的条件中,即这两个标识只能用在startActivity()的方法中,而不能使用在startActivityForResult方法中。因为从Task的角度看,Android认为不同Task之间的Activity是不能传递数据的,所以不能使用NEW_TASK标识,但还是要调用forResult方法。

官方文档:singleInstancesingleTask"”相同,只是系统不会将任何其他 Activity 启动到包含实例的任务中。 该 Activity 始终是其任务唯一仅有的成员。

10、@JavascriptInterface 4.4以下版本,这种h5与原生交互存在bug4.4以上通过注解获取方法,h5只能拿到带有注解的方法进行操作。而4.4以下,是通过方法名获取,h5能拿到该类中所有方法,不够安全。

11、android studio中导入svg矢量图插件   http://www.cnblogs.com/tokyow/p/6293743.html

12、关于ScrollView嵌套RecyclerView,item不显示的问题:ScrollView中加上 android:fillViewport="true" 属性。

13、向现有项目中添加C/C++代码:https://developer.android.google.cn/studio/projects/add-native-code.html?hl=zh-cn#link-gradle

14、关于Parcelable,实现parcelable的对象,取出的值会存在部分字段数据丢失的问题,原因是write、read字段的顺序要一致。

15、关于序列化

16、关于多进程读写同一个文件的问题,同时读没问题,同时写入一个文件可能会死锁
原创粉丝点击