android四大组件之Activity复习

说在前面

学了android已经几个月了,基础已经学完了,几天不看基础,感觉一些不常用的已经忘了,在学习第三方开源框架时,很多基础用得模模糊糊的,不是很顺心,于是想尝试写博客,来做总结,毕竟基础才是最重要的,顺便做些项目,为了后面好找工作。

Activity

Activity是一个提供给用户交互的组件,我们可以通过它做许多事情,比如打电话,拍照,发邮件,浏览地图等等。每个Activity是提供给用户交互的窗口,这个窗口一般是填充屏幕,但也可能比窗口小,并浮动在其他窗口顶部。在mvc设计模式中一般作为c控制层。

Activity创建

创建一个activity,你必需继承Activity(或子接口)。然后实现里面的回调方法,activity的生命周期有很多回调方法,onCreate是必须实现的,在该回调方法里面,主要用来加载页面布局,初始化页面控件。加载布局调用setContentView方法。activity创建好了,需要在清单文件manifest中注册,代码如下

<manifest ... >
  <application ... >
      <activity android:name=".ExampleActivity" />
      ...
  </application ... >
  ...
</manifest >

如果你想将该activity放在launch列表,和打开应用作为主页面,可以在清单文件中注册如下

<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

Activity之间传递值

activity之间可以通过Intent传递多种类型的值,那么可以那些类型的值了? 实践结果有以下几种:基本数据类型,String, 自定义对象, 数组,ArrayList(可能还有,以后知道再补)。自定义对象需要实现序列化接口。实现自定义对象序列化一般有两种方式。

  • Parcelable
    该接口是在android里面提出的,因此更适合于android平台,它的缺点就是有点麻烦,但是效率很高,parcelable主要用在内存序列化上。

  • Seriaizable
    该接口是java提出的,该接口使用很简单,但效率比parcelable低,该接口主要用在磁盘序列化上,将对象序列化到存储设备中或通过网络传输给其他客户端,可以使用该接口。

activity传值通过intent.putExtra(或其他)传值,也可以通过Bound传递。
activity接受传递的值可以通过getIntent来接受,由于相对简单,就不多说了。

Activity返回值

有时,你想要接受一个你启动的activity的返回值,你可以调用startActivityForResult()方法,然后实现onActivityResult()方法。

官方代码:

private void pickContact() {
    // Create an intent to "pick" a contact, as defined by the content provider URI
    Intent intent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI);
    startActivityForResult(intent, PICK_CONTACT_REQUEST);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // If the request went well (OK) and the request was PICK_CONTACT_REQUEST
    if (resultCode == Activity.RESULT_OK && requestCode == PICK_CONTACT_REQUEST) {
        // Perform a query to the contact's content provider for the contact's name
        Cursor cursor = getContentResolver().query(data.getData(),
        new String[] {Contacts.DISPLAY_NAME}, null, null, null);
        if (cursor.moveToFirst()) { // True if the cursor is not empty
            int columnIndex = cursor.getColumnIndex(Contacts.DISPLAY_NAME);
            String name = cursor.getString(columnIndex);
            // Do something with the selected contact's name...
        }
    }
}

这里提下activity启动方式有两种:
startActivity(显示意图,隐式意图) startActivityForResult

生命周期

Activity生命周期管理是靠实现回调方法来管理,通过生命周期方法可以加强应用健壮性和灵活性。activity生命周期是直接影响其他activities和会退栈。

activity存在三种状态:运行(Resumed), 暂停(Paused), 停止(Stopped)

activity生命周期回调方法:

public class ExampleActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // The activity is being created.
    }
    @Override
    protected void onStart() {
        super.onStart();
        // The activity is about to become visible.
    }
    @Override
    protected void onResume() {
        super.onResume();
        // The activity has become visible (it is now "resumed").
    }
    @Override
    protected void onPause() {
        super.onPause();
        // Another activity is taking focus (this activity is about to be "paused").
    }
    @Override
    protected void onStop() {
        super.onStop();
        // The activity is no longer visible (it is now "stopped")
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        // The activity is about to be destroyed.
    }
    @Override
    protected void onRestart() {
        super.onRestart();
        // The activity is Restart.
    }
}

状态图:

