第一行代码Android学习笔记.docx
- 文档编号:5987927
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:42
- 大小:792.56KB
第一行代码Android学习笔记.docx
《第一行代码Android学习笔记.docx》由会员分享,可在线阅读,更多相关《第一行代码Android学习笔记.docx(42页珍藏版)》请在冰豆网上搜索。
第一行代码Android学习笔记
第一行代码Android学习笔记
感谢《第一行代码》,感谢郭霖博主,拯救我于水火。
之前看视频学习Android,自以为已经小成了。
在网易工作的朋友问了我几个问题,我就懵逼了。
然后,遇到了《第一行代码》,终于把我带进了Android的世界。
好书,真的会醉人啊。
这是学习第二遍时的部分笔记,以备后用。
hujunjob
与北航
2015.04.02
目录
第一章Android系统3
1.1安卓系统架构3
1.2Android项目中的资源3
第二章Activity3
一、创建Activity步骤:
3
二、采用Intent切换activity4
1、显式Intent4
2、隐式Intent4
3、隐式Intent的其他用法5
三、Intent传递数据5
1、向下一个activity传递数据5
2、返回数据给上一个activity6
四、activity的生命周期6
1、活动状态6
2、activity生存期6
3、activity被回收数据保存8
五、activity的启动模式8
六、activity最佳实践8
1、知道当前页面是哪一个activity8
2、随时随地退出程序8
3、给每个activity都添加一个合适的启动方法10
第三章UI10
一、常用控件10
1、TextView10
2、Button10
3、EditText10
4、ImageView11
5、ProgressBar11
6、AlertDialog11
7、ProgressDialog12
二、基本布局12
1、LinearLayout12
2、RelativeLayout12
3、FrameLayout12
4、TableLayout12
5、GridLayout13
三、自定义控件13
1、添加自定义标题布局(无操作的)13
2、创建自定义控件13
四、ListView14
1、最简单的Adapter14
2、定制ListView界面15
3、提升ListView效率16
4、ListView点击事件17
五、单位和尺寸17
六、最佳实践——聊天界面18
第四章Fragment18
第五章BroadCastReceiver18
一、广播机制18
二、接收系统广播18
1、动态注册19
2、静态注册20
3、广播接收器使用注意事项20
三、发送自定义广播20
1、标准广播20
2、有序广播21
四、发送和接收本地广播21
五、强制下线22
注意事项:
22
第6章数据存储23
一、文件存储23
1、存储5部曲:
23
2、读取5部曲:
24
二、SharedPreferences存储25
1、存储4部曲25
2、读取2部曲26
三、SQLite数据库26
1、创建数据库26
2、升级数据库27
3、添加数据28
4、更新数据28
5、删除数据28
6、查询数据28
7、直接使用SQL操作数据库28
四、数据库最佳实践29
1、使用事务29
2、升级数据库最佳写法29
第7章ContentProvider31
一、简介31
二、访问已有的CP31
1、ContentResolver用法31
2、读取系统联系人32
三、创建自己的ContentProvider33
1、创建CP步骤5部曲33
四、跨程序数据共享实践35
附录:
Git使用35
一、创建代码仓库35
二、提交本地代码36
三、忽略文件36
四、查看修改内容37
五、撤销未提交的修改38
六、查看提交记录38
第一章Android系统
1.1安卓系统架构
LinuxKernel:
各种底层驱动
Libraries:
RuntimeLibraries,DalvikVM,各种库支持,数据库,3D绘图,浏览器内核
ApplicationFramework:
API,各种manager
Applications
1.2Android项目中的资源
src:
各种java程序在此,包括主程序
gen:
最重要的是R.java,所有res资源都在这里编号,通过R.xx.xx或@xx查询
res:
各种资源都在这里,包括drawable,layout,values等
另外还有menifest文件,统筹兼顾全局的,Android四大组件都要在此注册。
第二章Activity
Activity是包含用户界面的组件,用于和用户进行交互。
一、创建Activity步骤:
1、首先,创建没有Activity的application,发现src文件夹是空的。
手动创建一个包com.example.demo1activity,在包中添加一个class,MainActivity.java。
要使用activity,extentsActivity。
此时,重写Activity的onCreate()方法。
2、此时,只有activity,用户是不可见的。
因此,需要在上面添加layout和view。
在reslayout中添加一个AndroidXMLfile,可以在该xml文件中创建布局。
添加诸如TextView/Button等常用控件。
3、此时,需要将创建的layout文件加载到activity中,在第一步创建的MainActivity中onCreate()方法中,使用setContentView(R.layout.myactivity)将布局加载进来。
4、所有四大组件的使用,都需要在AndroidManifest.xml文件中注册。
注册方法为:
在
name=".MainActivity"注册。
如果是主activity,即打开application时看到的activity,则需要添加
name="android.intent.action.MAIN"/> name="android.intent.category.LAUNCHER"/> 总体注册代码为: android: name=".MainActivity" android: label="MyApp"> name="android.intent.action.MAIN"/> name="android.intent.category.LAUNCHER"/> 5、销毁activity finish(); 二、采用Intent切换activity 1、显式Intent 首先,按照上面的步骤重新创建一个SecondActivity(记得注册),采用Intent实现跳转 Intentintent=newIntent(MainActivity.this,SecondActivity.class); startActivity(intent); 2、隐式Intent 隐式Intent并不能实现直接跳转,需要指定两个条件(intent-filter): action和category。 如果在intent-filter中指定category为default的category,即android.intent.category.DEFAULT,则只需满足action条件即可。 intent-filter在注册activity时添加,注册方法如下: name=".SecondActivity"> name="com.example.demo1activity.SECOND_START"/> name="android.intent.category.DEFAULT"/> 跳转方法为: Intentintent=newIntent("com.example.demo1activity.SECOND_START"); startActivity(intent); intentfilter中只能有一个action,但可以有多个category,满足其中一个category即可。 3、隐式Intent的其他用法 使用隐式intent,不但可以打开自己编写的activity,还可以打开系统编写的activity,比如浏览器,打电话等。 打开浏览器: Intentintent=newIntent(Intent.ACTION_VIEW); intent.setData(Uri.parse("")); startActivity(intent); 解释: Intent.ACTION_VIEW是系统内置的动作,打开浏览器; setData()将一个Uri对象传入intent,用于指定该intent正在操作的数据,这些数据都是用Uri.parse()将字符串转换为Uri产生的。 在intent-filter中,添加标签,用于精确指定该activity能响应的数据类型,包括 android: scheme用于指定数据的协议部分,比如http。 该方法还可以打电话、显示地理位置等。 三、Intent传递数据 1、向下一个activity传递数据 在头一个activity中,使用putExtra()将数据传入intent 在下一个activity中,使用getIntent()获得传递来的intent,然后使用getStringExtra()获得传递来的数据。 2、返回数据给上一个activity 在上一个activity中,不采用startActivity(),而采用startActivityForResult(intent,1)。 其中,1为requestCode,用于之后判断是不是自己发送出去的intent。 在下一个activity中,建立新的intent,然后将data利用intent.putExtra()放入intent, setResult(RESULT_OK,intent)放置result,其中RESULT_OK为resultcode,用于在上一个activity中分辨是哪一个activity返回的数据。 最后,finish()。 之后,在上一个activity中,重写onActivityResult()方法。 同样的,如果在第二个activity中,是按返回键返回的,可以在第二个activity中,重写onBackPressed()方法返回数据,方法同上。 四、activity的生命周期 1、活动状态 运行状态: 在栈顶时 暂停状态: 不可操作,但可见 停止状态: 完全不可见 销毁状态: 从栈中被移除 2、activity生存期 完整生存期: onCreate()onDestory() 可见生存期: onStart()onStop() 前台生存期: onResume()onPause() 3、activity被回收数据保存 activity中提供了一个onSaveInstanceState()的方法,该方法会携带一个bundle类型参数,bundle可以保存各种信息。 protectedvoidonSaveInstanceState(BundleoutState){ //TODOAuto-generatedmethodstub super.onSaveInstanceState(outState); Stringsavedata="helloyou"; outState.putString("saved",savedata); } 如何恢复数据呢? 在onCreate()方法中,传入的参数为BundlesavedInstanceState,利用这恢复数据。 Stringdata=savedInstanceState.getString(“saved”); 五、activity的启动模式 四种启动模式,可以在 launchMode定义。 standard: 打开activity,就放入栈顶 singleTop: 打开activity,检查栈顶是否已经存在该activity,存在了就不创建。 不存在才创建。 不过,如果该activity不在栈顶,但也存在,则也会重新创建一个。 singleTask: 检查整个返回栈,如果存在某个activity,则不会重新创建。 singleInstance: 创建一个activity,重新在一个新的返回栈(或Task)中创建,该activity与其他activity不在同一个Task中,其他程序也可以调用这个activity的实例。 六、activity最佳实践 1、知道当前页面是哪一个activity 新建一个BaseActivityextentsActivity,其中在onCreate()中打印该activity的信息 Log.i(“BaseActivity”,getClass().getSimpleName());//获得类名 然后,所有activity都extentsBaseActivity即可 2、随时随地退出程序 当打开很多activity之后,退出程序需要一直按Back,很麻烦。 首先,新建一个activity管理类,实现所有的activity的添加、删除和finish()。 publicclassActivityCollector{ publicstaticList publicstaticvoidaddActivity(Activityactivity) { activities.add(activity); } publicstaticvoidremoveActivity(Activityactivity) { activities.remove(activity); } publicstaticvoidfinishAll() { for(Activityactivity: activities) { if(! activity.isFinishing()) { activity.finish(); } } } } 然后,修改BaseActivity,在onCreate()中添加this,onDestory()中移除this protectedvoidonCreate(BundlesavedInstanceState){ //TODOAuto-generatedmethodstub super.onCreate(savedInstanceState); Log.i("BaseActivity",getClass().getSimpleName()); ActivityCollector.addActivity(this); } @Override protectedvoidonDestroy(){ //TODOAuto-generatedmethodstub super.onDestroy(); ActivityCollector.removeActivity(this); } 3、给每个activity都添加一个合适的启动方法 比如我需要启动一个SecondActivity,可是不知道该activity需要哪些参数,怎么办? 在SecondActivity中添加一个启动自己的方法: publicclassSecondActivityextendsActivity { … publicstaticvoidstartActivity(Contextcontex,Stringdata1,Stringdata2) { Intentintent=newIntent(context,SecondActicity.class); intent.putExtra(“param1”,data1); intent.putExtra(“param2”,data2); startActivity(intent); } } 在SecondActivity中添加了startActivity()方法之后,在任意的activity中启动SecondActivity,都可以调用该方法,而且知道需要传入哪些参数。 比如在MainActivity中启动方法为: SecondActivity.startActivity(MainActivity.this,“data1”,“data2”); 第三章UI 一、常用控件 1、TextView 2、Button 3、EditText 密码: android: password=”true” 4、ImageView 5、ProgressBar 设置其进度 progress=bar.getProgress(); progress+=10; bar.setProgress(progress); if(progress==100) { bar.setVisibility(View.GONE); } 6、AlertDialog AlertDialog.Builderdialog=newAlertDialog.Builder(MainActivity.this); dialog.setTitle("确认删除"); dialog.setMessage("你确认删除么? "); dialog.setCancelable(false); dialog.setPositiveButton("确认",newDialogInterface.OnClickListener(){ @Override publicvoidonClick(DialogInterfacedialog,intwhich){ //TODOAuto-generatedmethodstub Toast.makeText(MainActivity.this,"已经删除",Toast.LENGTH_SHORT).show(); } }); dialog.setNegativeButton("取消",newDialogInterface.OnClickListener(){ @Override publicvoidonClick(DialogInterfacedialog,intwhich){ //TODOAuto-generatedmethodstub Toast.makeText(MainActivity.this,"已经取消",Toast.LENGTH_SHORT).show(); } }); dialog.show(); 7、ProgressDialog 和AlertDialog类似,只是内容为一个进度条。 进度加载完成之后,必须使用dismiss()来关闭对话框。 二、基本布局 1、LinearLayout android: gravity指定文字在控件中的对齐方式 android: layout_gravity: 指定控件在布局中的对齐方式 android: layout_weight: 按比例分配控件大小 2、RelativeLayout 3、FrameLayout 4、TableLayout android: layout_span=”2”将两列合并为一列 在TableRow中无法指定控件的宽度,通过android: stretchColumns=”1”,指定将第二列拉伸到最大。 5、GridLayout 三、自定义控件 Android中,控件和布局的继承结构如下图: 1、添加自定义标题布局(无操作的) 自定义一个布局title.xml,然后在mainactivity布局中引入 当然,需要将系统自带标题栏屏蔽 requestWindowFeature(Window.FEATURE_NO_TITLE); 2、创建自定义控件 上面方法自定义的标题栏并不能响应操作,采用自定义控件方法来实现操作。 (1)首先,构建一个title.xml布局文件 (2)然后,构建一个自定义标题控件TitleLayout: 利用LayoutInflater动态加载布局文件title.xml。 publicclassTitleLayoutextendsLinearLayout{ publicTitleLayout(Contextcontext,AttributeSetattrs){ super(context,attrs); LayoutInflater.from(context).inflate(R.layout.title,this); Buttonedit=(Button)findViewById(R.id.title_edit); Buttonback=(Button)findViewById(R.id.title_back); edit.setOnClickListener(newOnClickListener(){ @Override publicvoidonClick(Viewv){ //TODOAuto-generatedmethodstub Toast.makeText(getContext(),"Edit",Toast.LENGTH_SHORT).show(); } }); back.setOnClickListener(newOnClickListener(){ @Override publicvoidonClick(Viewv){ //T
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 一行 代码 Android 学习 笔记