Android学习笔记

来源:互联网 发布:网络广告创意方法 编辑:程序博客网 时间:2024/06/05 08:44

.LOG


13:37 2013-1-16


TableLayout
android:layout_column
android:layout_span
扩展、收缩和折叠
android:stretchColumns 可以指明多个列,用逗号隔开
android:shrinkColumns
android:collapseColumns


FrameLayout:帧布局
ScrollView:
HorizonalScrollView:


适配器Adapter


对数据进行封装,对外提供统一的访问接口,可以供不同的控件使用,控件不用关心数据源来自哪里,我


们只要访问适配器就能访问内部的数据


android的选择空间不直接更数据源打交道,而是跟不同的适配器打交道,程序员只要把数据源封装到适


配器就可以了,接下来让空间绑定响应的适配器呈现数据即可




Datasource       --------         adapter    -------------      listview


     |


cursor 、arraylist


android的适配器对象主要有
ArrayAdapter
用来封装数组或集合数据
adapter = new ArrayAdapter<String>(this, R.layout.list, R.id.t_list, data);
SimpleAdapter
数据源是List<Map<String, Object>>
CursorAdapter


BaseAdapter 基础适配器
AddrayAdapter, SimpleAdapter, CursorAdapter 都继承了BaseAdapter,一个类一旦继承了BaseAdapter


,我们就能实现自己的适配器




ListView 控件的每一行其实就是一个xml文件解析好的一个View


当Activity中只有一个ListView控件没有其他控件的时候,推荐使用extends ListActivity,它内部已经


帮你生成了一个唯一的ListView控件,直接拿来用就可以了,不用自定义布局文件。




9:22 2013-1-18
MediaPlayer
一、Idle状态
1、当创建MediaPlayer对象的时候
2、调用MediaPlayer的reset()方法的时候,它会监听onErrorListener事件
二、Initialized状态
1、调用setDataSource()方法的时候,加载要播放的数据源
三、Prepared状态
1、调用prepare()方法,启动c,c++编写的媒体播放组件
四、Started状态
1、调用start()方法开始播放


从Started状态调用pause()方法进入Paused状态,Paused状态也可以调用start()方法进入Started状态
从Started状态调用stop()方法进入Stoped状态,不能直接从Stoped状态进入Started状态,必须重新进入


Prepared状态再进入Started状态


我们也可以给mediaPlayer添加OncompleteListener监听器来监听当前歌曲的播放状态,当播放完以后我


们可以设置播放下一首或重复一首


当播放结束时,我们也可以调用release()方法,销毁资源


判断Sdcard是否可用
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)


得到Sdcard根路径
Environment.getExternalStorageDirectory()


ANR异常:Application not responding


Android线程模型
Android设计的时候是单线程模型的,所有的组件都运行在主线程上(UI线程)
UI线程主要用来绘制外观和监听事件处理。android规定主线程不能做耗时的工作,规定一旦UI线程被阻


塞时间超过5秒的话,就会报ANR异常。UI线程是非线程安全的(子线程不能直接修改运行在UI线程上的组


件外观),记住:绘制外观必须交给UI线程。


Handler对象的出现就解决了以上的问题。(消息处理者),它是UI线程创建的,游离于UI线程和子线程之



当一个线程创建的时候,都会有一个在内部产生一个消息队列()


9:27 2013-1-22
TabHost 由两部分组成
TabWidget 内部放标签的
FrameLayout 放标签所关联的内容


创建TabHost有两种方式
1 继承Activity,使用布局文件中的TabHost组件,id可以自己取,必须调用setup()方法
2 继承TabActivity,在布局文件中的TabHost组件id必须为@android:id/tabs


9:40 2013-1-23
Toast
常用方法
setGravity();
setView();
setDuration


Dialog
标准对话框
new AlertDialogActivity.Builder(...)
或new Builder(AlertDialogActivity.this)
setTitle()
setIcon();
setPositiveButton
setNegativeButton
选项对话框
建立String[] colors
setItems(colors, new OnClickListener(){
@Override
public void onClick(DialogInteface dialog, int which) {
Field field = dialog.getClass().getSuperclass().getDeclaredFiled


("mShowing");
field.setAccessable(true);
field.set(dialog, false);
switch (which) {
case R.id....
...
}
}
})


