Android学习要点

Android学习要点

Day03:

一、写出三种不同的布局

LinearLayout

RelativeLayout

FrameLayout

二、写出线性布局方向属性和属性值

android:orientation

horizontal

vertical

三、写出相对布局的16个属性

相对于兄弟控件位置: layout_toLeftOf layout_toRightOf layout_above layout_below 相对于兄弟控件对齐:layout_alignLeft layout_alignRight layout_alignTop layout_alignBottom layout_alignBaseline

相对于父控件的位置: layout_alignParentLeft layout_alignParentRight

layout_alignParentTop layout_alignParentBottom

相对于父控件对齐:layout_centerInParent layout_centerHorizontal layout_centerVertical

四、列出常用的属性(字体大小,字体颜色、边距、对齐方式)

textSize

textColor

padding

layout_margin

gravity

layout_gravity

Day04:

一、写出常用的UI控件(至少6个)

TextView ImageView Button RadioButton CheckBox EditText RadioGroup ImageButton

二、写出三个不同UI控件事件监听器(接口)

OnClickListener

OnCheckedChangeListener(CompoundButton/RadioGroup)

OnItemSelectedListener

三、 写出ImageView的缩放类型的属性及其属性值(至少4个属性值)

android:scaleType

center

centerCrop

centerInside

fitCenter

fitStart

fitEnd

fitXY

四、写出实现跑马灯的属性

android:singleLine=“true”

android:ellipsize=“marquee”

android:marqueeRepeatLimit=“marquee_forever”

android:focusable=“true”

android:focusableInTouchMode=“true”

Day05:

一、写出相对布局的16个属性

二、写出Spinner的常用属性(至少4个)

下拉模式:android:spinnerMode

设置标题:android:prompt=“@string/title”

设置数据源: android:entries=“@array/cityes”

设置下拉背景:android:popupBackground=“#f00”

三、 描述Spinner与ArrrayAdapter之间的用法(需要写出ArrayAdapter的构造方法)

1. Spinner是AdapterView的子类,因此需要ArrayAdapter显示数据

2. Spinner.setAdapter(ArrayAdapter) 设置Spinner的适配器对象

3. ArrayAdatper(Context context,int resid,List<T> datas)

ArrayAdapter(Context context, int resid,T[] datas)

四、写出AutoCompleteTextView的用法及文本改变事件监听器接口

1. AutoCompleteTextView 辅助用户快速输入内容

2. AutoCompleteTextView辅助的信息是集合类型,因此需要一个ArrayAdapter

3. AutoCompleteTextView.setAdapter(ArrayAdapter)

4. AutoCompleteTextView.addTextChangedLinstener(TextWatcher)

Day06:

一、 写出ImageView 的ScaleType的属性值(至少需要5个)

centerCrop centerInside fitCenter fitStart fitEnd fitXY center

二、写出Activity之间的传值方式

1. intent 2. 静态成员 3. 全局对象或方法 4. startActivityForResult

三、写出Spinner与ArrayAdapter的用法

Spinner.setAdapter(ArrayAdapter)

ArrayAdapter<T>(Context context, int resid,T[]) 或

ArrayAdapter<T>(Context context, int resid,List<T>)

四、写出Activity的生命周期方法与相关说明

1. onCreate() 初始创建时调用,且只调用一次

2. onStart() 显示窗口

3. onResume() 获取焦点,与用户交互

4. onPause() 失去焦点,暂停与用户交互

5. onStop() 关闭窗口

6. onRestart() 重新显示窗口: onStart()—>onResume()

7. onDestory() 销毁窗口对象

五、写出Activity A 启动ActivityB的生命周期方法的调用顺序

A:onPause -> B: onCreate() -> B:onStart() ->B: onResume() ->A: onStop()

六、写出当前Activity下按Home键的生命周期方法的调用顺序

onPause() -> onStop()

Day07:

一、 写四种Activity运行模式和设置方法

四种: standard singleTop singleTask singleInstance

