学习资料
简介
- Activity组件是四大组件之一,在应用中一个Activity可以用来表示一个界面, 中文意思也可以理解为“活动” ,即一个活动开始,代表Activity组件启动;活动结束,代表一个Activity的生命周期结束。
- 基本Android应用层的开发都离不开Activity,所有需要提供给用户使用或者查看的东西都需要Activity来承载,相当于开发中的基本单位了。当然也有不需要页面的情况,那就和这个文章没关系了。
- 应用程序的每一个界面都是一个Activity,所以也有人称其为视图界面。从字面的意思去理解,Activity具有活动的意思,我们在应用中进行的操作都是集中在Activity上面完成,例如拨号、拍照、发送email、看地图。每一个activity被给设置到一个窗口,在上面可以绘制交互界面。 一个应用程序通常由多个activities组成,他们通常是松耦合关系,通常一个应用程序包含有一个主Activity,即点击桌面图标的时候首先进入的Activity
使用流程
- 这个没什么好说的,就是创建类然后在manifest中注册下,就可以开始使用啦
创建
- 直接使用在你向创建的文件夹右键,然后new,然后选择java class继承自AppCompatActivity。
- 在manifest中注册,Activity必须注册。
<activity
android:name=".fourassembly.activity.SplashActivity" //该Activity的实现类的名字
android:exported="true" //指定是否能被其他应用调用
android:launchMode="singleInstance"> //启动模式
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".fourassembly.activity.MainActivity"/>
- 下面的两个表示表示真个程序的入口,程序启动后首先展示的就是拥有这个标签的Activity。
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
启动
- 启动分为显示启动和隐式启动
显示启动
- 直接使用Activity的方法startActivity();
/**
* 显示启动
*/
private void visibilityJump(){
Intent intent = new Intent(activityWeakReference.get(),SecondActivity.class);
activityWeakReference.get().startActivity(intent);
}
隐式启动
- 先设置Activity的action和category
<activity
android:exported="true"
android:name=".fourassembly.activity.SecondActivity">
<intent-filter>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="second_activity_category"/>
<action android:name="SecondeActivity"/>
</intent-filter>
</activity>
/**
* 隐式启动
*/
private void inVisibilityJump(){
Intent intent = new Intent("SecondeActivity");
activityWeakReference.get().startActivity(intent);
}
默认启动
- 就是点开APP第一个打开的Activity,就是我们设置的入口Activity。
带返回值的启动
- 上述的启动都是不带返回值的,单纯的启动然后跳转到目标Activity;
- Activity类还有一个startActivityForResult方法,可以接受被启动页面返回的数据.
//MainActivity页面中的处理
/**
* 带返回的跳转
*/
private void jumpForResult(){
Intent intent = new Intent(activityWeakReference.get(),SecondActivity.class);
Intent intent2 = new Intent("SecondeActivity");
activityWeakReference.get().startActivityForResult(intent, Constant.SECOND_ACTIVITY_RESULT_CODE);
}
/**
* 重写返回处理的方法
* @param requestCode The integer request code originally supplied to
* startActivityForResult(), allowing you to identify who this
* result came from.
* @param resultCode The integer result code returned by the child activity
* through its setResult().
* @param data An Intent, which can return result data to the caller
* (various data can be attached to Intent "extras").
*
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == Constant.SECOND_ACTIVITY_RESULT_CODE){
String back_data = data.getStringExtra("SECOND_BACK_DATA");
Log.d(TAG,back_data);
}
}
//SecondActivity中设置返回
private void initView() {
TextView textView = findViewById(R.id.tv_name);
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent data = new Intent();
data.putExtra("SECOND_BACK_DATA","你好,我是第二个页面");
setResult( Constant.SECOND_ACTIVITY_RESULT_CODE,data);
finish();
}
});
}
带传入数据Bundle的启动
- 既然能接受数据,那么一定能传入数据,所以任何启动方式都能传入被启动页面可能需要的参数。可以方便的传递参数。
//MainActivity设置要传入的数据。
/**
* 带传入数据的跳转
*/
private void jumpWithBundleData(){
Intent intent = new Intent(activityWeakReference.get(),SecondActivity.class);
Bundle bundle = new Bundle();
bundle.putString("DATA_FROM_MAIN","你好,我是主页");
intent.putExtras(bundle);
intent.putExtra("MAIN_NAME","MainActivity");
activityWeakReference.get().startActivity(intent);
}
//SecondeActivity中处理数据
private void initBundleData() {
Intent intent = getIntent();
if (intent!=null){
Bundle bundle = intent.getExtras();
String info = bundle.getString("DATA_FROM_MAIN");
String name = intent.getStringExtra("MAIN_NAME");
Log.d(TAG,info);
Log.d(TAG,name);
}
}
生命周期
-
生命周期的图看的最多的就是这个吧,感觉很多地方的转载来转载去,都快包浆了,不过为啥我这个没有水印,我也是转载上面资料里的啊。
声明周期.png
onCreate
- 表示Activity正在被创建,这是第一个执行的方法,在Activity的生命周期中只执行一次。在这个方法中做一些初始化工作,比如调用setContentView去加载界面布局,初始化Activity所需要的数据等。后续调用onStart()。
onRestart
- 表示Activity正在重新启动,一般情况下,当前的Activity从不可见的状态变为可见状态时,onRestart就会被调用。这种情形一般是用户操作出现所致,比如用户按Home键回到桌面或者用户打开了一个新的Activity,这时候Activity就会暂停,接着用户又回到该Activity。后续调用onStart()。
onStart
- 表示Activity正在被启动,即将开始。这个时候Activity是可见的,但是还没有出现在前台,不能和用户进行交互。这个时候可以理解为Activity已经显示出来,但是我们还看不到。后续的方法是onResume()。
onResume
- 表示Activity可见,并且已经出现在前台并开始活动,能和用户正常进行交互。需要注意的是onStart和onResume的区别,二者都是Activity可见,但是onStart时Activity还在后台,而onResume时Activity到了前台了,这时候可以开启动画或者获取独占性设备的操作如打开相机、获取麦克风等。
onPause
- 表示Activity由前台转到后台,正常情况下,紧接着onStop就会被调用。这时仍然可见。如果这时候快速地回到当前Activity,那么onResume会被调用,这类情况属于极端情况,用户操作很难重现这一场景。此时可以做一些存储数据,停止动画等操作,但是注意不能太耗时,如果太耗时会影响到新的Activity的显示。onPause是先执行完,新的Activity的onCreate才会执行。onResume和onPause相对应。
- Paused状态常用于:当Activity被另一个透明或者Dialog样式的Activity覆盖时的状态。此时它依然与窗口管理器保持连接,系统继续维护其内部状态,所以它仍然可见,但它已经失去了焦点故不可与用户交互。注:一个Activity出于paused状态时,系统并不会释放资源。释放资源你的操作要靠开发者来完成。
onStop
- 表示Activity即将停止,当前的Activity对用户不在可见。可稍微做些重量级的回收操作。后续的操作可能是onRestart或者onDestroy或者一直保持这个状态。
onDestory
- 表示Activity正在被销毁,是生命周期的最后一个回调,也是只调用一次。发生的条件是Activity本身已经执行完毕,或者系统资源不足需要回收资源将Activity销毁。
Activity启动模式
- Activity有四种启动模式:standard、singleTop、singleTask、singleInstance。可以在AndroidManifest.xml中activity标签的属性android:launchMode中设置该activity的加载模式。
Standard
- 系统默认模式,每次启动一个Activity都会重新创建一个新的实例,而不管Activity是否已经创建了一个实例
SingTop (栈顶复用模式)
- 栈顶复用模式,系统启动时,系统会启动当前栈顶Activity是不是要启动的Activity,如果是则不需要创建新的Activity而直接引用这个Activity,如果不是那么创建新的Activity。系统会回调Activity的onNewIntent()的方法。
SingTask(栈内复用模式)
- 栈内复用模式,如果栈内已经存在了一个Activity的实例,那么Activity不会被重新创建,同时这个Activity的onNewIntent()方法会被回调,并将该Activity实例置于栈顶,原先处于该实例顶部的Activity实例会被出栈销毁。如果是其他程序启动Activity,那么它会重新创建一个任务栈。
SingleInstance(单一实例模式)
- 单实例模式,是singleTask的加强版,具有singleTask所有特点,并且此种模式下Activity只有一个实例,并且只能单独的存在一个任务栈中。
使用
- 在manifest中设置启动模式的属性
<activity
android:name=".fourassembly.activity.SplashActivity"
android:exported="true"
android:launchMode="singleInstance">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- 在代码中Intent中指定Flag来设置启动模式
/**
* 设置启动模式的启动
*/
private void setStartMode(){
Intent intent = new Intent("SecondeActivity");
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);//栈顶复用
activityWeakReference.get().startActivity(intent);
}
- setFlags方法参数
//使用一个新的Task来启动Activity,但每个Activity都将在一个新的Task中。
Intent.FLAG_ACTIVITY_NEW_TASK
//使用singleTop模式来启动一个Activity。
Intent.FLAG_ACTIVITY_SINGLE_TOP
//使用singleTask模式来启动一个Activity。
Intent.FLAG_ACTIVITY_CLEAR_TOP
//使用singleTask模式来启动一个Activity,使用这种方式启动Activity,当Activity启动其他Activity的时候,该Activity会被销毁,不入栈。
Intent.FLAG_ACTIVITY_NO_HISTORY
//方式无法指定 SingleInstance 模式,SingleInstances 只能在 AndroidManifest.xml 中声明。
Intent.setFlags











网友评论