第一行代码Android学习笔记完全版_第1页
第一行代码Android学习笔记完全版_第2页
第一行代码Android学习笔记完全版_第3页
第一行代码Android学习笔记完全版_第4页
第一行代码Android学习笔记完全版_第5页
已阅读5页,还剩76页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第一行代码 Android学习笔记感谢第一行代码,感谢郭霖博主,拯救我于水火。之前看视频学习Android,自以为已经小成了。在网易工作的朋友问了我几个问题,我就懵逼了。然后,遇到了第一行代码,终于把我带进了Android的世界。好书,真的会醉人啊。这是学习第二遍时的部分笔记,以备后用。 这是第二版,比第一版增加了一些常用的方法。 hujunjob于北航 2015.04.02 目录第一章 Android系统61.1 安卓系统架构61.2 Android 项目中的资源6第二章 Activity6一、创建Activity步骤:6二、采用Intent切换activity71、显式Intent72、隐

2、式Intent73、隐式Intent的其他用法8三、Intent传递数据81、向下一个activity传递数据82、返回数据给上一个activity8四、activity的生命周期91、活动状态92、activity生存期93、activity被回收数据保存11五、activity的启动模式11六、activity最佳实践111、知道当前页面是哪一个activity112、随时随地退出程序113、给每个activity都添加一个合适的启动方法13第三章 UI13一、常用控件131、TextView132、Button133、EditText134、ImageView145、ProgressBa

3、r146、AlertDialog147、ProgressDialog15二、基本布局151、LinearLayout152、RelativeLayout153、FrameLayout154、TableLayout155、GridLayout16三、自定义控件161、添加自定义标题布局(无操作的)162、创建自定义控件16四、ListView171、最简单的Adapter172、定制ListView界面183、提升ListView效率194、ListView点击事件20五、单位和尺寸20六、最佳实践聊天界面21第四章 Fragment21第五章 BroadCast Receiver24一、广播机

4、制24二、接收系统广播241、动态注册242、静态注册253、广播接收器使用注意事项26三、发送自定义广播261、标准广播262、有序广播27四、发送和接收本地广播27五、强制下线27注意事项:27第六章 数据存储28一、文件存储281、存储5部曲:292、读取5部曲:29二、SharedPreferences存储311、存储4部曲312、读取2部曲31三、SQLite数据库311、创建数据库312、升级数据库323、添加数据334、更新数据335、删除数据336、查询数据337、直接使用SQL操作数据库33四、数据库最佳实践341、使用事务342、升级数据库最佳写法35第七章 Content

5、 Provider36一、简介36二、访问已有的CP361、ContentResolver用法362、读取系统联系人37三、创建自己的ContentProvider381、创建CP步骤5部曲38四、跨程序数据共享实践40附录:Git使用41一、创建代码仓库41二、提交本地代码42三、忽略文件42四、查看修改内容42五、撤销未提交的修改43六、查看提交记录44第八章 多媒体44一、通知441、通知创建442、通知点击事件453、通知的其他属性45二、短信461、接收短信462、拦截短信463、发送短信46三、调用摄像头和相册46四、播放多媒体46第九章 Service46一、Service介绍4

6、6二、多线程471、线程基本用法472、在子线程中更新UI473、异步消息处理机制484、AsyncTask49三、Service501、定义Service502、启动和停止Service513、Activity与Service通信51四、Service的生命周期53五、Service更多技巧531、前台Service532、傻瓜方式使用ServiceIntentService54六、后台执行的定时任务54第十章 网络技术56一、WebView56二、使用HTTP协议访问网络561、使用HttpURLConnection562、使用HttpClient59三、解析XML格式数据611、Pull

7、解析方式612、SAX解析方式63四、解析JSON格式数据641、JSONObject642、GSON65五、网络编程最佳实践java的回调机制66第十一章 LBS68附录:Git的高级用法69一、分支用法69二、与远程版本库协作70第十二章 传感器71第十三章 Android高级技巧71一、全局获取Context的技巧71二、使用Intent传递对象721、Serializable方式722、Parcelable方法72三、定值自己的日志工具73四、调试Android程序74五、编写测试用例741、创建测试工程742、进行单元测试75第十四章 实战75第一章 Android系统1.1 安卓系

