天天看点

大话企业级android读书笔记(二)

Android的四大组件

android的管理员:Activity

用户想在屏幕上做什么,怎么处理用户做出不同的操作都由该Activity来管理和调度。

所有有用户操作类都必须继承自Activity

比如想处理按键按下事件

@Override

public boolean onKeyDown(int keyCode,KeyEvent event){

  //处理按键按下事件

}

如果一个活动被暂停或停止,系统可以将它从内存移除,通过要求它结束(通过调用它的finish()方法),或简单地杀掉它的进程。当它再次显示给用户时,必须要完全重新启动和恢复到之前的状态。随着活动从一个状态转为另一个状态,通过调用下面的受保护的方法通知该改变:

void onCreate(Bundle saveInstanceState)

void onStart()

void onRestart()

void onResume()

void onPause()

void onStop()

void onDestroy()

所有这些方法都是钩子,你可以重写当状态改变时做适当的工作。所有的活动必须要实现onCreate()去做一些初始化的设置,当对象第一次实例化的时候。很多活动也会实现onPause()去提交数据修改或准备停止与用户交互。

将他们合并在一起,这七个方法定义了活动的整个生命周期。有三个嵌套的循环,你可以通过这七个方法监视:

活动的整个生命时间,从第一次调用onCreate()开始直到调用onDestroy()结束。一个活动在onCreate()中做所有的“全局”状态的初始设置,在onDestroy()中释放所有保留的资源。举例来说,有一个线程运行在后台从网络上下载数据,它可能会在onCreate()中创建线程,在onDestroy()中结束线程。

活动的可视生命时间,从调用onStart()到相应的调用onStop() 。在这期间,用户可以在屏幕上看见活动,虽然它可能不是运行在前台且与用户交互。在这两个方法之间,你可以保持显示活动所需要的资源。举例来说,你可以在onStart()中注册一个广播接收者监视影响你的UI的改变,在onStop() 中注销。因为活动在可视和隐藏之间来回切换,onStart()和onStop()  可以调用多次。

活动的前台生命时间,从调用onResume()到相应的调用onPause()。在这期间,频繁地在重用和暂停状态转换——例如,当设备进入睡眠状态或一个新的活动启动时调用onPause(),当一个活动返回或一个新的意图被传输时调用onResume()。因此,这两个方法的代码应当是相当轻量级的。

下面这个图解释了这三个循环和状态之间状态的可能路径。着色的椭圆表示活动的主要状态,矩形表示当活动在状态之间转换时你可以执行的回调方法。

大话企业级android读书笔记(二)

图1、活动生命周期(来源:Android SDK)

下面的表格对每个方法更详细的描述和在活动的整个生命周期中的定位。

大话企业级android读书笔记(二)
大话企业级android读书笔记(二)

注意上面表格的Killable列,它表示当方法返回时没有执行活动的其它代码,系统是否能杀死活动寄宿的进程。三个方法(onPause()、onStop()、onDestroy())标记为Yes。因为onPause()是唯一一个保证在进程被杀之前会调用的,因此你应该使用onPause()来写任何持久化存储数据。

被标记为No的方法保护活动寄宿的进程在他们调用的时候不会被杀掉。因此活动是可杀掉状态,例如onPause()返回到onResume()调用期间。直到onPause()再次返回,活动是不可杀掉的。其实,没有标记为Killable的活动也是可以系统被杀掉的,不过这仅仅发生在极端困难的情况下,没有有任何其他资源可用。

1.通过intent来传递:

  A.传字符等:activity1中设置:

  Java代码

  String text = "hello";

  Intent intent1 = new Intent(ActivityMain.this, Activity2.class);

  intent1.putExtra("activity1", text);

  startActivity(intent1 );

  B.传对象,对象要实例化,继承Serializable

  Bundle mbundle=new Bundle(); mbundle.putSerializable("user",userList.get(position));

  Intent in =new Intent (getApplicationContext(), activity2.class);

  in.putExtras(mbundle);

  startActivity(in);

  activity2中接收:

  A:接收

  Bundle extras = getIntent().getExtras();

  if (extras != null) {

  textview.setText(extras.getString("activity1"));

  }

  B.接收

  Bundle bundel = getIntent().getExtras();

  user= (User) bundel.get("user");

  2.SharedPreferences

  我在activity1中设置的如下:

  SharedPreferences sp =getSharedPreferences("textinfo",0);

  Editor editor=sp.edit();

  editor.putString("text", text);

  editor.commit(); Intent i = new Intent(getApplicationContext(),activity2.class);

  startActivity(i);

  editor.commit();

  Intent i = new Intent(getApplicationContext(),activity2.class);

  跳转到Message的activity,获取内容如下

  SharedPreferences share=getSharedPreferences("textinfo",0);

  String text =share.getString("text", null);

  msgtextview.setText(text);

android的邮递员:Intent

Android基本设计理念是鼓励减少组件间的耦合,因此Android提供了Intent(意图),Intent提供了一种通用的消息系统,它允许在你的应用程序与其它的应用程序间传递Intent来执行动作和产生事件。

用于多个Activity之间互相传递数据。

android的隐形管理员:Service

Service从字面上理解即为“服务”,这里与windows中的服务有点类似。

Service是在后台运行的,没有交互的界面

使用Service的好处是可以同时运行多个任务,而Activity只能运行一个可交互的界面。

startService()和bindService()的区别:startService(),Service是通过接收Intent经历onCreate()和onStart(),当用户在发出意图使之销毁时会经历onDestory(),而bindService()方式启动,在与Activity绑定的时候,会经历onCreate()和onBind()而当Activity被销毁的时候,Service会先调用onUnbind(),然后是onDestory().

android的接收员:BroadcastReceiver

广播接收者用于异步接收广播Intent

广播接收者没有界面,但是接收到消息后可以启动一个Activity,或者可以使用NotifcationManager来通知用户。

继续阅读