Activity
一、Activity是什么?
Activity是一个应用程序的组件,在屏幕上提供了一个区域,允许用户在上面做一些交互性的操作
二、手动创建活动
1.创建活动
项目创建完成,手动将项目改成Project模式,手动建立一个Empty Activity活动,并命名为FirstActivity,不要勾选Generate Layout File 和 Launcher Activity。Generate Layout File会自动为你所创建的活动创建一个对应的布局文件,Launcher Activity会自动将你所创建的活动设置为当前项目的主活动。
2 创建和加载布局
在layout目录创建一个布局命名first_layout,布局采用LinearLayout(线性布局)
要加载布局就要在FirstActivity中的onCreate()方法中添加 setContentView(R.layout.first_layout);代码
setContentView()方法给当前活动加载一个布局,在方法中传入一个id。项目中添加的任何资源都会在R文件中生成一个相应的资源id,只需要调用R.layout.first_layout就可以得到first_layout.xml布局的id。
3在AndroidManifest注册
所有的活动都要在这里注册才能生效,Android Studio已经帮我们注册好了
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.activitytest">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/Theme.ActivityTest">
<activity android:name=".FirstActivity"></activity>
</application>
</manifest>
配置主活动,在标签Activity 中添加以下代码
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
4 在活动中使用Toast
首先要先定义一个弹出Toast的触发点,例如一个Button,在Button监听器当中添加以下代码
Toast.makeText(FirstActivity.this, "You clicked Button 1", Toast.LENGTH_SHORT).show();
通过Toast的静态方法创建一个Toast对象,然后调用show()将Toast显示出来
5 在活动中使用Menu
首先创建一个Menu resource file
添加以下代码创建两个菜单项
<item
android:id="@+id/add_item"
android:title="Add"/>
<item
android:id="@+id/remove_item"
android:title="Remove"/>
接着重新回到FirstActivity重写onCreateOptionsMenu()方法
快捷键ctrl + o
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main,menu);
return true;
}
通过getMenuInflater()方法能够得到MenuInflater对象,再调用它的inflate()方法就可以给当前活动创建菜单了。返回true,表示允许菜单显示出来。
重写onOptionsItemSelected方法来响应菜单
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.add_item:
Toast.makeText(this, "You clicked Add", Toast.LENGTH_SHORT).show();
break;
case R.id.remove_item:
Toast.makeText(this, "You clicked Remove", Toast.LENGTH_SHORT).show();
break;
default:
}
return true;
}
6 销毁活动
按以下back键 或者使用finish()方法
三 Intent在活动中穿梭
1 显式intent
intent可以指明当前组件想,要执行的动作,还可以在不同组件之间传递数据。Intent可用于启动活动、启动服务以及发送广播等场景。
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);
intent创建有多个构造函数的重载,其中一个是Intent (Context packageContext, Class<?>cls),从当前活动中跳转到目标活动
2 隐式intent
通过在activity标签下配置intent- filter的内容,可以指定当前活动能够响应的action和category,打开AndroidManifest.xml,添加如下代码:
<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中的action和category,活动才能响应
3向下一个活动传递数据
intent 中提供了一系列putExtra()方法的重载,可以把我们想要传递的数据暂存在Intent 中,启动了另一个活动后,只需要把这些数据再从Intent中取出就可以了
传递数据
String data = "Hello 3G实验室";
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("extra_data", data);
接受数据
Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");
Log.d("SecondActivity", data);
四 活动的生命周期
1 返回栈
Android是使用Task任务来管理活动的,一个任务就是一组存放在栈里的活动集合,这个栈被称为返回栈,栈是一种后进先出的数据结构,在默认情况下,每当我们启动了一个新的活动,它会在返回栈中入栈,并处于栈顶的位置。而每当我们按下Back键或调用finish()方法去销毁一个活动时,处于栈顶的活动会出栈,这时前一个栈的活动就会重新处于栈顶的位置。
2活动的生存期
onCreate()。这个方法你已经看到过很多次了,每个活动中我们都重写了这个方法,它会在活动第一次被创建的时候调用。你应该在这个方法中完成活动的初始化操作,比如说加载布局、绑定事件等。
onStart()。这个方法在活动由不可见变为可见的时候调用。
onResume()。这个方法在活动准备好和用户进行交互的时候调用。此时的活动一定位于返回栈的栈顶,并且处于运行状态。
onPause()。这个方法在系统准备去启动或者恢复另一个活动的时候调用。我们通常会在这个方法中将一些消耗CPU的资源释放掉,以及保存一些关键数据,
但这个方法的执行速度一定要快,不然会影响到新的栈顶活动的使用。
onStop()。这个方法在活动完全不可见的时候调用。它和onPause(
)`方法的主要区别在于,如果启动的新活动是一个对话框式的活动,那么onPause() 方法会得到执行,而onStop()方法并不会执行。
onDestroy()。这个方法在活动被销毁之前调用,之后活动的状态将变为销毁状态
onRestart()。这个方法在活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。
3保存临时数据
当一个活动进入停止状态是有可能被系统回收的,此时如果返回这个活动,并不会执行onRestart()方法,而是会执行onCreate()方法,因为活动在这种情况下会被重新创建一次。
但如果该活动中存在临时数据和状态,那么此时会发生数据丢失。
在活动中添加以下代码
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
String tempData = "Something you just typed";
outState.putString("data_key", tempData);
}
onCreate()方法其实也有一个Bundle类型的参数。这个参数在一般情况下都是null,但是如果在活动被系统回收之前有通过onSaveInstanceState( )方法来保存数据的话,这个参数就会带有之前所保存的全部数据,我们只需要再通过相应的取值方法将数据取出即可。
在onCreate方法中添加以下代码
if (savedInstanceState != null) {
String tempData = savedInstanceState.getString("data_key");
Log.d(TAG, tempData);
}