设置方法: 在清单配置文件(AndroidManifest.xml) 的Activity标签中使用 android:launchMode属性设置

二、 RunningTaskInfo类的常用属性

id,baseActivity, topActivity, numActivities

三、写出Intent的七大属性

ComponentName Action Category Data Type Extra Flag

四、写出打电话的隐式意图

Intent intent=new Intent(Intent.ACTION_CALL,Uri.parse(“tel:10086”));

startActivity(intent);

一、描述一下Android中使用线程的规则

1. 主线程(UI线程)不能被阻塞

2. 子线程(WorkThread)不能访问UI控件

二、什么时候会发生ANR,ANR全称是什么

是在主线程被阻塞5秒以上则会发生ANR , Application not Responding

解决办法是在子线程中执行耗时操作

三、写出AsyncTask的用法

1. 创建类,继承AsyncTask类,并指定三个泛型

2. 重写doInBackground()方法,在此方法中处理网络或耗时操作

3. 重写onPostExecute()处理后台线程返回结果

4. 重写onPreExecute()和onProgressUpdate()实现后台处理进度信息

5. 在UI线程中实现自定义的AsyncTask的子类,并调用其的execute()方法执行网络请求

四、如何取消AsyncTask

1. 通过自定义的AsyncTask的子类对象,调用其的cancel(true)取消任务

2. 在AsyncTask子类的doInBackground()方法中,通过isCancelled()判断当前任务是否被取消

Day09:

一、 写出AsyncTask的三种泛型的作用

1. Params : 请求处理的类型(Url 和String)

2. Progress : 后台处理的进度(Integer)

3. Result : 后台处理的结果类型(Bitmap ,List<T>)

二、如何修改ProgressBar的样式

<ProgressBar style=“?android:attr?ProgressBarStyleHorizontal”>

三、写出ListView的常用属性

android:divider 设置分隔线的样式

android:dividerHeight :设置分隔线的高度

android:entries 设置列表的数据源

四、写出BaseAdapter的四个抽象方法

public int getCount();

public Object getItem(int position)

public long getItemId(int position)

public View getView(int position,View convertView,ViewGroup parent);

Day12:

一、 写出三种不同的菜单的创建方式和点击菜单项的事件处理

1. OptionsMenu

在Activity中重写onCreateOptionsMenu()

重写 onOptionsItemSelected()

2. ContextMenu

重写onCreateContextMenu()

重写onContextItemSelected()

3. PopupMenu

popupMenu= new PoppuMenu(Context,View);

popupMenu.setOnMenuItemClickListener(OnMenuItemClickListener) //设置菜单项点击事件

二、写出AlertDialog简单用法

AlertDialog.Builder builder=new AlertDialog.Builder(Context);

builder.setTitle(String)

.setIcon(int res)

.setMessage(String)

.setPositiveButton(String,DialogInterface.OnClickListener)

.create().show();

三、写出一个通知的普通用法(构造通知和发送通知)

1. NotificationCompat.Builder builder=new NotificationCompat.Builder(Context);

builder.setSmallIcon(int resId)

.setContentTitle(String)

.setContentText(String)

.setContentIntent(PendingIntent);

2.NotificationManager

notifyManager=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE); notifyManager.notify(1,builder.build())

Day13:

一、 写出Fragment11个生命周期方法

onAttach()

onCreate()

onCreateView()

onActivityCreated()

onStart()

onResume()

onPause()

onStop()

onDestroyView()

onDestroy()

onDetach()

二、写出Fragment传值方式

Bundle 方式: FragmentTransaction.setArguments(Bundle)

Activity方式: 在Activity中声明public 方法,在Fragment中通过getActivity()获取Fragment所在的Activity对象,并执行其中public方法

三、 如何动态增加Fragment到指定的布局中(id: contentId)

FragmentManager manager=getFragmentManager();

FragmentTransaction trans=manager.beginTransaction();

trans.replace(contentId, new CustomFragment());

trans.commit()

Day14:

一、写出四种数据存储方式

SharedPreferences 共享参数

内部存储

扩展存储

