第一章
不同于eclipse,AS的方便的地方就是谷歌已经将东西都集成好了,例如JDK和安卓的SDK,之前看过一会第一版用eclipse的时候就踩了挺多的坑,于是果断转向第二版。接下来是我在看第一章的时候遇到的坑已经一些感想和笔记。
下载的话,途径很多,可以官网,不过需要翻墙。需要科学上网。不想去官网的话,不妨下我云盘里面的
链接:https://pan.baidu.com/s/1HInD24u62j0GNUG2TIGwUw 密码:c3wh
下载后安装的一些细节我就不赘述了。按照作者的步骤,读到这里应该是不会报错的。但我在这里遇到了一个问题,我发现
@override
这一行下面会有红线,显示有错误,下面还有相关信息
Failed to resolve:com.android.support:appcompat-v7.....
我刚开始以为是我环境没装好,或者是SDK版本还没有下完全,于是重新安装AS,还是没能解决,最后在某个大神的博客中找到了答案
https://blog.csdn.net/mhl18820672087/article/details/78385361
2,@override,这个代表重写,作用如下
1,当注释用,方便阅读
2,编译器会检测你下面的代码,如果不是父类中的方法会报错
3,创建虚拟机时,显示VT-X is disabled in BIOS
Windows默认的时不支持处理器虚拟化的,所以你需要进入BIOS将CPU虚拟化打开,进BIOS,这个不同的电脑进入方法不同,我的惠普时开机点几下F10,具体的百度吧。之后,在把
这个选项下下来就ok了,就可以创建虚拟机了
4,学会用log打印日志信息,不是用System.ou.printn("******");
因为Java的缘故,我之前认为的输出也这么简单,然而看了大神的书,才知道这个除了方便什么其他好处,因为使用System.out.println();不能使用过滤器,日志没有级别之分等等,总之,用log就对了。。。
第二章
生命周期:
防止数据得不到保存:
利用onSaveInstanceState(),他可以保证活动在回收前一定会被调用,然后,通过onCreate方法中的Buntle类型的参数来取出数据
利用toast可以向用户提示一下信息,常见格式为Toast.makeText(testActivity.this,"You clicked it",Toast.LENGTH_LONG).show();
第一个参数是Toast要求的上下文(我还不是很懂),第二个参数是提示的信息内容,第三个是显示这个提醒的时间长短(取值可以为LENGTH_LONG或者LENGTH_SHORT)
启动模式:分为standard,singleTop,singleTask,singleInstance
默认的模式为standard,安卓是使用栈来管理活动的。
standard:默认情况下,每启动一个活动,就会新建一个实例,入栈,并且处于栈顶的位置,系统不在乎这个活动在栈中是否存在。
singleTop:启动同一个活动并且活动在栈顶的时候都会直接使用栈顶的活动,而不是新建一个实例
singleTask:每次启动时系统会先检查栈中是否存在该活动的一个实例,如存在,则将火种之上是所有活动统统出栈(销毁),没有则创建一个新的活动
singleInstance: 是创建一个新的栈来管理这个活动
第三章:
这本书里讲到的界面设计都是用最基本的方式实现的,即编写xml文件
所有的控件都具有宽度和高度属性,即android:layout_width和android:layout_height,这两个属性对应的值有三个,分别为wrap_content和match_parent和fill_parent,后两个的意义相同,都表示和父类控件的属性相同,前面那个则表示控件刚好包好里面的内容,即内容决定控件大小.
TextView,是最简单的一种控件,用于界面上显示一些信息Button,顾名思义,表示按钮,属性与TextView基本相同,可以利用textAllCaps来对按钮上的字的字母大小写进行设置EditText,用于输入和编辑内容,比如QQ发信息,是用户交互中一个很重要的控件,重要属性:maxlines,通过他来限制输入的最大行数,防止不断被拉长ImageView,展示图片的控件,图片通常放在drawable目录当中,属性跟前面大致相同ProgressBar,在界面上展示一个进度条,用来表示程序加载进度,可以通过android:visibility来控制其可见性,有visible,invisible,gone三个值AlertDialog,用于弹出对话框,并且这个框可以屏蔽屏幕上各个控件的交互能力,一般用于提示警告信息ProcessDialog,跟上面AlertDialog类似,都是弹出对话框并屏蔽其他控件,不同的是它显示的是进度条
自定义控件其实也就是重写一个类,继承已有的类,然后再继续编写,这样就能减少重复的代码,这里着重要说的应该是适配器的使用,这里是镶嵌在ListView里面讲的,为什么讲ListView要说适配器.ListView是用来展示大量数据的,但是例如一个数组,里面的数据是不能直接传递给ListView我们需要借助适配器来完成,我简单理解为一个盒子,这样我们就可以将东西装在盒子里面然后装上货车,而不是把东西直接放上货车
ListView性能优化,ListView很难用的原因之一就是它有很多地方可以优化,就例如在这个方法中
这里每次调用这个函数的时候,不管他里面有没有元素,都会讲布局重新加载一遍,这样,当布局的数量逐渐多起来并且快速滑动的时候,时间复杂度也会跟着上来,所以这里还有优化的空间,而切入点就从加载布局这里下手,我们设置一个判断条件,如果调用这个函数的时候,convertView这个外部变量里面没有元素,则加载布局,否则不加载,这样就在一定程度上提高了性能
书中还讲到的一个优化的地方便是建一个缓存了,用来存放加载完成的控件的实例,放在我们自己定义的ViewHolder类里面,这样在convertView不为空的时候,通过getTag取出,避免每次都用findViewById()来找布局了
最后说一说
不详细讲用法什么的了,讲一讲需要注意的地方,之前做那个聊天界面的时候,我的程序程序总是只能显示输入框,然而却没
没有出来信息,我找遍了整个程序,好吧再强的大脑也不能媲美编译器,最后缴械投降,我再自定义布局的函数里都加了一句Log.d("#####","####"),来看着部分代码有没有执行,类似这样
点一下按钮就看一下日志,最后发现是onCreateVieHolder那个函数压根没有调用,最后各种找教程我找到了几个原因,这里也体现了log的作用了
onCreateViewHolder没有加载有以下四种可能
1,没有用layoutManager
2,没有用scrollView嵌套RecyclerView,这个其实问题不大,但听网上大牛说在某些版本里面不嵌套不行
3,getItemCount这个函数返回非正数,返回负数和0是不能显示出的
4,最外层的LinearLayout的属性里没有设置orientation,并且要定为"vertical",这样才能加载出来
第五章
参考博客:https://blog.csdn.net/chuyouyinghe/article/details/79424373
照着书上的源码将程序原封不动敲了一遍,但发现这特么怎么也收不到发出的广播
<receiver android:name=".MyBroadCastReceiver"
android:permission="com.example.Broadcasttest.MY_BROADCAST">
<intent-filter>
<action android:name="com.example.Broadcasttest.MY_BROADCAST"/>
</intent-filter>
</receiver>
</application>
如上代码,我在manifest中也注册了
再看这里
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
Intent intent =new Intent();
intent.setAction("com.example.Broadcasttest.MY_BROADCAST");
sendBroadcast(intent);
}
});
心里当时一万个草泥马路过,我在自定义的广播接收类里面的onReceive里面用Log打印了信息,发现这个函数压根就没有运行,于是我上网百度了一波.不得不说这个地方还是相当的坑的
因为,我用的虚拟机的安卓版本是8.0,但是,8.0,取消了大部分静态注册!!!
一般来说,出现自定义的广播接收器接收不到信息的原因,有如下几个
1,Manifest里面没有注册
2,注册了但是Action里面那个android:name与Intent.setAction()的参数不匹配
3,就是系统的原因了,前两个一般设置代码跟踪可以找得出,但第三个一般不容易,只能上网查一查了
所以这里这个问题的解决办法就只能是将虚拟机的安卓版本调低一点.好像是7.0以下都能