Android基本组件

Android之路—初章

Android有四大组件Activity,Service,Content provider,Broadcast receiver。今天浅说最基本组件—-Activity。

基本组件—Activity

当用户打开一个程序,必然启动了一个Activity,Activity的活动默认在栈的最前端,当跳转到其他页面时,会执行一些方法,将当前Activity回收或者销毁,这些活动都基于一个机制—-Activity的生命周期。

  • 生命周期

生命周期

1.onCreate

调用Activity时最先实现的方法,可以用来加载布局,初始化一些数据。

2.onStart

当Activity可见时,调用该方法,但此时仍在创建Activity,当前页面不可和用户进行交互。

3.onResume

当Activity获取当前用户焦点时,调用该方法,此时当前页面可以和用户进行交互。

4.onPause

当Activity不再可见,调用该方法,在这个生命周期状态下,可以做一些存储数据、停止动画的工作。

5.onStop

当Activity已经停止,一般在onPause之后调用,停止的Activity等待被重新调用,或者等待被销毁。

6.onRestart

当Activity重新从不可见到可见,调用该方法,之后接着执行onCreate方法。

7.onDestroy

当Activity彻底销毁,生命周期的最后一个函数回调,在该方法可执行一些资源释放,数据传递等方法。

这里写了一个demo,用Logcat的方式体现Activity的生命周期,在每个方法中打印Logcat(Logcat之后会单独写一篇博客积累)。

当打开一个Activity时

打开

回到主屏幕时

回主屏幕

再次打开Activity时

再次打开

当在后台完全关闭Activity时

关闭

  • launchMode:四种启动模式

Activity有着不同的启动模式,不同启动模式对应不同的功能,可满足一些开发时的需求。

1.standard(默认启动模式,标准启动模式)

启动一个Activity,并在新任务栈中创建一个实例,该Activity属于该栈中。

2.singleTop(栈顶复用模式)

如果该Activity在当前任务栈的栈顶,调用方法顺序:onPause() → Resume();
如果该Activity不在任务栈的栈顶(哪怕它在该任务栈中),则在新一个任务栈重新创建实例,该Activity属于新栈中(与标准启动模式相同)。

3.singleTask(栈内复用模式)

在当前任务栈寻找该Activity,若存在直接复用,调用onRestart() → onStart() → onResume();

并让该栈中的其他Activity出栈,其他Activity先调用onPause,在当前Activity创建开始聚焦后,其他Activity接着调用onStop() → onDestroy();
若当前任务栈不存在该Activity,在新任务栈中创建实例,该Activity属于新的任务栈(标准启动模式相同)。

4.singleInstance(全局唯一模式)

在当前任务栈寻找该Activity,若存在直接复用,调用onRestart() → onStart() → onResume();

该栈中其他Activity不出栈只停留在后台,先调用onPause();

在当前Activity创建开始聚焦后,其他Activity接着调用onStop();
若当前任务栈不存在该Activity,在新任务栈中创建实例,该Activity属于新的任务栈(标准启动模式相同)。

组件连接纽带—Intent

每个Activity之间需要有链接,而Android靠Intent这个对象来链接。这里写一个demo来体现这种连接。

这个demo只有两个Activity,命名为MainActivity和Main2Activity,布局文件中有两个按钮,id分别为

btnToMain和btnToMain2。

  • 显示Intent

按钮btnToMain 点击监听事件 Java代码:

1
2
3
4
5
6
7
8
9
10
11
12
/*点击监听事件方法*/
bt1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/*实例化Intent对象
* 参数1:当前Activity对象
* 参数2:跳转目标Activity对象;*/
Intent intent = new Intent(MainActivity.this,MainActivity.class);
/*以Intent为为连接启动新Activity*/
startActivity(intent);
}
});
  • 隐式Intent

在AndroidManifest.xml配置文件中,activity android:name=”.Main2Activity”中添加子标签

1
2
3
4
5
6
7
8
<activity android:name=".Main2Activity"
android:launchMode="singleTask">
<intent-filter>
<category android:name="android.intent.category.DEFAULT"/>
/*标准格式*/
<action android:name="android.intent.action.Main2Activity"/>
</intent-filter>
</activity>

在Main2Activity中添加静态字符串

1
public static final String ACTION = "android.intent.action.Main2Activity";

按钮btnToMain2 点击监听事件 Java代码:

1
2
3
4
5
6
bt2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(Main2Activity.ACTION));
}
});
  • Intent七大属性

1.ComponentName(显式启动)

设置Intent两个参数, 包名和将要打开的组件名.

1
public ComponentName(String pkg,String cls));

2.Action(隐式启动)

Action是Activity的行动,其属性的值为一个字符串,它代表了系统中已经定义了一系列常用的动作。

例如 : ACTION_MAIN:Android Application的入口,每个Android应用必须且只能包含一个此类型的Action声明.

3.Category(隐式启动)

Category是Activity的类型,比如一个程序的主入口Activity的Category就是MAIN。

其中在AndroidManifest.xml配置文件添加的子标签中

一个app一个类型的Action只能标记一个,但是category却可以添加多个(至少有一个,没有就要设置为DEFAULT)

例如 : CATEGORY_LAUNCHER:设置该组件为在当前应用程序启动器中优先级最高的Activity,通常为入口ACTION_MAIN配合使用。 

4.Data(隐式传值)

1
2
3
intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(不同数据类型));//如"http://www.baidu.com"打开网页;
startActivity(intent);

在配置文件中设置Data属性,以供其他软件调用

1
2
3
4
<intent-filter>
<action android:name="android.intent.category.DEFAULT" />
<data android:scheme="http" /> //这里是http协议,打开网站许可
</intent-filter>

5.Type(隐式传值)

只有data属性为null的时候,type属性才有效,如果data属性不为null,系统会自动根据data中的协议来分析data的数据类型,而不会去管type
原函数:

1
2
3
4
5
6
7
8
9
10
11
public Intent setType(String type) {
mData = null;
mType = type;
return this;
}

public Intent setDataAndType(Uri data, String type) {
mData = data;
mType = type;
return this;
}

调用:

1
2
3
4
intent.setAction(Intent.ACTION_VIEW);
Uri data = Uri.parse("file://歌曲所在文件路径/歌名.mp3"); //寻找文件夹中的数据
intent.setDataAndType(data, "audio/mp3"); //setDataAndType(Uri data, String type)方法,打开音乐播放器
startActivity(intent);

6.Extra

data.putExtra(“标识符”,数据源);
为data数据添加额外数据。

7.flag

即四大启动模式。