什么是Activity?

Activity是Android组件中最基本也是最为常见用的四大组件(Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器)之一。也是一个view的容器。需要强调的是Activity本身不是界面,但它的主要功能是提供界面,用户可以用来交互为了完成某项任务。Activity中所有操作都与用户密切相关,是一个负责与用户交互的组件,可以通过setContentView(View)来显示指定控件。在一个android应用中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。Activity之间通过Intent进行通信。(Intent方面请看另一篇博客《Android Intent的使用》)

要想正确的使用Activity,就需要知道Activity的生命周期。

Activity的生命周期:

这里有三个比较关键的生命周期。

  • 从最初调用onCreate(Bundle)到最终调用onDestroy()称为完整生命周期。Activity会在onCreate()进行所有“全局”状态的设置,在onDestroy()中释放所有持有的资源。举个例子,如果它有一个从网络上下载数据的后台线程,那他可能就会在onCreate()中创建这个线程并在onDestroy()中停止这个线程。
  • 从activity调用onStart()开始,到调用对应的onStop()为止称为可见生命周期。在这段时间内用户可以在屏幕上看到这个activity,尽管并不一定是在前景也不一定可以和用户交互。在这两个方法之间你可以维护那些activity在用户显示时所需的资源。举个例子来说,你可以在onStart()中注册一个IntentReceiver来监控那些可以对你的UI产生影响的环境改变,当你的UI不继续在用户面前显示时你可以在onStop()中注销这个IntentReceiver。每当activity在用户面前显示或者隐藏时都会调用相应的方法,所以onStart()和onStop()方法在整个生命周期中可以多次被调用。
  • 从activity调用onResume()开始,到调用对应的onPause()为止称为前景生命周期,这段时间activity处于其他所有activity的前面,且与用户交互。一个activity可以经常在resumed和paused状态之间转换——例如手机进入休眠时、activity的结果返回时、新的intent到来时——所以这两个方法中的代码应该非常的简短。

下面用一个例子来感受一下Activity的生命周期:

需要两个Activity:MainActivity和test1。

MainActivity:(注释为该方法中常见的操作)

public class MainActivity extends Activity {    // 初始化操作    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        System.out.println("onCreate");        Button btn1 = (Button) findViewById(R.id.btn1);        btn1.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                Intent intent = new Intent(MainActivity.this, test1.class);                startActivity(intent);                            }        });    }    // 对资源进行回收    @Override    protected void onDestroy() {        System.out.println("onDestroy");        super.onDestroy();    }    // 注册一些监听(内容观察者)    @Override    protected void onStart() {        System.out.println("onStart");        super.onStart();    }    @Override    protected void onRestart() {        System.out.println("onRestart");        super.onRestart();    }    // 再次对数据进行查询    @Override    protected void onResume() {        System.out.println("onResume");        super.onResume();    }    // 数据的临时保存    @Override    protected void onPause() {        System.out.println("onPause");        super.onPause();    }    // 取消监听    @Override    protected void onStop() {        System.out.println("onStop");        super.onStop();    }}

test1.java:

public class test1 extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.test1);        System.out.println("onCreate1");        Button btn = (Button) findViewById(R.id.test1_btn);        btn.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                // 数据是使用Intent返回                Intent intent = new Intent(test1.this,MainActivity.class); // 把返回数据存入Intent                startActivity(intent);                test1.this.finish();            }        });    }    @Override    protected void onDestroy() {        System.out.println("onDestroy1");        super.onDestroy();    }    @Override    protected void onStart() {        System.out.println("onStart1");        super.onStart();    }    @Override    protected void onRestart() {        System.out.println("onRestart1");        super.onRestart();    }    @Override    protected void onResume() {        System.out.println("onResume1");        super.onResume();    }    @Override    protected void onPause() {        System.out.println("onPause1");        super.onPause();    }    @Override    protected void onStop() {        System.out.println("onStop1");        super.onStop();    }}

布局文件就不展示了。
运行程序,当前为默认的MainActivity。输出如下:

然后点击MainActivity中的button跳转至test1,输出如下:

最后再点击test1中的button按钮,输出如下:

这下,通过示例应该比较好理解了吧。

Activity横竖屏的切换(Ctrl+F12)

横竖屏切换的时候:
竖屏到横屏:activity首先被销毁,在创建一个新的activity
横屏到竖屏:activity首先被销毁,再创建一个新的activity,再把该activity销毁,再创建一个新的activity.(是由于输入法的影响)

Activity栈:

Android 是通过一种 Activity 栈的方式来管理 Activity 的,一个 Activity 的实例的状态决定它在栈中的位置。处于前台的 Activity 总是在栈的顶端,当前台的 Activity 因为异常或其它原因被销毁时,处于栈第二层的 Activity 将被激活,上浮到栈顶。当新的 Activity 启动入栈时,原 Activity 会被压入到栈的第二层。一个 Activity 在栈中的位置变化反映了它在不同状态间的转换。(通俗来讲:task的作用就是用来管理Activity的进入,退出。记录了用户的行为。栈顶的Activity是与用户交互的Activity。)Activity 的状态与它在栈中的位置关系如下图所示:

