1 startactivityForResult()方法。
2.onsaveInstance()方法,没整明白。
3.launch mode :standart,singletop,singletask,singleInstance
4,avtivity 由返回栈 task管理,getTaskId().
5.ListView
6.px=dp(dpi/160)
7. 9.png.打开tools --- draw9patch.bat- 导入所需图片。我们可以在图片的四个边框绘制一个个的小黑点,在上边框和左边框绘制的部分就表示当图片需要拉伸时就拉伸黑点标记的区域,在下边框和右边框绘制的部分则表示内容会被放置的区域。
8.Fragment
9.inflater
10.broadcastReceiver 分noraml和ordered 两种
11 三种存储方式
最后拿3个参数来总结下:
总之一句话,推荐用下边这种方式:
startActivityForResult()方法用来启动另一个activity并在回调方法中得到回传的数据。
这里涉及到三个方法,另外两个是setResult(),onActivityResult().
setResult()是在secondActivity中调用,并回传数据。例如setResult(RESULT_OK,intent),在intent中放入回传数据。
onActivityResult(requestcode,resultcode,data)在firstActivity中调用。requestcode判断请求码从哪来,Resultcode判断
接收数据是否准确,data 是intent中数据。
ListView 一 初级
listView + listView子项layout + adapter + data.
list 绑定外界数据源。
eg.
String[] data={"ss","dd"};
ListView list=findviewbyid(R.id.list);
ArrayAdapter<String> adapter=new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple,data);
list.setAdapter(adapter);
listView 2 初级+
1,自定义listview item 布局
2,自定义adapter
3,自定义数据类
eg.
一 item_layout.xml , <TextView><ImageView>
二 class Fruit{ textveiew,int imgviewid }
三 FruiteAdapter extends ArrayAdapter<Fruit>. 1.构造方法 FruiteAdapter(context,int itemLayout,listdata);
2,getView() 解释:每一项滚到屏幕的时候调用并返回一个item view。所以,首先得到item layout 布局,
LayoutInflater.from(getContext).inflate(itemLayout,null);然后,用得到的view findviewbyid 得到,view中的
元素 imageview ,textview。最后给两个子元素设置数据。imageView.setImageResouce(fruit.getImagid());
再把view return 就ok了。
四 给list 绑定数据。List<Fruit> list=new ArrayList<Fruit>; Fruit aple=new Fruit(name.id);list.add(apple);
五,绑定adapter,listView.setAdapter.()
listView 中级
优化getView。
1.convertView是对以前加载的item布局进行缓存。所以在convertView不为空的时候加以利用。
Fruit fruit=getItem(position);
View view;
If(convertView==null){
view=LayoutInflater.from(getContext()).inflate(resid,null);
}else{
view=convertView;
}
img=view.find...
txt=view.find...
img.setimageResource(fruit.getimgid());
txt.setText(fruit.getname());
return view;
2.虽然convertView不为空的时候不再需要加载布局了,但是img,txt还是每次都要实例化,因此优化这部分。
Fruit fruit=getItem(position);
View view;
Holder holder;
If(convertView==null){
view=LayoutInflater.from(getContext()).inflate(resid,null);
holder=new Holder();
holder.img=view.find...
holder.txt=view.find....
view.setTag(holder);
}else{
view=convertView;
holder=view.getTag();
}
holder.img.setimageResource(fruit.getimgid());
holder.txt.setText(fruit.getname());
return view;
}
class Holder{
TextVew txt;
ImageView img;
}
listview 点击事件Fruit fruit=datalist.get(position); 注意datalist
Fragment
有点类似自定义view,每个Fragment都有一个layout,并且对应的Fragment要加在这个layout。
有一点特别的,这个Fragment可以动态的替换,对应里面的layout的也得到替换。Fragment 的layout
通常在一个framelayout里面替换,所以在Activity layout里面要放置一个framelayout_id_content,
用来显示Fragment中的内容。
Fragment可以当做控件放到布局文件中。其中加一条属性android:name=“package name+Fragment name”
替换Fragment 步骤。1先得到一个Fragment实例。2,用getFragmentManager得到一个 Fragment 管理器。
3用manager.beginTransaction().得到一个事务。4,traction.replace(R.id.content,fragmet).commit();这样就完成了
addtobackstack();加入回退栈
Activity和Fragment之间通信。Activity得中得到Fragment实例。RightFragment frg=new RightFragment 或者RightFragment frg=(RightFragment)getFagmentManager().findviewbyid(R.id.frg);得到实例可以调用相应Fragment中的方法。
Fragment中可以得到Activity的实例 Activity activity=(Activity)getActivity();
BroadcastReceiver
动态注册广播 注意退出时要解除注册
IntentFilter filter=new IntentFilter();
filter.addAction(android.net.conntivity_);
netRecitver=new NetReceiver();
registerReceiver(netReceiver,filter);
在Ondestroy里面调用 UNregisterReceiver(netReceiver)
ConnectivityManager connmanager=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
NetWorkInfo netinfor=connmanager.getActivitveInfo();
if(netinfor!=null && netInfo.isAvailable())
静态注册 manifest里面
<receiver android:name=".BootBroadcaseReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"
</intent-filter>
</receiver>
发送广播
Intent Intent=new intent("com,bourne.MYBRODCASE");
sendBroadCast(intent)
存储3中,本地文件,sp,sqlite
一 本地文件 看一段代码
FileOutputStream out=openFileOutput("fileName",Context.private);//传入文件名和文件mode
BufferedWriter writer=new BufferedWriter(new OutputStreamReader(out));//先把文件从字节流转为字符流,再用缓冲流装饰。
writer.write();//写入 对应关闭。属于JVM之外的操作,需要自己写关闭
FileOutputStream(File file, boolean append)
创建一个向指定 File
对象表示的文件中写入数据的文件输出流。
FileInputStream(File file)
通过打开一个到实际文件的连接来创建一个FileInputStream
,该文件通过文件系统中的 File
对象 file
指定
Context类中提供了一个openFileOutput()方法,可以用于将数据存储到指定的文件中。 这个方法接收两个参数,第一个参数是文件名,在文件创建的时候使用的就是这个名称,
同理 openFileInput
二 得到sp对象三种方法
1.Context类中 getSharedPreferences("fileName","mode")
2.Activity 中getPreferences(mode)
3.Preferencesmanager 中getDefaultSharedPreferences(Context context)
实现步骤
SharedPreferences.Editor editor=getSharedPreferences("",mode).edit();
editor.putString("key","value");
editor.putBoolean("male",false);
editor.commit();
read sp
得到sp对象,然后调用getString,getBoolean(key,defvlaue)方法。
注意:参数为2个,defvalue 如果读不到,就用默认值。
三 SQLite
1,用SQLiteDataBase的辅助类,SQliteOpenHelper.
首先继承SQliteOpenHelper,实现这个辅助类。然后复写onCreate 和OnUpgrade方法。
public static final String str_table="create table book(name text,age Integer,id Integer primary key autoincrement)";
在oncreate中调用db.execSQL(str_table),将字符串写入到database中。同时要复写构造方法。
然后再Activity中创建 helper的对象再调用getWritableDataBase方法创建数据库
创建table语法,其中是小括号,变量种类char(固定长度字符串),varchar(不固定长度字符串),text(文本编码字符串),Integer,real(浮点数),blob(输入格式数据块),date,time,null
查看数据库文件内容。
adb shell 找到文件所在目录,然后ls指令,然后sqlite3 文件名,然后.table 然后.schema 就可以了
数据库升级
1 在upgrade方法里面执行
db.execSQL("drop table if exists ***")//暴力丢弃数据库方法,不提倡
然后调用数据库类的构造函数的时候,把最后的数字升级一下
可以这么做,
1.升级数据库版本号(数据库类构造方法中)2.如果是新增table,可以在upgrade方法中,switch(oldVersion)
db.execSQL(table_name)3.如果是新增列,可以db.execSQL("alter table book add column column_name valueType")
数据库数据操作CURD create,retrieve,update,delete
2 插入数据insert()
SQLiteDatabase db=mydb.getWritableDatabase();
ContentValues values=new ContentValues();
values.put(key,value);
db.insert(table_name,null,values);
values.clear();
3 (在adb中)查询:select * from book; book是table name不是数据库的名字,数据库里面有很多table
4 更新table内容 update
SQLiteDatabase db=mydb.getWritableDatabase();
ContentValues values=new ContentValues();
values.put(key,value);
db.update(book,vaues,"name=?",new String[]{"huggsy"})
db.update(tablename,vaues,where,str[])
这里使用了第三、第四个参数来指定具
体更新哪几行。第三个参数对应的是 SQL 语句的 where 部分,表示去更新所有 name 等于?
的行,而?是一个占位符,可以通过第四个参数提供的一个字符串数组为第三个参数中的每
个占位符指定相应的内容。
5.删除table内容 delete
SQLiteDatabase db=mydb.getWritableDatabase()
db.delete(table_name,where_?,str[])
6.查询 query()参数最少七个,table,column ,select 。。。
Cursor cursor=db.query(table,null,....)
if(cursor.moveToFirst)do{
String name=cursor.getString(cursor.getColumnIndext("name"))
}while(cursor.moveToNext);
SQLite 数据库是支持事务的,事务的特性可以保证让某一系列的操
作要么全部完成,要么一个都不会完成。那么在什么情况下才需要使用事务呢?想象以下场
景,比如你正在进行一次转账操作,银行会将转账的金额先从你
db.begainTransaction();
db操作
db.setTransactionSucesul();//操作完成后调用
db.endTransaction();//结束事务