前段时间有 一个朋友问我该怎么学Android 或者是Java,我告诉他网上有很多教程啊,视频什么的可以去看看,但是他说,很多视频教程什么的基本都是些片段,很少有完整的教程,就算有也是各大培训机构发出来的不是特别完善的教学视频录像,所以我就在想,给广大Android爱好者发发教程也不错的。。虽然在下也只是在Android这片大海中初涉,但总归带入门还是可以的吧。。接下来我会每周进行一次教程,请大家多多关照。
第一章 从基础出发
众所周知,Android的基础其实就是Java,所以在进行Android开发之前,我建议先把Java的基础打扎实再进行Android开发,这里我们就不再赘述java的基础了,好了,说了那么多我们开始讲讲Android开发吧。
首先,我们得清楚Android的四大组件分别是Activity、Service、Broadcast Receiver、Content Provider。五大布局则是:FrameLayout(框架布局),LinearLayout (线性布局),AbsoluteLayout(绝对布局),RelativeLayout(相对布局),TableLayout(表格布局)。
Activity
Activity是Android应用与用户之间建立连接的桥梁,展现在用户面前界面都是以Activity为载体,其中运载着各种按钮、菜单、列表、文字描述等等控件,做为一个占据窗口的组建,它需要做很多的持久化事情,并做好生命周期的管理以及跳转处理。Activity本身是没有界面的,需要使用setContentView(View)接口把界面设置金Activity中,同时Activity也是单独的,用于处理用户的操作,几乎所有的Activity都要和用户打交道,所以Activity在Android开发中的位置至关重要。
同时你要对Activity的生命周期做了解,因为在开发中你肯定会用到Activity的生命周期管理:
public class Activity extends ApplicationContext {
protected void onCreate(Bundle savedInstanceState);
protected void onStart();
protected void onRestart();
protected void onResume();
protected void onPause();
protected void onStop();
protected void onDestroy();
}
由上图可见,Activity中启动方法的调用顺序为onCreate -> onStart -> onResume,在Activity被Kill掉的过程中的方法调用顺序为onPause -> onStop -> onDestroy,这个就是一个完整的Activity生命周期,那么中途中断了怎么办呢?比如中途来了一个电话,手机进入休眠等情况时会调用onPause -> onStop,在恢复到Activity时则是onStart -> onResume,如果当前应用程序的是一个Theme为Translucent(半透明) 或者Dialog 的Activity那么中断就是onPause ,恢复的时候onResume。
至于”Other app need memory”,则是因为系统需要保证手机的一些基本功能的正常使用,在来短信、来电话等情况时,就会中断你的程序,当然,系统也不会允许你占用太多资源,当资源不足以保证系统的基本功能时就会kill掉你的程序,这个我们俗称Om。
方法在系统中的作用及我们应该做什么:
onCreate:在这里创建界面,做一些数据的初始化工作;
onStart: 到这一步变成“用户可见不可交互”的状态;
onResume:变成和用户可交互的,(在Activity栈系统通过栈的方式管理这些Activity,即当前Activity在栈的最上端,运行完弹出栈,则回到上一个Activity);
onPause:到这一步是可见但不可交互的,系统会停止动画等消耗CPU的事情。从上文的描述已经知道,应该在这里保存你的一些数据,因为这个时候你的程序的优先级降 低,有可能被系统收回。在这里保存的数据,应该在onResume里读出来。
onStop:变得不可见 ,被下一个activity覆盖了
onDestroy:这是Activity被kill前最后一个被调用方法了,可能是其他类调用finish方法或者是系统为了节省空间将它暂时性的干掉,可以用isFinishing()来判断它,如果你有一个Progress Dialog在线程中运行,请在onDestroy里把他cancel掉,不然等线程结束的时候,调用Dialog的cancel方法会抛异常。
onPause,onstop, onDestroy,三种状态下 activity都有可能被系统kill 掉。
Activity之间的通信
多个Activity可能运行在一个进程能,也可能运行在多个进程中,那么它们之间的通信是怎么样的呢?在Android机制中,我们使用Intent类来进行Activity之间的通信,而这个Intent就像是一封邮件,它可以向另外一个Activity发送消息,这个消息中包含消息的目的地以及内容,在Intent中目的地是必须的,而内容则是可选的。
Intent负责对操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。
在应用中,我们可以以两种形式来使用Intent:
直接Intent:指定了component属性的Intent(调用setComponent(ComponentName)或者setClass(Context, Class)来指定)。通过指定具体的组件类,通知应用启动对应的组件。
间接Intent:没有指定comonent属性的Intent。这些Intent需要包含足够的信息,这样系统才能根据这些信息,在在所有的可用组件中,确定满足此Intent的组件。
对于直接Intent,Android不需要去做解析,因为目标组件已经很明确。
Android需要解析的是那些间接Intent,通过解析,将 Intent映射给可以处理此Intent的Activity、IntentReceiver或Service。Intent解析机制主要是通过查找已注册在AndroidManifest.xml中的所有IntentFilter及其中定义的Intent,最终找到匹配的Intent。
四、Activity 的 Intent Filter
Intent Filter 描述了一个组件愿意接收什么样的 Intent 对象,Android 将其抽象为 android.content.IntentFilter 类。在 Android 的 AndroidManifest.xml 配置文件中可以通过节点为一个 Activity 指定其 Intent Filter,以便告诉系统该 Activity 可以响应什么类型的 Intent。
当使用 startActivity(intent) 来启动另外一个 Activity 时,如果直接指定 intent 对象的 Component 属性,那么 Activity Manager 将试图启动其 Component 属性指定的 Activity。否则 Android 将通过 Intent 的其它属性从安装在系统中的所有 Activity 中查找与之最匹配的一个启动,如果没有找到合适的 Activity,应用程序会得到一个系统抛出的异常。这个匹配的过程如下:
五、Activity的栈式管理
Android针对Activity的管理使用的是栈,就是说某一个时刻只有一个Activity处在栈顶,当这个Activity被销毁后,下面的Activity才有可能浮到栈顶,或者有一个新的Activity被创建出来,则旧的Activity就被压栈沉下去了。Activity是Android程序的表现层。程序的每一个显示屏幕就是一个Activity。正在运行的Activity处在栈的最顶端,它是运行状态的。
当在程序中调用 Activity.finish()方法时,结果和用户按下 BACK 键一样:它告诉 Activity Manager该Activity实例可以被“回收”。随后 Activity Manager 激活处于栈第二层的 Activity ,把原 Activity 压入到栈的第二层,从 Running 状态转到 Paused 状态。
六、Activity的加载模式
standard、singleTop、singleTask、singleInstance(其中前两个是一组、后两个是一组),默认为standard
standard:就是intent将发送给新的实例,所以每次跳转都会生成新的activity。
singleTop:也是发送新的实例,但不同standard的一点是,在请求的Activity正好位于栈顶时(配置成singleTop的Activity),不会构造新的实例
singleTask:和后面的singleInstance都只创建一个实例,当intent到来,需要创建设置为singleTask的Activity的时候,系统会检查栈里面是否已经有该Activity的实例。如果有直接将intent发送给它。
singleInstance:
首先说明一下task这个概念,Task可以认为是一个栈,可放入多个Activity。比如启动一个应用,那么Android就创建了一个Task,然后启动这个应用的入口Activity,那在它的界面上调用其他的Activity也只是在这个task里面。那如果在多个task中共享一个Activity的话怎么办呢。举个例来说,如果开启一个导游服务类的应用程序,里面有个Activity是开启GOOGLE地图的,当按下home键退回到主菜单又启动GOOGLE地图的应用时,显示的就是刚才的地图,实际上是同一个Activity,实际上这就引入了singleInstance。singleInstance模式就是将该Activity单独放入一个栈中,这样这个栈中只有这一个Activity,不同应用的intent都由这个Activity接收和展示,这样就做到了共享。当然前提是这些应用都没有被销毁,所以刚才是按下的HOME键,如果按下了返回键,则无效。
七、Activity的跳转
Activity跳转,无返回结果
这是最简单的Activity跳转方式。从一个Activity启动另一个Activity,直接startActivity(new Intent(当前Activity.this, 下一Activity.class))。
Activity跳转,返回数据/结果
需要返回数据或结果的,则使用startActivityForResult (Intent intent, int requestCode),requestCode的值是自定义的,用于识别跳转的目标Activity。跳转的目标Activity所要做的就是返回数据/结果,setResult(int resultCode)只返回结果不带数据,或者setResult(int resultCode, Intent data)两者都返回!而接收返回的数据/结果的处理函数是onActivityResult(int requestCode, int resultCode, Intent data),这里的requestCode就是startActivityForResult的requestCode,resultCode就是setResult里面的resultCode,返回的数据在data里面。
好了,今天就总结到这儿吧,下次更新会对Service进行整理,大家多多关注哦。