Android生命周期


当Activity被其他Activity完全覆盖时会调用onPause--onStop
当被完全覆盖的Activity重新回到前端时会调用onRestart--onResume


当Activity被其他Activity局部覆盖时会调用onPause
当被局部覆盖的Activity重新回到前端时会调用onResume


第一次启动的时候onCreate--onStart--onResume
onCreate:加载布局文件,初始化布局文件中的所有控件
onStart:多次执行,每次显示Activity都会被第一个被调用, 控件赋值,显示外观,设置控件事件
onResume 多次执行,每次显示Activity都会在onStart后被调用


onPause Activity失去控制权或者被遮盖时执行,资源释放,数据保存,文件存储
onStop  Activity失去控制权
onDestroy 应用程序完全退出 activity.finish() 
onRestart Activity从失去控制权到获得控制权


Android的进程管理系统委托给系统来自动管理的,他是以Task栈的形式管理,android最多只有一个活动


的Activity与用户进行交互。与用户交互的Activity的优先级最高,一般资源不够的情况下也不会被kill


掉。只有后台进程在资源不够的情况下会被kill掉,释放资源给新的应用使用。就算kill掉了,它也会在


系统中被标识所在的顺序位置。当再次使用它的时候它会被重新创建。


注意:屏幕横屏竖屏切换时,Activity会被销毁和创建
onSaveInstanceState用来保存数据,当此Activity有可能被销毁的情况下执行 onPause之前
onRestoreInstanceState onResume之前


layout-land存放横屏布局文件
layout-port存放竖屏布局文件
两个文件夹内文件必须一一对应且文件名相同


9:17 2013-1-24
android:configChanges="orientation|keyboardHidden"
/**
     * 只要屏幕切换就会调用此方法
     */
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
    Toast.makeText(this, "水平", 0).show();
    } else {
    Toast.makeText(this, "垂直", 0).show();
    }
    super.onConfigurationChanged(newConfig);
    }
    
    public void initData() {
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
    }


Intent:意图
作用:用来激活Activity, Service, Broadcast Receiver组件,它是三大组件之间通讯的桥梁,起到三


大组件之间相互独立,解耦的作用。


Intent分两类
1、显式意图:直接指明要启动的组件名字
2、隐式意图:筛选启动符合条件的组件,可能有多个。


Activity数据传递
四大组件都要在清单文件中注册
1、直接传递基本数据类型,通过putExtra()方法
2、可以先把数据封装在Bundle中,再把Bundle对象发送出去
3、可以先将数据类实现Serializable接口,再通过putExtra()方法把对象放入intent再发送出去
4、可以先将数据类实现Parcelable接口,接口效率比Serializable高,推荐在android中使用


action,data,type,category,extras,component
注意:startActivity()必须要有一个默认的分类<category 


android:name="android.intent.category.DEFAULT"/>


隐式Intent书写规则
1、action可以是0到多个,只要满足其中一个就可启动
2、category可以是0到多个,只要满足启动一个就可启动
3、data只能是0或1个


国际化
values-zh-rCN
values-en-rUS




9:11 2013-1-25
Android设计了一个解析xml的工具,pull解析,也是事件驱动类型的。
res
--xml 放xml文件
--raw 存放源数据,比图MP3,avi,同样在R文件中生成引用。R.raw.balabala,不能嵌套文件



assets
可以存放源数据,比图MP3,avi,不会再R文件中生成引用,也不会被编译成二进制,且可以嵌


套文件夹
this.getResources.getAssets().open("balabala");


Service概念
等同于Activity,也有独立的生命周期,在后台运行,无法与用户进行交互,在后台可以为其他应用服务


service分两类
1、本地服务,Service是运行在同个进程同个UI线程上,所以Service也不能做耗时的工作,可以在


Service中开启线程来解决耗时的工作
2、远程服务,Service是运行在独立的进程中的。
总结:Service既不是线程也不是进程,它只是一个提供服务的组件而已。
      服务不可能自己会运行,必须由其他组件来运行