生命周期

  • 常见生命周期状态转换
    a.正常启动Activity:FirstActivity.onCrate()-FirstActivity.onStart()-FirstActivity.onResume() Resume
    a1.点击Back键:FirstActivity.onPause()-FirstActivity.onStop()-FirstActivity.onDestroy(),再次进入Activity,FirstActivity.onCrate()-FirstActivity.onStart()-FirstActivity.onResume()
    a2.点击Home键:FirstActivity.onPause()-FirstActivity.onStop(),再次进入Activity,FirstActivity.onRestart()-FirstActivity.onStart()-FirstActivity.onResume()
    b.两个Activity之间切换(FirstActivity跳转到SecondActivity)
    FirstActivity.onPause()-SecondActivity.onCreate()-SecondActivity.onStart()-SecondActivity.onResume()-FirstActivity.onStop()
    b1.两个Activity之间切换(FirstActivity.finish()跳转到SecondActivity:)
    FirstActivity.onPause()-SecondActivity.onCreate()-SecondActivity.onStart()-SecondActivity.onResume()-FirstActivity.onStop()- FirstActivity.onDestroy()
    b2.两个Activity之间切换(FirstActivity跳转到SecondActivity-android:style=”@android:style/Theme.Dialog”)
    FirstActivity.onPause()-SecondActivity.onCreate()-SecondActivity.onStart()-SecondActivity.onResume()
    c.配置改变Activity生命周期变化(语言,屏幕旋转)
    销毁当前的Activity-onPause()-onStop()-onDestroy(),重新创建onCrate()-onStart()-onResume()
    android:configChanges=”keyboard|orientation|screenSize”

  • 生命周期方法总结
    这里写图片描述

状态保存

Activity生命周期中保存用户两种方式
1.onPause() 持久化
2.onSaveInstanceState(). 临时状态

1.onCreate()
2.onRestoreInstanceState()

Activity栈

一个应用中通常包含多个Activity,每个Activity都应该被一种结构管理,以方便用户启动,这种结构就是栈,栈就是为了去收集这些Activity以方便和用户交互,然后展示给用户。

这里写图片描述

Activity lunchMode加载模式

  • 使用manifest file

    standard

    默认的启动模式,每次启动都会创建新的实例覆盖在原Activity上

singleTop

在启动时,系统会判断当前栈顶是不是要启动的Activity,如果是则不需要创建直接引用栈顶Activity,并且调用onNewIntent,否则创建。 一般用到接收消息后显示的界面。

singleTask

1.同一App中:在启动时,检测整个Activity栈中是否存在当前需要启动的Activity。如果存在,则将Activity置于栈顶,并将Activity以上的Activity都销毁。
2.不同应用:其他程序以SingleTask模式来启动这个Activity,那么他将创建一个新的任务栈。如果启动模式为SingTask的Activity已经在后台一个任务栈中,那么启动时,后台任务栈将一同被切换到前台。当用户按下返回键时,也会优先返回这个任务栈的Acitivity,一般用来退出整个应用。(参考下面图解)

这里写图片描述

singleInstance

申明为这种模式的Activity会出现在一个新的任务栈中,而且该任务栈中只会出现这个Activity。这种启动模式常用于需要与程序分离的界面,可以实现多个Activity共享。

  • 使用Intent flags

FLAG_ACTIVITY_NEW_TASK

每次启动都会在一个新的Task中启动,该Flag通常用于从Service中启动Activity,由于在Service中并不存在Activity栈,所以用该FLag创建一个Task,并在该任务栈中创建Activity

FLAG_ACTIVITY_SINGLE_TOP

使用SingleTop模式创建Activity

FLAG_ACTIVITY_CLEAR_TOP

使用SingleTask模式创建Activity

Activity亲和性

亲和性Handling affinities指的是Activity更愿意属于哪个任务栈。默认情况下,所有activity都在同一个应用中,也就是同一个任务栈中。但是你也可以修改activity的affinity。activity定义在不同应用中可以共享同一个affinity ,或者同一个应用能指定不同task affinities。

两种方式启动affinity
- 1. FLAG_ACTIVITY_NEW_TASK
- 2. allowTaskReparenting (清单文件中)
可以用 taskAffinity 属性指定不同的affinities 和每个应用联系

清空任务栈

  • clearTaskOnLaunch

每次返回该Activity,都将该Activity之上的Activity清除掉,通过这个属性可以保证只用这个Activity。

  • finishOnTaskLaunch

每次返回该Activity,,都将该Activity finish掉。

  • alwaysRetainTaskState

设置为true时,该Activity所在task将不接受任何清理命令,一直保持当前的Task状态。

最后

这里只是Activity部分知识点,还有些知识点不是很懂,以后懂了就会慢慢补上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值