Activity

sky-mxc 总结 转载注明:https://sky-mxc.github.io/2016/09/30/activity

Activity

  • 什么是Activity
  • 创建Activity
  • 启动Activity
  • 保存Activity状态
  • Activity的生命周期

acitivyt 是什么

引用官方的说法:
是一个应用组件,用户可与其提供的屏幕进行交互,以执行拨打电话、拍摄照片、发送电子邮件或查看地图等操作。 每个 Activity 都会获得一个用于绘制其用户界面的窗口。窗口通常会充满屏幕,但也可小于屏幕并浮动在其他窗口之上

创建Activity

要创建Activity 必须继承自Activity或者Activity的子类。在Activity的各个生命阶段实现对应的方法;

其中重要的两个方法:

onCreate() ,系统在创建Activity时调用此方法;在此方法实现视图绑定;一些 控件的初始化

onPuase(); 用户离开当前Activity调用的第一个方法 ,

创建完成后必须在Manifest文件中 声明此Activity 系统才会知道有这个Activity

1
2
3
4
5
6
7
<manifest ... >
<application ... >
<activity android:name=".ExampleActivity" />
...
</application ... >
...
</manifest >

如果有需要也可以为此Activity添加IntentFilter(IntentFilter稍后我会再做总结),以供外部程序来启动,一般同一应用中不会用到隐式启动。

1
2
3
4
5
6
7
8
9
10
11
12
<activity android:name=".AActivity">
<intent-filter>
<action android:name="com.skymxc.action.x1" />
<action android:name="com.skymxc.action.x2" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.skymxc.catagory.c1" />
<category android:name="com.skymxc.catagory.c2" />
<data android:scheme="http" />
</intent-filter>
</activity>

最简单的Activity 只绑定了一个视图

1
2
3
4
5
6
7
8
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}


启动Activity

可以通过一个intent 来启动 一个Activity ,关于intent稍后会做总结

明确目标启动

在明确的指导要启动的Activity的时候可以显示使用intent来启动

1
2
Intent intent = new Intent(this, SignInActivity.class);
startActivity(intent);

传递数据

如果需要传递数据,可以在intent中放入数据

1
2
3
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra("origin", "哈哈");
startActivity(intent);

获取数据

1
2
Intent intent = getIntent();//获取启动此activity的intent
String origin = intent.getStringExtra("origin");

不明确启动目标

在不明确要启动的Activity的时候 可以在intent中添加关于启动目标的描述和类型,系统会过滤所有的Activity的intentFilter来匹配 ;一般 在同一个应用中不必使用隐式Intent;

例如 我在为A Activity添加这样的IntentFilter:

1
2
3
4
5
6
7
8
9
10
11
12
<activity android:name=".AActivity">
<intent-filter>
<action android:name="com.skymxc.action.x1" />
<action android:name="com.skymxc.action.x2" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.skymxc.catagory.c1" />
<category android:name="com.skymxc.catagory.c2" />
<data android:scheme="http" />
</intent-filter>
</activity>

要启动上面的Activity可以这样写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Intent in = new Intent();
////要执行的动作的描述 所有的action中 有一个匹配行
in.setAction("com.skymxc.action.x2");
//附加信息的描述 这里的描述只要在intentFilter中声明了就能匹配上,
// 如果有一项未声明则匹配不上,如果intentFilter中没有可以不添加,会使用默认的category
in.addCategory("com.skymxc.catagory.c2");
//对数据进行描述 C中定义了协议为 file
in.setDataAndType(Uri.parse("http://"),"audio/13");
if (in.resolveActivity(getPackageManager())!=null){
//启动
startActivity(in);
}else{
Toast.makeText(this,"系统中不存在可以执行此操作的程序",Toast.LENGTH_SHORT).show();
}

为某个结果启动一个Activity

如果启动一个Activit只为获得某个结果 可以 使用 startActivityForResult() 来启动一个Activity ,在获得结果后会回调 方法:onActivityResult();

去图库获取图片 第二个参数是请求码 在onActivityResult()中区分结果

1
2
3
4
Intent intent1 = new Intent(Intent.ACTION_PICK);
intent1.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
//为了结果去启动一个Activity
startActivityForResult(intent1,50);

onActivityResult()中获取到取得的图片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
*
* @param requestCode 启动时的 requestCode
* @param resultCode 跳转的activity给的
* @param data 跳转的activity给的 返回的数据
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode== 50 && resultCode ==RESULT_OK && data != null){
Uri uri = data.getData(); //返回是标识符指定图片所在的位置的统一资源标识符
img.setImageURI(uri); //设置给 ImageView
}
}


保存Activity的状态

当用户 离开Activity去往另一个Activity时;Activity会被压入返回栈,如果内存不够就会被销毁 ,当Activity被销毁后其中的数据当然就没了,如果需要保留这些数据可调用 方法 onSaveInstanceState()方法

1
2
3
4
5
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
//存入数据
outState.putBoolean("checked",true);
}

当此Activity被创建时 就能取出数据了

1
2
3
4
5
6
7
8
9
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState!=null){
boolean checked = savedInstanceState.getBoolean("checked");
}
setContentView(R.layout.activity_main);
}


Activity的生命周期

看一张图描述了整个Activity由生到死的一套回调方法
生命周期

回调方法说明

先说一下上图的方法:

  • onCreate() :创建Activity ,可以在这里进行初始一些视图和数据
  • onStart(): 启动Activity ,这里你就可以看到 这个activity了
  • onResume(): 调用这个方法前 只能看到Activity 并不能进行交互 ,执行完此方法才可以进行交互 ,整个Activity就彻底的运行起来了
  • onPause() :停止用户交互 你可以看到 但是 不能交互了 比如 启动另一个透明的Dialog Activity 你可以看到原本的Activity ,但是已经失去了焦点 ,无法交互
  • onStop() :当前Activity被覆盖时调用 例如 当前activity1跳往到activity2 ,activity就会把activity1覆盖,这时就调用了此方法
  • onRestart(); 重新启动
  • onDestroy():activity再结束前调用的最后一个方法;这里可以进行一些释放资源的操作

三种阶段

  • 完整生命周期:
    从调用的第一个方法 onCreate() 到最后调用一个的方法onDestroy() ,在onCreate()方法中可以进行一些全局的配置,UI的引用,数据的初始化,也可以从savedInstanceState中读取 保存在设备中或者执行reCreate方法前保存的数据等前提savedInstanceSate不为null,在onDestroy()方法中可以 释放资源等
  • 可视周期:在执行onStart()和onStop()之间 在这期间 你可以在屏幕上看到这个Activity但是 不能再前台跟用户交互 。只能看,可以理解为于禁用状态

  • 前台周期:在执行onResume() 和 onPause() 之间,在这期间,用户就可以在前台和activity交互了。


关于这里提到的intent ,intentFilter 我会在之后总结。

坚持原创技术分享,您的支持将鼓励我继续创作!