如上所示,除了最顶层即处在 Active 状态的 Activity 外,其它的 Activity 都有可能在系统内存不足时被回收,一个 Activity 的实例越是处在栈的底层,它被系统回收的可能性越大。系统负责管理栈中 Activity 的实例,它根据 Activity 所处的状态来改变其在栈中的位置。

Activity的四种启动模式: (需要在清单文件中配置)

  1. 标准模式(默认):启动一个Activity就会创建一个新的实例。
  2. singleTop:如果要启动的Activity已经在该任务栈栈顶,会重用栈顶的Activity,并且会调用Activity里面的一个方法:onNewIntent();(浏览器的书签就是采用的这个模式,可以增强用户体验)
  3. singleTask:如果要启动的Activity已经在任务栈里面。会清空这个Activity上面所有的Activity,再重用这个Activity。
  4. singleInstance:这样的Activity会占据一个单独的任务栈。如果去启动的时候发现我们的任务栈中已经有了一个引用,就断开之前的引用。(通话界面:InCallScreen 保证只有一个实例存在)

标准模式就不介绍了,简单的介绍一下其他模式:(a代表AActivity,b代表BActivity)
singleTop:我从a跳转到b,再从b跳转到b,最后从b跳转到a。(标准模式的话Activity栈中会有4个Activity,也就是按返回键需要按4次才能退出)此时,按返回键需要按3次,一次从a到b,第二次从b到a,第三次从a退出程序。

singleTask:我从a跳转到b,再从b跳转到a,最后从a跳转到b。(标准模式的话Activity栈中会有4个Activity,也就是按返回键需要按4次才能退出)此时,按返回键需要按2次,一次从b到a,第二次从a退出程序。

singleInstance:这个不太好说啊~上图吧。

注意:

需要在清单文件中进行配置,例如配置标准模式:

<activity android:name="com.topcsa.test_android.test1"            android:launchMode="standard">

以下部分摘自:http://ant-qingyun27sc.iteye.com/blog/1591682

此外,假设有两个Activity,分别是MainActivity,SecondActivity。MainActivity有一个EditText编辑框,设想一种情况:当我们编辑了一些内容时,MainActivity被跳转去了econdActivity,而正好系统又将MainActivity杀死,如果我们不对EditText的内容加以保存,当系统再度恢复MainActivity时,编辑好的内容就不会出现了。

这种情况可以借助onSaveInstanceState方法来保存Acitivity状态。

 1 public class MainActivity extends Activity { 2     private final static String KEY="key"; 3     private EditText et; 4     private Button btn; 5  6     @Override 7     protected void onCreate(Bundle savedInstanceState) { 8         super.onCreate(savedInstanceState); 9         setContentView(R.layout.main);10         et = (EditText) findViewById(R.id.et);11         btn = (Button) findViewById(R.id.btn);12         if(savedInstanceState!=null&&savedInstanceState.containsKey(KEY)==true){13             et.setText(savedInstanceState.getString(KEY));14         }15         btn.setOnClickListener(new OnClickListener() {16             17             @Override18             public void onClick(View v) {19                 Intent intent=new Intent();20                 intent.setClass(getApplicationContext(), main2.class);21                 startActivity(intent);22                 23             }24         });25     }26     27     28     @Override29     protected void onSaveInstanceState(Bundle outState) {30         // TODO Auto-generated method stub31         super.onSaveInstanceState(outState);32         String content=et.getText().toString();//将EditText的内容保存到Bundle中,以便下次恢复Activity时读取  33         outState.putString(KEY, content);34     }35 36 }
View Code

更多相关文章

  1. android binder 进程间通信机制4-Service Manager
  2. Android(安卓)MediaPlayer 分析 - service端文件结构
  3. Android调用系统分享功能总结
  4. Android系统版本变迁
  5. android按back键退出程序时,实现“再按一次退出”的功能
  6. 利用FRIDA攻击Android应用程序(三)
  7. xe5 android 调用照相机获取拍的照片
  8. Android(安卓)wifi打开流程(Android(安卓)O)
  9. Android中Activity的生命周期探讨

随机推荐

  1. linaro pandaboard android 编译kernel
  2. 手把手叫你用android 调研web services
  3. 【Android 基础7.1 7.2】AsyncTask & Asy
  4. android Draw
  5. Android Interface Definition Language
  6. Android的Face++Demo错误1302
  7. android CrashHandler
  8. Android(安卓)保存图片到本地
  9. android 错误记录
  10. Android 升级Android X 所需要替换的包(二