梳理一波Activity基础使用

what

首先初学android第一个学的绝逼是Activity,翻译为活动,即看的见,摸得着的玩意。android SDK提供了一套模板类即Activity,开发者需要继承它,并且在对的时间做相应的事情,比如UI初始化,数据加载等等,通过在Manifest文件中声明这个新的Activity就可以了。这次就先不探讨Activity是怎么工作的,从应用的角度来看看它,(AMS还得再学习学习2333)。

how

无非就是创建类然后实现Activity,然后注册到Manifest中。可以了。

主要来看看Activity中重要的API吧。

首先看看Activity继承结构。

  • AppCompatActivity :目前来说默认AS创建的Activity继承自AppcompatActivity,直接意思兼容的Activity咯,支持ActionBar,同时对MD控件提供支持。

  • FragmentActivity:支持Fagment使用的Activity,因为3.0之前是没有Fragmnt,所以为了兼容引入。

  • Activity:原汁原味的。。

接着看看日常必须用得到方法

  • 生命周期方法,放在下面好了。

  • setSupportActionBar和getSupportActionBar,进去ToolBar,出来AcionBar,工具栏相关的者两个一定得用

  • onConfigurationChanged,配置发生改变,就会回调这里。再Manifest中activity的配置中要设定关心那些变化

    1
    2
    <activity android:name="" android:configChanges="orientation|keyboard"/>
    横竖屏切换,键盘等等
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    onSaveInstanceState 和 onRestoreInstanceState 保存和恢复当前的某些状态和数据
    内存回收后重新创建Activty,可以传递Bundle
    onCreateOptionsMenu //创建menu的回调
    onOptionsItemSelected //设置响应menu事件的回调
    getMenuInflater //填充menu的填充器
    onRequestPermissionsResult //请求权限后处理结果的回调
    onBackPressed //按下返回回调
    onLowMemory //低内存回调
    onActivityResult //启动其它activity返回结果回调

好像列出来没什么软用。。

Intent使用

能够定义Activity后,接着就是利用Intent进行页面的跳转了。Intent意为意图,在四大组件中基本都是利用Intent进行调用和传递。

Intent分为启动方和接受方,启动方发出Intent,接收方接收。完成跳转或启动,启动方需要给出Intent目标或方向,而接受方需要明确自己能接受什么Intent

首先Intent很干脆,就是一个Parcelable 和 Cloneable而已,Intent同样对应着Manifest文件intent-filter标签,代表当前组件能够响应什么样的意图

显式使用Intent进行跳转Activity:明确目标地点

1
2
3
4
5
6
7
public static void startActivity(Context from, Class<? extends Activity> to, Bundle bundle) {
Intent intent = new Intent(from, to);
if (bundle != null) {
intent.putExtras(bundle);
}
from.startActivity(intent);
}

隐式使用Intent:不明确目标地点,但是能给出大致的方向。通过action,category,data三种隐式过滤,来搜寻目标。

1
2
3
4
Intent intent = new Intent();
intent.addCategory(String);//可以多个
intent.setAction(String);//单个
intent.setData(Uri);//单个

响应的一方可以设置多个Intent-filter

1
2
3
4
5
6
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.LAUNCHER" />
<data android:host="" android:mimeType="" android:port="" android:scheme="" android:path=""/>
</intent-filter>

携带数据

Intent可以携带基本数据类型,数组,Parcelable,Serializable,不爽的话直接Bundle打包。不过内部实现也是一起打包在Bundle中。

startActivityForResult 这则是启动activity后返回可以读取返回的数据,需要重写onActivityResult来读取Intent

到了这里其实也能够做挺多事了,不光能够自己应用内跳转,以及开启相机啊,相册,很多很多。

生命周期

返回栈

用于管理任务栈,新Activity入栈,finish出栈。

活动状态

  • 运行状态:activity位于栈顶
  • 暂停状态:可见,不位于栈顶
  • 停止状态:不可见,不位于栈顶
  • 销毁状态:出栈

生命周期方法

1
2
3
4
5
6
7
onCreate//设置Layout
onStart//可见
onResume//可见可交互
onPause//可见不可交互
onStop//不可见
onDesotry//销毁
onRestart//onStop恢复后会走

生命周期方法对应了活动状态时的回调

启动模式

指定Activity的启动模式,对应着android:launchMode属性

  • Standard 标准模式,无论站内是否存在实例,都会创建新的
  • SingleTop 栈顶存在则不创建新的
  • SingleTask 栈内存在则不创建新的,并且把上面的全都出栈
  • SingleInstance 用一个单独的栈来管理