8、统架构Linux Kernel: 各种底层驱动Libraries : Runtime Libraries, Dalvik VM, 各种库支持,数据库,3D绘图,浏览器内核Application Framework: API,各种managerApplications1.2 Android 项目中的资源src: 各种java程序在此,包括主程序gen: 最重要的是R.java,所有res资源都在这里编号,通过R.xx.xx或xx查询res: 各种资源都在这里,包括drawable, layout, values等另外还有menifest文件,统筹兼顾全局的,Android四大组件都要在此注册。第

9、二章 ActivityActivity是包含用户界面的组件,用于和用户进行交互。一、创建Activity步骤:1、首先,创建没有Activity的application,发现src文件夹是空的。手动创建一个包com.example.demo1activity,在包中添加一个class,MainActivity.java。要使用activity,extents Activity。此时,重写Activity的onCreate()方法。2、此时,只有activity,用户是不可见的。因此,需要在上面添加layout和view。在reslayout中添加一个Android XML file,可以在该x

10、ml文件中创建布局。添加诸如TextView/Button等常用控件。3、此时,需要将创建的layout文件加载到activity中,在第一步创建的MainActivity中onCreate()方法中,使用setContentView(R.layout.myactivity)将布局加载进来。4、所有四大组件的使用,都需要在AndroidManifest.xml文件中注册。注册方法为:在中添加标签,将需要注册的activity使用android:name=.MainActivity注册。如果是主activity,即打开application时看到的activity,则需要添加总体注册代码为: 5

11、、销毁activityfinish();二、采用Intent切换activity1、显式Intent首先,按照上面的步骤重新创建一个SecondActivity(记得注册),采用Intent实现跳转Intent intent = new Intent(MainActivity.this, SecondActivity.class);startActivity(intent);2、隐式Intent隐式Intent并不能实现直接跳转,需要指定两个条件(intent-filter):action和category。如果在intent-filter中指定category为default的categor

12、y,即ent.category.DEFAULT,则只需满足action条件即可。intent-filter在注册activity时添加,注册方法如下: 跳转方法为:Intent intent=new Intent(com.example.demo1activity.SECOND_START);startActivity(intent);intentfilter中只能有一个action,但可以有多个category,满足其中一个category即可。3、隐式Intent的其他用法使用隐式intent,不但可以打开自己编写的activity,还可以打开系统编写的activit