网络存储

二、如何判断SDCard是否可用,如何获取SDCard的根目录

1. String sdcardState=Environment.getExternalStorageState();

if(sdCardSate.equals(Environment.MEDIA_MOUNTED){

//可用

}

2. String path=Environment.getExteralStorageDirectory().getAbsolutePath()

三、写出内部存储的读写方法

1. 读 FileInputStream fis=openFileInput(String)

2. 写 FileOutputStream fos=openFileOutput(String,int mode),Context.MODE_PRIVATE

四、写出共享参数的简单使用的代码(读与写)

1. 读

SharedPreferences pres=getSharedPreferences();

String key= pres.getString(“key”);

2. 写

SharedPreferences pres=getSharedPreferences();

SharedPreferecces.Editor editor=pres.edit();

editor.putString(“key”,”Value”);

editor.commit();

五、写出上传文件核心代码(Android端)

MultipartEntity multipartEntity=new MultipartEntity();

FileBody file=new FileBody(new File(filePath));

FormBodyPart formPart=new FormBodyPart(“form”,file);

multipartEntity.addPart(formPart);

HttpClient client=new HttpClient();

HttpPost post=new HttpPost(url);

post.setEntity(multipartEntity);

Day15:

一、写出SimpleAdapter的构造方法

SimpleAdapter(Context,List<HashMap<String,?>>,int resId,String[],int[])

二、写出SimpleCursorAdapter的构造方法

SimpleCursorAdapter(Context,int resId,Cursor,String[],int[],int flags)

flag—>

CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER CursorAdatper.FLAG_AUTO_REQUERY

三、写出数据库操作的相关类(到少3个)

SQLiteDatabase

SQLiteOpenHelper

Cursor

ContentValues

四、写出内部存储的数据库的位置

/data/data/{packName}/databases/*.db

day16:

一、写出AsyncTask使用步骤

1. 创建类,继承AsyncTask,并指定三个泛型

2. 重写四个方法

onPreExecute()

Result doInBackground(Params …params ) [必须实现] onPostExecute(Result result) [必须重写] onProgressUpdate(Progress …progress)

3. 在UI线程中实例化异步任务类,并执行execute(Params …)

二、写出BaseAdapter的四个抽象方法

int getCount()

Object getItem(int position)

long getItemId(int position)

View getView(int position,View convertView,ViewGroup parent)

三、写出SQLiteOpenHelper的用法(两种打开数据库的方式)

1. 创建类,继承SQLiteOpenHelper

2. 重写二个方法,并增加带Context参数的构造方法

1). onCreate()

2). onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion)

3. 实例化SQLiteOpenHelper子类的对象->dbHelper

1). dbHelper.getReadableDatabase() 只读方式

2). dbHelper.getWritableDatabase() 读写方式

Day17:

一、写出Fragment的11个生命周期方法

1) onAttach(Activity)

onCreate(Bundle)

onCreateView(LayoutInflater,ViewGroup container,Bundle)

onActvityCreated(Bundle)

2) onStart()

onResume()

onPause()

onStop()

3) onDestoryView()

onDestory()

onDettach()

二、解析以下的Json内容:(至少2种方式)

[{age:10,name:”s1”},{age:15,name:”s2”,sex:”男”},{name:”s3”,sex:”女”}]

1. String jsonStr=“ [{age:10,name:”s1”},{age:15,name:”s2”,sex:”男”},{name:”s3”,sex:”女”}]”

JSONArray array=new JSONArrray(jsonStr);

for(int i=0;i<array.length;i++){

JSONObject obj=array.getJSONObject(i);

int age=obj.optInt(“age”);

String name =obj.optString(“name”);

String sex=obj.optString(“sex”);

}

2. FastJSON方式

1) 创建JavaBean类->Student

2. List<Student> list=JSON.parseArray(jsonStr,Student.class);

3. GOSN方式

1)创建Student类

2) 创建TypeToken<LIst<Student> typeToken=new TypeToken<List<Student>>(){};

3) 创建Gson对象:

Gson gson=new Gson();

List<Student> lists=gson.fromJSON(jsonStr,typeToken.getType());

三、写出ContentProvider的使用步骤(涉及到提供方和使用方及相关的方法)

1. 提供方(ContentProvider端)

1) 创建SQLiteOpenHelper的子类,并实现两个方法,用于对本应用下的数据库操作的 onCreate()

onupgrade(SQLiteDatabase db,int oldVersion,int newVersion)

2) 创建ContentProvider的子类,并实现6个方法,主要提供给ContentResolver端使用的 boolean onCreate()

query(Uri uri,String[] projections,String where,String[] whereArgs,String sortOrder) insert(Uri uri,String nullColum,ContentValues values)

update(Uri uri,ContentValues values,String where,String[] whereArgs)

delete(Uri uri, String where,String[] whereArgs)

String getType(Uri uri)

3) 在ContentProvider子类中增加Authority和相应请求的Code

4) 根据请求的Code增加Uri到UriMatcher中

UriMatcher matcher=new UriMatcher(UriMatcher.NO_MATCH)

matcher.addUri(String Authority,String path,int code)

5) 在相应的方法中通过UriMatcher对象,匹配当前请求的Uri是哪种Code,根据不同的code来处理不同表的事务

6) 在AndroidManifest.xml清单配置文件增加访问当前ContentProvider的权限,并注册ContentProvider

<permission android:name=“{Authority}.READ_WRITE”/>

..

<provider android:name=“CotentProvider子类的完整类路径”

android:authorites=“{Authority}”

android:permission=“{Authority}.READ_WRITE”

android:exported=“true”/>

2. 使用方

1). 在 AndroidManifest.xml清单配置文件使用提供方声明的权限

<uses-permission android:name=“{Authority}.READ_WRITE”/>

2) 通过getContentResolver()获取到ContentResolver对象,并执行相应的数据处理事务 注意:.需要正确使用Uri数据访问接口和访问字段

Day18:

一、写出SimpleCursorAdapter的构造方法

SimpleCursorAdapter(Context ,int resId,Cursor ,String[] from,int[] to,int flag)

flag-> CursorAdapter.FLAG_REISTER_CONTENT_OBSERVER

二、写出启动Loader的步骤

1. 当前的Activity或Fragment实现LoaderCallbacs<D>接口,并实现其三个方法 Loader<D> onCreateLoader(int loaderId,Bundle args)

onLoadFinished(Loader<D> loader,Cursor data)

onLoaderReset(Loader<D> loader)

2. 在Activity的onCreate()方法中启动Loader

getLoaderManager().initLoader(int id,Bundle args,LoaderCallbacks<D>)

-----实例中使用的代码----------

getLoaderManager().initLoader(1,null,this);

3. 在LoaderCallbacks<D>接口方法中实现相应的功能

3.1 onCreateLoader()方法中

return new CursorLoader(Context,Uri,String[],String,String[],String)

3.2 onLoadFinished(Loader<Cursor>,Cursor result )方法中,将数据刷新到Adapter中 SimpleCursorAdapter.swapCursor(result);

3.2 onLoaderReset(Loader<Cusor> ) 清除之前旧数据

SimpleCursorAdapter.swapCursor(null)

三、写出自定义Loader的步聚

1. 创建类,继承AsyncTaskLoader,并指定泛型,重写两个重要的方法

1.1 onStartLoading() 正在重启Loader时-->forceLoad() 强制启动Loader

1.2 D loadInBackground() 后台执行Loader,加载数据

2. 提供一个带有Context和Bundle的构造方法,并在构造方法中执行super(Context);

3. 实现loadInBackground()方法,一般使用ContentResolver查询数据

四、写出SearchView的图标化属性及查询文本事件监听器接口

图标化属性:android:iconifiedByDefault=“true | false”

查询文本事件监听器:OnQueryTextListener

onQueryTextChange(String newText)

onQueryTextSubmit(String s)

Day19:

一、写出子线程如何向主线程发送信息

1. 在主线程实例化Handler对象,并重写它的handleMessage()方法

2. 在子线程实例化Message对象,并将相关业务数据设置到Message对象中

Message.what

Message.arg1

Message.arg2

Message.obj

3. 在子线程中,使用主线程的Handler对象,通过Handler.sendMessage()方法,发送消息给主线程

4. 在主线程的handleMessage方法中处理子线程发过来的消息

二、写出主线程如何向子线程发送信息

1. 在子线程中调用Looper.prepare()创建Looper和MessageQueue

2. 在子线程中实例化Handler对象,重写handleMessage()方法

3. 在子线程中调用Looper.loop()方法,开始循环读取MessageQueue中Message

4. 在主线程通过子线程的Handler对象,调用Handler.sendMessage()方法向子线程发送消息

5. 在子线程的handleMessage()方法中处理主线程发过来的消息

三、写出Handler线程通信机制

Handler线程间通信机制主要涉及到4个类,另加一个Thread

1. Looper 循环体或消息泵,主要循环读取MessageQueue中的Message,并将读取到的Message发送给target消息处理者(哪一个Handler发送消息由哪一个Handler来处理)

2. MessageQueue 消息对列,用于存放线程发送过来的消息

3. Handler 异步发送或处理消息的处理者 (sendMessage,post两种方式发送消息)

3.1 发送消息有两种方式,即Message和Runnable

3.2 延迟发送消息

sendMessageDelayed(Message,long )

postDelayed(Runnable,long)

4. Message 消息或任务对象,主要存放业务处理的数据

4.1 通过Message.obtain()或Handler.obtainMessage()获取消息池中可用的Message

4.2 通过what,arg1,arg2,obj,callback等Message类成员设置相关数据

Day20:

一、写出菜单项<item>标签中android:showAsAction的属性值及中文解析

never : 不显示到ActionBar

always : 一直显示在ActionBar中

ifRoom : 如果有空间则显示

withText : 带有标题,则有空间时显示

collapseActionView : 折叠ActionView

二、如何隐藏与显示ActionBar

getActionBar().hide()

getActionBar().show()

三、如何将SearchView增加到ActionBar中

在menu.xml文件的<item>标签中使用actionViewClass属性,如下:

android:actionViewClass=“android.widght.SearchView”

四、如何将ShareActionProvider增加到ActionBar中

在menu.xml文件的<item>标签中使用actionViewClass属性,如下: android:actionProviderClass=“android.vidget.ShareActionProvider”

五、如何增加Tab页卡到ActionBar中

Tab tab=getActionBar().newTab().setText(String).setIcon(int resId); getAtionBar.addTab(tab);

Day21:

一、写出下载给定Url地址的图片代码

try{

HttpClinent client=new DefaultHttpClient();

HttpGet get=new HttpGet(url);

HttpResponse response=client.execute(get);

if(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){

HttpEntity entity=response.getEntity();

byte[] bytes=EntityUtils.toByteArray(entity);

return bytes;

}

}catch(Exception e){

e.printStackTrace();

}

二、写出ViewPager的使用步骤(ViewPager中显示普通的View)

1. 在布局中增加<android.support.v4.view.ViewPager>标签

2. 在代码中初始化ViewPager中显示的所有View,将实例化View对象增加到List<View>列表中

3. 在代代码中自定义PagerAdapter子类,并实现四个必须的方法

int getCount()

Object instantiateItem(ViewGroup container,int position)

isViewFromObject(View view,Object obj)

destroyItem(ViewGroup container,int position,Object obj)

4. 在代码中查找ViewPager的控件对象,并调用setAdapter()来设置自定义PagerAdapter的对象

三、定出ViewPager中显示Fragment的步骤

步骤同第二道题,但在第2步和第3步需要修改如下:

2. 初始化ViewPager中显示的所有Fragment,要求需要创建自定义的Fragment类

3. 自定义FragmentPagerAdapter子类,并实现二个必须的方法,和一个带有FragmentManager的参数构造方法

public MyPagerAdapter(FragmentManager fm){ }

int getCount()

Fragment getItem(int position)

四、写出子线程向主线程发送数据的步骤

1. 在主线程实例化Handler对象,并重写handleMessage(Message message)方法

2. 在子线程通过主线程的Handler对象,调用sendMessage(Message)方法向主线程发送数据,在发送消息之前应该构造Message对象,并设置子线程处理完成后业务数据。

Day22:

一、 写出BaseAdapter的使用步骤

1. 创建类,继承BaseAdapter,并实现4个必须的方法

int getCount()

Object getItem(int position)

long getItemId(int position)

View getView(int position,View convertView, ViewGroup parent)

2. 提供两个参数构造方法

第一个参数:Context,

第二个参数:数据源对象,如List<Student>

3. 实例化定自义BaseAdapter并传入相关参数,将其对象设置到ListView或GridView中 代码如下:

AdapterView.setAdapter()方法设置

二、 写出ViewPager与ActionBar的Tab如何相互选择

1. ViewPager ->OnPageChangeListener->onPageSelected(int position)

-> actionBar.setSelectedNavigationItem(int position);

2. ActionBar.Tab->TabListener->onTabSelected(Tab tab, FragmentTransaction ft)

->viewPager.setCurrentItem(tab.getPosition);

三、如何获取SDCard的根目录,并写出读写SDCard的权限

String sdcardPath=Environment.getExternalStorageDirectory().getAbsolutePath();

写SDCard权限

android.permission.WRITE_EXTERNAL_STORAGE

读SDCard权限

android.permission.READ_EXTERNAL_STORAGE

Day23:

一、写出两种广播接收器的注册方式及相关代码

1. 局部的动态注册:

在Activity或Service中 registerReceiver(BroadcastReceiver,IntentFilter)

,且在适当的位置调用unregisterReceiver(BroadcastReceiver);

2. 在AndroidManifest.xml注册

<receiver android:name=“className”>

<intent-filter>

<action android:name=“actionName”/>

</intent-filter>

</receiver>

二、写出广播接收器的作用

1. 接收系统广播,监视手机或系统使用状况

2. 在Android应用组件之间相互通信(Activity与Service之间)

三、如何解决广播的安全问题

1. 在发送广播时使用权限或应用的包名,若使用权限,在广播接收端必须定义和使用指定的权限

2. 在AndroidManifest.xml文件的<receiver>标签中,使用android:exported=“false”即不接收外部应用发送的广播

3. 使用v4包中 LocalBroadcastManager,在应用内部发送和接收广播

四、广播接收器的生命周期方法

onReceiver(Context context,Intent intent)

Day24:

一、 写出StartService使用步聚

1. 创建类,继承Service,重写相关方法

2. 在AndroidManifest.xml中使用<service>标签注册服务

3. 在Activity中启动服务

Context.startService(Intent) ;

4. 在Activity中停止服务

Context.stopService(Intent);

二、写出StartService的生命周期方法

onCreate()

onStartCommand(Intent intent,int flag,int startId)

onDestroy()

三、写出StartService与Activity如何通信

必须使用广播接收器,在Service或Activity中接收相关数据

1. 在Service中接收广播

1.1 在Service声明一个类,继承BroadcastReceiver,重写onReceiver(),在此方法中处理数据,并且在Service的onCreate()方法中动态注册广播接收器,在onDestroy()方法中取消注册

1.2 在Activity中,发送广播,并将数据设置到Intent中

2. 在Activity中接收广播

2.1 在Activity自定义广播接收类(BroadcastReceiver),在onReceiver()方法中处理数据,并在Activity的onCreate()来动态注册广播接收器,在onDestroy()方法中取消注册广播

registReceiver(BroadcastReceiver,IntentFilter);

unregistReceiver(BroadcastReceiver);

2.2 在Service发送相关广播,并将数据设置到Intent中

sendBroadcast(Intent);

Day25:

一、写出使用BindService的步骤及核心方法

1. 创建类,继承Service ,重写IBinder onBind()方法

2. 在自定义Service类中,声明一个Binder的子类实例对象,在Binder的子类提供相关的业务处理方法

3. 在onBind()方法中返回,Binder子类的实例对象

4. 在AndroidManifest.xml注册Servie

5. 在Activity中通过bindService(Intent,ServiceConnection conn, int flag)来绑定服务

5.1 实例化一个ServiceConnection接口对象并实现2个接口方法:

void onServiceConnected(ComponentName ,IBinder service)

void onServiceDisconnected(ComponentName)

5.2 声明一个Binder的子类对象,并在onServiceConnected方法中,将service强转为Binder子类的类型

6. 在Activity中通过相关按钮事件,调用Binder子类中声明的业务处理方法

二、 写出使用AIDL的步骤

一)服务端

1. 创建类包,并在这个类包下创建一个.aidl文件,在.aidl文件中声明接口和接口方法 package com.train.ailds;

interface IRemoteService{

String[] query(String txt)

}

2. 创建Service的子类,重写onBind()方法

3. 在自定义的Service类中,声明IRemoteService.Stub的实例对象,并通过匿名内部类的方式重写IRemoteService接口方法

4. 在 onBind()方法返回IRemoteService.Stub的实例对象

5. 在AndroidManifest.xml中注册Service,必须提供一个Action,如:

<service android:name=“{serviceClassName}”>

<intent-filter>

<action android:name=“{actionName}”/>

</intent-filter>

</service>

二) 客户端

1. 将服务端提供的.aidl文件及类包,复制到src包下

2. 在Activity中定义一个Intent对象,并指定服务端提供的Action

3. 定义一个aidl文件声明的接口对象,简称:AIDL接口

4. 声明ServiceConnection接口实例对象,并通过匿名内部类的方式,实现2个接口方法 void onServiceConnected(ComponentName ,IBinder service)

void onServiceDisconnected(ComponentName)

5. 在onServiceConnected方法,通过AIDL接口的Stud抽象类的asInterface(IBinder)将service转成AIDL接口

6. 在Activity中通过bindService(intent,ServiceConnection,int flag)绑定服务端的Service并获取到AIDL接口对象

flag->Service.BIND_AUTO_CREATE :绑定的服务如果不存在,则自动创建

7. 在Activity中通过相关按钮事件,调用Binder子类中声明的业务处理方法

Day28:

一、 写出三种常用的布局及相关属性

1. 线性布局 LinearLayout,其属性:

android:orientation=“horizontal | vertical”

子控件使用的属性:

android:layout_weight

2. 相对布局 RelativeLayout,其子控件的属性

相对于兄弟控件:

android:layout_toRightOf android:layout_toLeftOf

android:layout_below android:layout_above

android:layout_alignLeft android:layout_alignRight

android:layout_alignTop android:layout_alignBottom android:layout_alignBaseline 相对父控件:

android:layout_alignParentLeft=“true” android:layout_alignParentRight

android:layout_alignParentTop android:layout_alignParentBottom

android:layout_centerInParen android:layout_centerVertical

android:layout_centerHorizontal

3. 帧布局 FrameLayout

其子控件的属性:

android:layout_gravity=“top|left|right|bottom|center| center_horizontal | center_vertical“

二、写出常用的UI控件

TextView、Button、ImageView、EditText、CheckBox、RadioButton、ImageButton、ProgressBar AutoCompleteTextView 、Spinner、ListView、GridView、ScrollView、SearchView、LinearLayout、RelativeLayout、FrameLayout、ViewPager、Fragment、RadioGroup、Toggle、Switcher、HorizontalScrollView

三、写出TextView、Button、ImageView、EditText相关的属性

TextView:android:text,android:textSize,android:textColor,

android:textStyle,android:drawableLeft/Right/Top/Bottom

android:autoLink=“all|email|map|phone|web”

Button: onClick,继承TextView常用的属性

ImageView : android:src , scaleType=“fitCenter|fitXY|fitStart|fitEnd|centerCrop|centerInside|center” EditText: inputType=“text|textPassword|numberPassword|textEmailAddress|date|time|number|phone”

四、写出Http网络请求功能,获取给定的URL地址的json内容

给定: String url, Person ,{state:”success”,pageCount:10,datas:[{ …},{…},{… }] }

1. 网络请求功能:byte[] NetWorkUtils.download(String url)

try{

HttpClient client=new DefaultHttpClient();

HttpGet get=new HttpGet(url);

HttpResponse response=client.execute(get);

if(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){

byte[] bytes=EntityUtils.toByteArray(response.getEntity());

return bytes;

}

}catch(Exception e){}

2. JSON解析 : JsonUtils.parsePerson(byte[] bytes)

String json=new String(bytes,”utf-8”); //utf-8 ,gb2312,gbk

JSONObject obj=new JSONObject(json);

String state=obj.optString(“state”);

if(“success”.equals(state)){

int pageCount=obj.optInt(“pageCount”);

JSONArray array=obj.optJSONArray(“datas”);

List<Person> persons=JSON.parseArray(array.toString(),Person.class);

return persons;

}

3. AysncTask<String,Void,List<Person>> :

List<Person> doInBackground(String… params){

byte[] bytes=NetWorkUtils.download(url);

return JsonUtils.parsePerson(bytes);

}

Day29:

一、 ListView的itemView如何复用

1. 在自定义BaseAdapter类中的getView方法中去实现复用

2. 提供一个内部类ViewHoder ,用于封装item布局中的控件,为主了减少findViewBy次数

3. 在getView()方法中,首选声明一个ViewHolder类对象

4. 判断getView(int position,View convertView,ViewGroup parent)第二个参数是否为空,不为空时表示有可复用itemView,即ListView有滚出其屏幕的itemView控件,最后通过View.getTag()获取之前通过setTag()设置的ViewHolder对象

5. 如果convertView为空,说明没有可复用的itemView,此时需要创建convertView,一般通过LayoutInflater类加载布局到convertView中,实例化ViewHolder类对象,再通过convertView.findViewBy()查找布局相关的控件,并将控件设置到ViewHolder对象中,待所有的控件查找之后,通过convertView.setTag()方式将ViewHolder对象绑定到convertView,便于复用时直接获取其中的控件

二、通过二种方式解析以下xml:

<users>

<user id=“0101”>

<name>张三</name>

<age>20</age>

</user>

<user id=“0102”>

<name>李四</name>

<age>24</age>

</user>

</users>

给定变量:String xmlSrc,User

1. XmlLPullParser 基于事件驱动方式解析XML的

XmlPullParer parser=XmlPullParserFactory.newInstance().newPullParser(); parser.setInput(new StringReader(xmlSrc));

int eventType=parser.getEventType();

String tagName; //每一个标签的名称

List<User> users=new ArrayList<User>();

User user;

while(eventType!=XmlPullParser.END_DOCUMENT){

switch(eventType){

case XmlPullParser.START_TAG:

tagName=parser.getName();

if(tagName.equals(“user”){

user=new User();

String id=parser.getAttributeValue(null,”id”);

user.setId(id);

}

break;

case XmlPullParser.TEXT:

if(tagName.equals(“name”){

String name=parser.getText();

user.setName(name);

}else if(tagName.equals(“name”){

int age=Integer.parseInt(parser.getText()); user.setAge(age);

}

break;

case XmlPullParser.END_TAG:

//tagName=parser.getName();

if(tagName.equals(“user”){

users.add(user);

}

}

eventType=parser.next(); //转到下一个节点

}

2. SAX 解析

SAXParser parser=SAXParserFactory.newInstance().newSAXParser();

List<User> user=new ArrayList<User>();

parser.parse(new InputSource(new StringReader(xmlSrc)),new MyDefaultHandler(user))

MyDefaultHanlder.java

————————————————————

startDocument() startElement(String uri, String localName, String qName, Attributes attributes) characters(char[] ch, int start, int length)

endElement(String uri, String localName, String qName)

endDocument()

相关推荐