1. Android程序的基本组织结构:
1) src: src目录是放置我们所有Java代码的地方
2) gen: 自动生成的,主要有R.java,项目中添加的任何资源都会在其中生成一个相应的资源id。(注意不要手动修改)
3) assets:用的不多,主要存放随程序打包的文件,程序在运行的时候可以动态读取这些文件内容。
4) bin:主要包含编译时产生的文件,其中有一个编译好的apk文件。
5) libs:主要包含第三方jar包
6) res:资源文件夹,项目中使用到的所有图片、布局、字符串等资源都要存放在这个目录下,,前面提到的R.java中的内容也是根据这个目录下的文件自动生成的。当然这个目录下还有很多的子目录,图片放在drawable目录下,布局放在layout目录下,字符串放在values目录下。
7) AndroidManifest.xml: 整个Android项目的配置文件,你在程序中定义的所有四大组件都需要在这个文件里注册。另外还可以在这个文件中给应用程序添加权限声明,也可以重新指定你创建项目时指定的程序最低兼容版本和目标版本。
8) project.properties:通过一行代码指定了编译程序时所使用的SDK版本。
2. Android日志工具LogCat: Log.v(); Log.d(); Log.i();Log.w(); Log.e();依次分别为:verbose,debug, information, warning, error。另外,还可以为log工具添加过滤器。
Activity:
1. 如果你需要在XML中引用一个id,就使用@id/id_name这种语法,而如果你需要在XML中定义一个id,则要使用@+id/id_name这种语法。
2. 创建活动的步骤:
1) 新建活动类,继承自Activity
2) 添加xml布局文件
3) 活动注册:所有活动必须在AndroidManifest.xml中注册,给主活动指定的label不仅会成为标题栏中的内容,还会成为启动器(Launcher)中应用程序显示的名称。之后在<activity>标签的内部我们加入了<intent-filter>标签,并在这个标签里添加了<actionandroid:name="android.intent.action.MAIN"/>和<category android:name ="android.intent.category.LAUNCHER" /> 这两句声明,这样这个活动将成为主活动,在点击桌面应用程序的时候首先打开的就是这个活动。如果程序中没有声明任何主活动,程序仍然正常安装,但是无法再启动器中看到或者打开该程序。
3. 隐藏标题栏:requestWindowFeature(Window.FEATURE_NO_TITLE)的意思就是不在活动中显示标题栏,注意这句代码一定要在setContentView()之前执行,不然会报错
4. 在活动中使用Toast:Android系统提供的一种非常好的提醒方式,在程序中可以使用它将一些短小的信息通知给用户,在一段时间后自动消失。findViewById()方法返回的是一个View对象,我们需要向下转型将它转成Button对象。
5. 在活动中使用menu:
1) 在res中添加menu资源
2) 在活动中重写onCreateOptionsMenu()方法
3) 响应菜单事件:重写onOptionsItemSelected()方法
6. 销毁一个活动:利用Activity中的finish()方法
7. Intent是android程序中个组件之间进行交互的重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。Intent一般可被用于启动活动、启动服务、以及发送广播等场景。显式intent:
1) Intent(Context packageContext, Class<?>cls) 这个构造函数接收两个参数,第一个参数Context要求提供一个启动活动的上下文,第二个参数Class则是指定想要启动的目标活动。
2) Activity类中提供了一个startActivity()方法,这个方法是专门用于启动活动的,它接收一个Intent参数
8. 隐式Intent:它并不明确指出我们想要启动哪一个活动,而是指定了一系列更为抽象的action和category等信息。只有<action>和<category>中的内容同时能够匹配上Intent中指定的action和category时,这个活动才能响应该Intent,android.intent.category.DEFAULT是一种默认的category,在调用startActivity()方法的时候会自动将这个category添加到Intent中。每个Intent中只能指定一个action,但却能指定多个category,在xml文件中指定category,并在调用的时候添加categpry语句:intent.addCategory("com.example.activitytest.MY_CATEGORY");
9. 使用隐式Intent,我们不仅可以启动自己程序内的活动,还可以启动其他程序的活动,这使得Android多个应用程序之间的功能共享成为了可能。Intentintent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("http://www.baidu.com"));setData()接收一个Uri对象,主要用于指定当前Intent正在操作的数据,而这些数据通常都是以字符串的形式传入到Uri.parse()方法中解析产生的。
10. 向下一个活动传递数据:在启动活动时传递数据的思路很简单,Intent中提供了一系列putExtra()方法的重载,可以把我们想要传递的数据暂存在Intent中,启动了另一个活动后,只需要把这些数据再从Intent中取出就可以了。
11. 返回数据给上一个活动:
1) Activity中还有一个startActivityForResult(intent, 1)方法也是用于启动活动的,但这个方法期望在活动销毁的时候能够返回一个结果给上一个活动。请求码只要是一个唯一值就可以了,这里传入了1。
2) 紧接着把要传递的数据存放在Intent中,然后调用了setResult()方法,是专门用于向上一个活动返回数据的。setResult()方法接收两个参数,第一个参数用于向上一个活动返回处理结果,一般只使用RESULT_OK或RESULT_CANCELED这两个值,第二个参数则是把带有数据的Intent传递回去。
3) 使用startActivityForResult()方法来启动SecondActivity的,在SecondActivity被销毁之后会回调上一个活动的onActivityResult()方法,因此我们需要在FirstActivity中重写这个方法来得到返回的数据。onActivityResult()方法带有三个参数,第一个参数requestCode,即我们在启动活动时传入的请求码。第二个参数resultCode,即我们在返回数据时传入的处理结果。第三个参数data,即携带着返回数据的Intent。
4) 如果用户不是通过按钮来返回activity,而是通过back键回到FirstActivity,可以通过重写onBackPressed()方法来解决这个问题。
12. 活动返回栈:Android是使用任务(Task)来管理活动的,一个任务就是一组存放在栈里的活动的集合,这个栈也被称作返回栈(BackStack)。每当我们按下Back键或调用finish()方法去销毁一个活动时,处于栈顶的活动会出栈。
13. 活动的状态:每个活动在生命周期中最多可能会有四种状态:
1) 运行状态:当一个活动位于返回栈的栈顶时,活动处于运行状态
2) 暂停状态:当一个活动不再处于栈顶位置,但仍然可见时,这时活动就进入了暂停状态,处于暂停状态的活动仍然是完全存活着的
3) 停止状态:当一个活动不再处于栈顶位置,并且完全不可见的时候,就进入了停止状态。
4) 销毁状态:当一个活动从返回栈中移除后就变成了销毁状态
14. 活动的生存期:
1) 完整生存期:活动在onCreate()方法和onDestroy()方法之间所经历的,就是完整生存期
2) 可见生存期:活动在onStart()方法和onStop()方法之间所经历的,就是可见生存期。在可见生存期内,活动对于用户总是可见的,即便有可能无法和用户进行交互
3) 前台生存期:活动在onResume()方法和onPause()方法之间所经历的,就是前台生存期。在前台生存期内,活动总是处于运行状态的,此时的活动是可以和用户进行相互的
15. 返回时活动已被回收:其实还是会正常显示活动A的,只不过这时并不会执行onRestart()方法,而是会执行活动A的onCreate()方法,因为活动A在这种情况下会被重新创建一次。
1) Activity中还提供了一个onSaveInstanceState()回调方法,这个方法会保证一定在活动被回收之前调用,因此我们可以通过这个方法来解决活动被回收时临时数据得不到保存到的问题。
2) 在onCreate()方法中把Bundle中的数据取出来
16. Intent还可以结合Bundle一起用于传递数据的,首先可以把需要传递的数据都保存在Bundle对象中,然后再将Bundle对象存放在Intent里。到了目标活动之后先从Intent中取出Bundle,再从Bundle中一一取出数据。
17. 活动的启动模式(可以在androidManifest.xml中修改android:launchMode="singleTop"):
1) standard是活动默认的启动模式,在该模式下,系统不会在乎这个活动是否已经在返回栈中存在,每次启动都会创建该活动的一个新的实例。它就会在返回栈中入栈,并处于栈顶的位置。
2) singleTop模式,在启动活动时如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的活动实例。
3) singleTask模式,每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。
4) singleInstance模式,式,指定为singleInstance模式的活动会启用一个新的返回栈来管理这个活动(其实如果singleTask模式指定了不同的taskAffinity,也会启动一个新的返回栈)
18. List是一个接口,而ListArray是一个类ListArray继承并实现了List。所以List不能被构造,但可以向上面那样为List创建一个引用,而ListArray就可以被构造。为什么要用List list = new ArrayList() ,而不用ArrayList alist = new ArrayList()呢?问题就在于List有多个实现类,现在你用的是ArrayList,也许哪一天你需要换成其它的实现类,如LinkedList或者Vector等等。
19. 随时随地退出程序:新建一个ActivityCollector类作为活动管理器,在活动管理器中,我们通过一个List来暂存活动,然后提供了一个addActivity()方法用于向List中添加一个活动,提供了一个removeActivity()方法用于从List中移除活动,最后提供了一个finishAll()方法用于将List中存储的活动全部都销毁掉。
20. 活动的最佳启动方法:
1)在SecondActivity中添加了一个actionStart()方法
publicstatic void actionStart(Context context, String data1, String data2) {
Intentintent = new Intent(context, SecondActivity.class);
intent.putExtra("param1",data1);
intent.putExtra("param2",data2);
context.startActivity(intent);
}
2)在FristActivity中:SecondActivity.actionStart(FirstActivity.this,"data1", "data2");
摘至《第一行代码》
《疯狂讲义》
详解Intent与intent-filter
1. Intent对象大致包含Component, Action, Category,Data, Type, Extra 和Flag七种属性。其中Component用于明确指定要启动的目标组件,而Extra用于“携带”需要交换的数据。
2. Data和Type的关系,由于Data和Type属性通过<data…/>元素进行声明,而<data…/>的格式如下:<dataandroid:mimType=“”, android:scheme=””…/>,可见Type是Data的子属性。所以Data属性和Type属性的关系比较微妙,这两个属性在Intent进行设置时会相互覆盖,除非使用setDataAndType方法才可以同时设置Data和Type属性。