Android学习之路--四大组件--Activity

四大组件


一 、Activity

      Android开发中,我们用的东西往往离不开这四个家伙,因为他们在设计之初就是在考虑类似MVC模式开发模式设计的。我们先来学习下最常见的,HelloWorld的出生地就是大名鼎鼎的Activity。我们在这里先介绍些生命周期、屏幕翻转的东西。

      · 生命周期

      Activity,我们在第一眼看到HelloWorld的时候,它其实是做了很多功课的,初始化了一大堆的东西,这些我们现在暂时不用管,以后我们在讲,现在我们管的就是正确的看到HelloWorld就行,但是Activity自身它也有自己的生命周期。按照谷歌官方解释,看下图:

这其实是很全面的了,但我们还是要结合实际,如果您的English是在2级半(拼音)的话,那我们还是在手机上真枪实战一下吧,具体看看它的生命周期是怎么走的。
程序很简单。就是写出各大生命周期,然后打印日志。

public class TestActivity extends Activity{
    private String tag =TestActivity.class.getSimpleName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test);
        Log.i(tag,"oncreate");
        TextView tv = (TextView) findViewById(R.id.tv);
        tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(TestActivity.this,       TestListActivity.class));
            }
        });
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.i(tag,"onstart");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i(tag,"onresume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i(tag,"onparse");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.i(tag,"onstop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i(tag,"ondestory");
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.i(tag,"onSaveInstanceState");
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        Log.i(tag,"onRestoreInstanceState");
    }
}

测试case

1.程序启动,就是点击应用图标后,

.599 1811-1811/com.android.app I/TestActivity: oncreate
.603 1811-1811/com.android.app I/TestActivity: onstart
.603 1811-1811/com.android.app I/TestActivity: onresume

2.跳转到其他页面

.920 5589-5589/com.android.app I/TestActivity: onparse
.478 5589-5589/com.android.app I/TestActivity: onSaveInstanceState
.478 5589-5589/com.android.app I/TestActivity: onstop

3.跳转后在回到当前页面

.149 5589-5589/com.android.app I/TestActivity: onstart
.149 5589-5589/com.android.app I/TestActivity: onresume

4.按Home键

.003 5589-5589/com.android.app I/TestActivity: onparse
.005 5589-5589/com.android.app I/TestActivity:onSaveInstanceState
.005 5589-5589/com.android.app I/TestActivity: onstop

5.按Home后在回来

.399 5589-5589/com.android.app I/TestActivity: onstart
.399 5589-5589/com.android.app I/TestActivity: onresume

6.按back键退出程序

.669 31873-31873/com.android.app I/TestActivity: onparse
.136 5589-5589/com.android.app I/TestActivity: onstop
.136 5589-5589/com.android.app I/TestActivity: ondestory

在这里我们有俩个谷歌里没有添加的俩个方法,onSaveInstanceState和onRestoreInstanceState。这俩个方法是在内存不够时,程序被回收时执行onSaveInstanceState,然后在进入程序执行的onRestoreInstanceState的方法。当我们的设备内存不够时,我们可以在这里(Bundle)保存一些重要的信息,然后程序重新进入时,最初的oncreate方法里Bundle里就不为空了,就可以恢复些之前的数据,比如说列表滑到哪了,tab在原来的第几个啦等等。


      · 屏幕翻转
      安卓屏幕翻转就是在打开应用后屏幕在横屏、竖屏之间来回切换,在切换后,Activity的生命周期也是要变换的。
程序还是之前的程序,我们直接转换屏幕即可。

测试模拟器API:23,设备6.0。
测试case1:manifest中啥也不设置。

1.竖屏切横屏

.111 1742-1742/com.android.app I/TestActivity: onparse
.112 1742-1742/com.android.app I/TestActivity:onSaveInstanceState
.112 1742-1742/com.android.app I/TestActivity: onstop
.112 1742-1742/com.android.app I/TestActivity: ondestory

.124 1742-1742/com.android.app I/TestActivity: oncreate
.124 1742-1742/com.android.app I/TestActivity: onstart
.124 1742-1742/com.android.app I/TestActivity: onRestoreInstanceState
.125 1742-1742/com.android.app I/TestActivity: onresume

我们看到,当竖屏切横屏时,之前创建的Activity进行了销毁,但是在销毁之前,进行了数据的保存。在重新创建了一个新的Activity,但是新创建的Activity后,Bundle中是含有之前的保存数据的,而且也是调用了onRestoreInstanceState方法,我们可以在新开启的Activity中进行数据的同步,比如歌曲听到哪了,视频看到哪个进度了等等。

2.横屏切竖屏

.634 1742-1742/com.android.app I/TestActivity: onparse
.634 1742-1742/com.android.app I/TestActivity: onSaveInstanceState
.634 1742-1742/com.android.app I/TestActivity: onstop
.634 1742-1742/com.android.app I/TestActivity: ondestory
.658 1742-1742/com.android.app I/TestActivity: oncreate
.659 1742-1742/com.android.app I/TestActivity: onstart
.659 1742-1742/com.android.app I/TestActivity: onRestoreInstanceState
.659 1742-1742/com.android.app I/TestActivity: onresume

我们看到在安卓6.0上面生命周期也是执行一次销毁,一次创建,而在安卓2.3设备中,其生命周期会走俩次创建。

测试case 2 :manifest中增加configuration

<activity android:name=".TestActivity" android:configChanges="orientation">
 ···
</activity>

在进行以上的流程切换,发现其生命流程是一样的。都是创建一次。

测试case 3 :manifest中在增加一些参数

<activity android:name=".TestActivity" android:configChanges="orientation||keyboardHidden|screenSize">
 ···
</activity

这时,我们在TestActivity中增加一个方法:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    Log.i(tag,"onConfigurationChanged");
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
       Log.i(tag,"landscape");
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
       Log.i(tag,"portarit");
   }
}

我们进行竖屏切横屏是,只会走:

.400 23390-23390/com.android.app I/TestActivity: onConfigurationChanged
.400 23390-23390/com.android.app I/TestActivity: landscape

这俩个方法,Activity都没有创建。都是用的同一个,只不过就调用了onConfigChange这个方法.

横屏切竖屏:

.323 23390-23390/com.android.app I/TestActivity: onConfigurationChanged
.323 23390-23390/com.android.app I/TestActivity: portarit

注意:

  • Activity中的组件都是在UI线程中进行管理的,我们要修改这些组件的某些值也只能在UI线程中进行修改,否则会报如下错误:
    android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

至此,Activity的一些知识我们学完了。代码最好都自己敲一遍,看十遍不如自己敲一行,这样便于我们更好的理解与记忆。大家如果有什么问题,欢迎交流,码字辛苦,尊重原创!谢谢各位。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值