13、y,比如浏览器,打电话等。打开浏览器:Intent intent=new Intent(Intent.ACTION_VIEW);intent.setData(Uri.parse();startActivity(intent);解释:Intent.ACTION_VIEW是系统内置的动作,打开浏览器;setData()将一个Uri对象传入intent,用于指定该intent正在操作的数据,这些数据都是用Uri.parse()将字符串转换为Uri产生的。在intent-filter中,添加标签,用于精确指定该activity能响应的数据类型,包括android:

14、scheme用于指定数据的协议部分,比如http。该方法还可以打电话、显示地理位置等。三、Intent传递数据1、向下一个activity传递数据在头一个activity中,使用putExtra()将数据传入intent在下一个activity中,使用getIntent()获得传递来的intent,然后使用getStringExtra()获得传递来的数据。2、返回数据给上一个activity在上一个activity中,不采用startActivity(),而采用startActivityForResult(intent, 1)。其中,1为requestCode,用于之后判断是不是自己发送出去的

15、intent。在下一个activity中,建立新的intent,然后将data利用intent.putExtra()放入intent,setResult(RESULT_OK, intent)放置result,其中RESULT_OK为resultcode,用于在上一个activity中分辨是哪一个activity返回的数据。最后,finish()。之后,在上一个activity中,重写onActivityResult()方法。同样的,如果在第二个activity中,是按返回键返回的,可以在第二个activity中,重写onBackPressed()方法返回数据,方法同上。四、activity的生

16、命周期1、活动状态运行状态:在栈顶时暂停状态:不可操作,但可见停止状态:完全不可见销毁状态:从栈中被移除2、activity生存期完整生存期:onCreate()onDestory()可见生存期:onStart()onStop()前台生存期:onResume()onPause()3、activity被回收数据保存activity中提供了一个onSaveInstanceState()的方法,该方法会携带一个bundle类型参数,bundle可以保存各种信息。protected void onSaveInstanceState(Bundle outState) / TODO Auto-genera

17、ted method stubsuper.onSaveInstanceState(outState);String savedata=hello you;outState.putString(saved, savedata);如何恢复数据呢?在onCreate()方法中,传入的参数为Bundle savedInstanceState,利用这恢复数据。String data=savedInstanceState.getString(“saved”);五、activity的启动模式四种启动模式,可以在标签中android:launchMode定义。standard:打开activity,就放入栈顶

18、singleTop:打开activity,检查栈顶是否已经存在该activity,存在了就不创建。不存在才创建。不过,如果该activity不在栈顶,但也存在,则也会重新创建一个。singleTask:检查整个返回栈,如果存在某个activity,则不会重新创建。singleInstance:创建一个activity,重新在一个新的返回栈(或Task)中创建,该activity与其他activity不在同一个Task中,其他程序也可以调用这个activity的实例。六、activity最佳实践1、知道当前页面是哪一个activity新建一个BaseActivity extents Activi

19、ty,其中在onCreate()中打印该activity的信息Log.i(“BaseActivity”,getClass().getSimpleName(); /获得类名然后,所有activity都extents BaseActivity即可2、随时随地退出程序当打开很多activity之后,退出程序需要一直按Back,很麻烦。首先,新建一个activity管理类,实现所有的activity的添加、删除和finish()。public class ActivityCollector public static List activities=new ArrayList();public sta

20、tic void addActivity(Activity activity)activities.add(activity);public static void removeActivity(Activity activity)activities.remove(activity);public static void finishAll()for(Activity activity:activities)if(!activity.isFinishing()activity.finish();然后,修改BaseActivity,在onCreate()中添加this,onDestory()中

21、移除thisprotected void onCreate(Bundle savedInstanceState) / TODO Auto-generated method stubsuper.onCreate(savedInstanceState);Log.i(BaseActivity, getClass().getSimpleName();ActivityCollector.addActivity(this);Overrideprotected void onDestroy() / TODO Auto-generated method stubsuper.onDestroy();Activi

22、tyCollector.removeActivity(this);3、给每个activity都添加一个合适的启动方法比如我需要启动一个SecondActivity,可是不知道该activity需要哪些参数,怎么办?在SecondActivity中添加一个启动自己的方法:public class SecondActivity extends Activitypublic static void startActivity(Context contex, String data1, String data2)Intent intent = new Intent(context, SecondAct

23、icity.class);intent.putExtra(“param1”, data1);intent.putExtra(“param2”, data2);startActivity(intent);在SecondActivity中添加了startActivity()方法之后,在任意的activity中启动SecondActivity,都可以调用该方法,而且知道需要传入哪些参数。比如在MainActivity中启动方法为:SecondActivity.startActivity(MainActivity.this, “data1”, “data2”);第三章 UI一、常用控件1、TextVi

24、ew2、Button3、EditText密码:android:password=”true”4、ImageView5、ProgressBar设置其进度 progress=bar.getProgress();progress+=10;bar.setProgress(progress);if(progress=100)bar.setVisibility(View.GONE);6、AlertDialogAlertDialog.Builder dialog=new AlertDialog.Builder(MainActivity.this);dialog.setTitle(确认删除);dialog.s

25、etMessage(你确认删除么?);dialog.setCancelable(false);dialog.setPositiveButton(确认, new DialogInterface.OnClickListener() Overridepublic void onClick(DialogInterface dialog, int which) / TODO Auto-generated method stubToast.makeText(MainActivity.this, 已经删除, Toast.LENGTH_SHORT).show(););dialog.setNegativeBut

26、ton(取消, new DialogInterface.OnClickListener() Overridepublic void onClick(DialogInterface dialog, int which) / TODO Auto-generated method stubToast.makeText(MainActivity.this, 已经取消, Toast.LENGTH_SHORT).show(););dialog.show();7、ProgressDialog和AlertDialog类似,只是内容为一个进度条。进度加载完成之后,必须使用dismiss()来关闭对话框。二、基本

27、布局1、LinearLayoutandroid:gravity 指定文字在控件中的对齐方式android:layout_gravity: 指定控件在布局中的对齐方式android:layout_weight: 按比例分配控件大小2、RelativeLayout3、FrameLayout4、TableLayoutandroid:layout_span=”2” 将两列合并为一列在TableRow中无法指定控件的宽度,通过android:stretchColumns=”1”,指定将第二列拉伸到最大。5、GridLayout三、自定义控件Android中,控件和布局的继承结构如下图:1、添加自定义标题

28、布局(无操作的)自定义一个布局title.xml,然后在mainactivity布局中引入当然,需要将系统自带标题栏屏蔽requestWindowFeature(Window.FEATURE_NO_TITLE);2、创建自定义控件上面方法自定义的标题栏并不能响应操作,采用自定义控件方法来实现操作。(1)首先,构建一个title.xml布局文件(2)然后,构建一个自定义标题控件TitleLayout:利用LayoutInflater动态加载布局文件title.xml。public class TitleLayout extends LinearLayoutpublic TitleLayout(

29、Context context, AttributeSet attrs) super(context, attrs);LayoutInflater.from(context).inflate(R.layout.title, this);Button edit=(Button) findViewById(R.id.title_edit);Button back=(Button) findViewById(R.id.title_back);edit.setOnClickListener(new OnClickListener() Overridepublic void onClick(View v

30、) / TODO Auto-generated method stubToast.makeText(getContext(), Edit, Toast.LENGTH_SHORT).show(););back.setOnClickListener(new OnClickListener() Overridepublic void onClick(View v) / TODO Auto-generated method stubToast.makeText(getContext(), Back, Toast.LENGTH_SHORT).show(););(3)如同加入其它的控件一样,将该自定义的控

31、件添加到mainactivity.xml文件中 四、ListView1、最简单的Adapter要将数据放置在ListView中,都需要一个adapter转换。一个最简单的adapter,就是把一个字符串数组放置在ListView中。ArrayAdapter接收3个参数:context,ListView单个子项布局id和数据。 listView=(ListView) findViewById(R.id.listView1); ArrayAdapter adapter=new ArrayAdapter(MainActivity.this, android.R.layout.simple_list_

32、item_1, data); listView.setAdapter(adapter);2、定制ListView界面只显示文字很单调,需要显示图片等,则需要构建自定义的布局。(1)数据:Fruit类首先准备需要适配的数据,数据包括文字、图片id,定义一个Fruit类存放这些数据。(2)子项布局:fruit_layout.xml之后,需要自定义ListView中单个子项的布局。本例中就是一个图片加上一个文字。(3)自定义适配器:FruitAdapter.java该适配器中,最重要的是getView()方法。该方法在每个子项滚动到屏幕内时被调用。position是该子项的位置,利用getItem(

33、position)可以获得当前的Fruit实例fruit;然后,利用LayoutInflater可以加载布局为fruit_layout的布局view;该布局view即为步骤(2)中自定义的布局,通过view.findViewById()可以获得ImageView和TextView。最后,将fruit中的imageId和name传入ImageView和TextView。public class FruitAdapter extends ArrayAdapterprivate int resourceId;public FruitAdapter(Context context, int resou

34、rce, List objects) super(context, resource, objects);resourceId=resource;public View getView(int position, View convertView, ViewGroup parent) Fruit fruit=getItem(position);View view=LayoutInflater.from(getContext().inflate(R.layout.fruit_layout, null);TextView fruit_name=(TextView) view.findViewByI

35、d(R.id.fruit_name);ImageView fruit_image=(ImageView) view.findViewById(R.id.fruit_image);fruit_image.setImageResource(fruit.getImageId();fruit_name.setText(fruit.getName();return view;(4)使用List fruits=new ArrayList();FruitAdapter adapter=new FruitAdapter(MainActivity.this, R.layout.fruit_layout, fru

36、its);在fruits中添加数据。3、提升ListView效率getView()每次都将布局重新加载一遍,效率很低。处理方法为:(1)convertViewconvertView将之前加载好的布局进行缓存,以便之后重用。则可以不必每次都使用LayoutInflater重新加载布局,而直接加载缓存的布局。if(convertView=null) view=LayoutInflater.from(getContext().inflate(R.layout.fruit_layout, null);else view=convertView;(2)ViewHolder每次都使用findViewByI

37、d获取控件,效率低下。使用convertView将之前已经find的view也一起缓存。View有setTag()和getTag()方法,分别进行数据写入和读取。采用自定义的ViewHolder类,将多个参数一起管理,比如TextView/ImageView等。public class FruitAdapter extends ArrayAdapter public FruitAdapter(Context context, int resource, List objects) super(context, resource, objects);resourceId = resource;p

38、rivate int resourceId;public View getView(int position, View convertView, ViewGroup parent) Fruit fruit = getItem(position);View view;ViewHolder viewHolder;if (convertView = null) viewHolder = new ViewHolder(); /一定要记住实例化对象啊view = LayoutInflater.from(getContext().inflate(R.layout.fruit_layout, null);

39、viewHolder.fruit_image = (ImageView) view.findViewById(R.id.fruit_image);viewHolder.fruit_name=(TextView) view.findViewById(R.id.fruit_name);view.setTag(viewHolder); else view = convertView;viewHolder = (ViewHolder) view.getTag();viewHolder.fruit_image.setImageResource(fruit.getImageId();viewHolder.

40、fruit_name.setText(fruit.getName();return view;class ViewHolder ImageView fruit_image;TextView fruit_name;4、ListView点击事件注册setOnItemClickListener()事件: listView.setOnItemClickListener(new OnItemClickListener() public void onItemClick(AdapterView parent, View view,int position, long id) Fruit fruit=fru

41、its.get(position);Toast.makeText(MainActivity.this, fruit.getName(), Toast.LENGTH_SHORT).show(););五、单位和尺寸px: 像素pt:磅数,1pt=1/72inchdp:密度无关像素密度dpi:屏幕每inch包含的像素数。获取当前屏幕密度值:float xdpi=getResources().getDisplayMetrics().xdpi;float ydpi=getResources().getDisplayMetrics().ydpi;sp:可伸缩像素。规定,在160dpi屏幕上,1dp=1px

42、;在320dpi屏幕上,1dp=2px.六、最佳实践聊天界面APP: ChatWe新内容有:当有新内容时,刷新ListView中的显示:adapter.notifyDataSetChanged();将ListView定位到最后一行:listView.setSelection(messages.size();指定ListView中分割线为透明:android:divider=”#0000”第四章 Fragment一、Fragment使用方式1、Fragment简单构造三步法简单Fragment构造需要三步:首先,需要构造Fragment的布局文件xml;例如,分别构建两个xml文件,right_

43、layout.xml和left_layout.xml。然后,需要构建容纳Fragment布局文件的Fragment类。该类extends Fragment,需要重写onCreateView()方法,在其中引入上面的布局文件;之后,在主布局中引入上面两个fragment,就像使用普通控件一样。构建Fragment类代码:public class LeftFragment extends Fragment public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)

44、View view = inflater.inflate(R.layout.left_fragment, container, false);return view;在main.xml中引入Fragment代码为:红色代码部分最重要。 2、Fragment动态构造需要动态的进行Fragment构造,需要六步:首先,需要一个放置该Fragment的layout。例如,在主布局文件中,使用FrameLayout放置一个Fragment,之后,重新添加一个Fragment,即可替换当前的Fragment。 动态添加Fragment还需要5步:获得需要添加的Fragment的实例;获得Fragment

45、Manager,通过getFragmentManager()方法获得;开启事务FragmentTransaction;向容器内加入Fragment,该容器即为上面设置的FrameLayout。利用replace添加。提交事务。AnotherRightFragment fragment=new AnotherRightFragment();FragmentManager manager=getFragmentManager();FragmentTransaction transaction=manager.beginTransaction();transaction.replace(R.id.r

46、ight_layout, fragment);mit();3、在Fragment中模拟Activity的返回栈动态添加Fragment之后,点击back,程序就退出了;添加代码transaction.addToBackStack(null);即可实现将Fragment放入“返回栈”中,点击back,当前Fragment退回到之前的Fragment,而不是退出。4、Activity与Fragment之间相互通信在Activity中,如何获取该Activity中的Fragment呢?如下,获得Fragment的实例之后,该Fragment中的方法都可以调用了。Righ

47、tFragment rightFragment=(RightFragment) getFragmentManager().findFragmentById(R.id.right_fragment);在Fragment中如何获得其所在的Activity呢?如下代码所示,在Fragment中获得了MainActivity的实例,从而可以获得当中的button。MainActivity activity=(MainActivity) getActivity();Button button=(Button) activity.findViewById(R.id.button1);二、Fragment的周期第五章 BroadCast Receiver一、广播机制标准广播:异步的,广播发送之后,所有的广播接收器几乎同时接受广播,广播效率比较高。但不能截断。有序广播:同步执行的,优先级高的先接受到,之前的广播接收器可以截断广播。二、接收系统广播手机开机、电池变量、时间变化等,系统都会发生广播。注册广播方式有两种,在代码中注册和在AndroidMa

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论