本地服务分两种:(属于同一个进程中,(在同一个应用程序))
1、StartService,StopService
   创建本地服务步骤:
1、创建一个类去继承Service
2、在清单文件中注册
3、调用StartService方法启动服务
生命周期:onCreate(创建时执行一次) --onStartCommand(执行多次)--onDestroy()


   通过StartService来启动服务,启动的窗体和服务没有太多联系,不能跟服务进行数据通信


Thread和Service的区别?
当1个Activity启动了一个线程,当Activity关闭后再打开,新打开的Activity无法持有前一个线程的应



而服务是全局的,所以多个Activity都可以管理服务,服务只有一份,它内部持有了线程,所以我们可以


间接地通过服务来管理线程


2、BindService,UnbindService(绑定式服务)
特点:启动者和Service进行绑定,启动者销毁了,Service也就销毁了,它可以通过onBind方法


的返回对象来进行与Servcie之间进行通信。
oncreate(执行一次) --onBind()方法(一次),就会进行连接,执行OnServiceConnected方法
UnbindService:onbind--onDestroy


进程间aidl通信
1、创建aidl文件,类似于接口,以.aidl扩展名结尾。它会由Eclipse自动帮你产生一个对象,这个对象


就是我们调用onBind方法所要传输到客户端的对象。这个对象实现了aidl文件中的接口。




9:20 2013-1-28
broadCastReceiver
它也有独立的生命周期,每次启动时候都会重新创建对象,执行onReceiver方法,执行完销毁。所以在内


部也不能做耗时的的操作。系统规定BroadCastReceiver内部操作耗时不能超过10秒,否则也会报ANR,UI


线程不能超过5秒。它是全局的。


创建广播的步骤
1、创建一个类继承BroadcastReceiver
2、注册BroadcastReceiver
3、根据意图发送广播


广播主要分两类
1、普通广播
2、有序广播


广播注册有两种方式
1、在xml文件中配置(它一旦注册了就无法取消,永久性的存在)
2、用java代码来书写(可以随时通过代码来解除广播       )


9:11 2013-1-29
5个存储
sharedpreferences
internal storage
external storage
sqlite database
network storage


1、sharedpreferences(创建的时候不用加扩展名,默认就是xml文件)
    保存方式为xml文件,保存在data/data/应用程序安装目录/shared-preference文件夹下。只有调用


commit方法才会写入数据,主要用来保存app的一些配置信息,比如游戏难度。


2、内存储
    FileOutputStream fos = 上下文.openFileOutp("文件名", "权限");
    权限:
    MODE_PRIVATE: 私有的,此文件只能被本应用访问,默认是覆盖
    MODE_APPEND: 此文件的内容是追加
    MODE_WORLD_READABLE: 创建的文件可以让外部应用读
    MODE_WORLD_WRITEABLE: 创建的文件可以让外部应用写
    我们可以通过加号"+"把多个权限累加使用
    
    注意:读取其他应用程序的文件,必须先获得其他应用的上下文环境,得到了上下文环境才能操作其


内部的资源
    createPackageContext("其他应用程序的包名", Context.CONTEXT_IGNORE_SECURITY);


Android操作sqlite
    1、创建一个类继承SQLiteOpenHelper,这是一个数据库辅助类,主要用来创建数据库和调用


onCreate方法创建表
    2、创建数据库操作对象,通过SQLiteOpenHelper对象来调用getReadableDatabase(或


getWriteableDatabase)来产生SQLiteDatabase对象,这个创建出来的对象就代表了数据库,它内部提供


了多个方法来进行数据库操作,最常用的execSQL来执行增删改,rawQuery来执行查询语句
 * getReadableDatabase:当磁盘满的时候会以只读的方式打开数据库
 * getWriteableDatabase:当磁盘满的时候打开就会出错
    3、创建测试类来测试每个业务方法是否正确
    Android中如何创建单元测试?
    <!-- 指明测试工具对象来测试具体哪个应用程序  -->
<instrumentation android:name="android.test.InstrumentationTestRunner"
   android:targetPackage="com.sqlite.example" />
    <!-- 导入系统测试库 -->
    <application>
        <uses-library android:name="android.test.runner"/>
    </application>

原创粉丝点击