会先整理四大组件:活动Activity、服务Service、内容提供器ContentProvider、广播接收器BroadcastReceiver的学习笔记。
随后整理UI笔记,然后是一些库的学习以及Android多线程的学习。持续更新
文章目录
- 活动(Activity)
- 一、概念
- 二、主要内容
- 2.1 Intent
- 2.1.1 概念
- 2.1.2 页面跳转
- 2.1.3 向其他活动传递数据
- 2.2 活动(Activity)的生命周期
- 2.2.1 四种状态
- 2.2.2 七种方法
- 2.3 启动模式(launchmode)
- 2.4 活动管理器
活动(Activity)
一、概念
活动是Android四大组件中最基本的组件,一个App由一个或多个活动组成,它是与用户交互的界面,它需要在AndroidManifest.xml文件中注册。
二、主要内容
2.1 Intent
2.1.1 概念
Intent是Android程序中各组件进行交互的重要方式,可以传递数据,启动活动,页面跳转,启动服务,发送广播等。
Intent可分为显式Intent和隐式Intent。
2.1.2 页面跳转
显式跳转:
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this,SecondAcitivity.class);
startActivity(intent);
}
});
隐式跳转需要在AndroidManifest.xml的该活动所在标签的intent-filter中配置category和action,例:
<activity android:name=".SecondActivity" >
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
Intent intent = new Intent("com.example.activitytest.ACTION_START");
注:如果addCategory方法中输入的路径名与xml文件中配置的category不同,则会报错,因为没有任何活动可以响应这个Intent
比如:
intent.addCategory("com.example.activitytest.MY_CATEGORY");
如果加入上面这句话,而不去改动intent-filter中对应category名称的话,就会找不到活动响应intent
2.1.3 向其他活动传递数据
使用putExtra()方法可以传递字符串
String data = "Hello SecondActivity";
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("extra_data", data);
startActivity(intent);
putExtra方法中,第一个参数是键,第二个参数是值
然后可以使用getIntent方法
getIntent方法可以获取启动该Activity的Intent,然后调用getStringExtra方法,获取数据。
Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");
总结学到的一些方法:
startActivity()
intent.putExtra()
getIntent()
intent.getStringExtra()
intent.addCategory()
2.2 活动(Activity)的生命周期
2.2.1 四种状态
Android使用返回栈管理活动,栈是后进先出的数据结构,每个活动在生命周期中有四种状态。
1.运行状态,即处于栈顶时,尽量不能回收运行状态的Activity,会影响用户体验
2.暂停状态,即不处于栈顶,但仍然可见,还是尽量不回收,原因同上
3.停止状态,不处于栈顶也不可见,但是系统仍然会为这种Activity保存相应状态和变量,可能被回收
4.销毁状态,从返回栈中移除后就变成了销毁状态,倾向回收
系统回收偏好:销毁状态>停止状态>暂停状态>运行状态
2.2.2 七种方法
- onCreate()
Activity第一次被创建时调用,可以进行初始化操作,你比如加载布局,绑定事件。 - onStart()
Activity由不可见变为可见时调用 - onResume()
在Activity准备好和用户交互时调用,此时Activity一定位于栈顶,处于运行状态 - onPause()
即前台到来另一个活动时调用,通常在该方法中释放掉一些CPU资源,保存关键数据,但是执行时间不能太长,不然会影响新的栈顶活动的使用 - onStop()
在活动完全不可见时调用,和onPause()方法有所区别,比如新活动是一个对话框活动,则旧活动的onPause()方法会执行,但是不会执行onStop方法,因为它不是完全不可见的。 - onDestory()
在活动被销毁之前调用,用于销毁活动,之后活动变为销毁状态 - onRestart()
即重新启动活动,由停止状态变为运行状态
三种生存期即完整生存期,可见生存期,前台生存期,先不赘述。
2.3 启动模式(launchmode)
可 以 在 AndroidManifest.xml 中 通 过 给 标 签 指 定
android:launchMode 属性来选择启动模式,启动模式有四种,即
- standard
每点击一次按钮就会创建出一个新的 Activity 实例 - singleTop
如果要启动的活动是栈顶活动,则不用创建一个新的实例 - singleTask
每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例 - singleInstance
使用新的返回栈来管理活动,新活动所在的返回栈与原来活动所在的返回栈不同
2.4 活动管理器
随时随地退出程序
public class ActivityCollector {
public static List<Activity> activities = new ArrayList<Activity>();
public static void addActivity(Activity activity) {
activities.add(activity);
}
public static void removeActivity(Activity activity) {
activities.remove(activity);
}
public static void finishAll() {
for (Activity activity : activities) {
if (!activity.isFinishing()) {
activity.finish();
}
}
}
}