Activity
活动代表了一个具有用户界面的单一屏幕,Android 的活动是ContextThemeWrapper 类的子类。
活动的生命周期
返回栈:Android是使用任务(task)来管理活动的,一个任务就是一组存放在栈里的活动的集合,这个栈称作返回栈(Back Stack)。默认情况下,当我们启动了一个新活动,它会在返回栈中入栈,并处于栈顶位置;当我们按下Back健或调用finish()方法销毁一个活动时,处于栈顶的活动会出栈。系统总是会显示处于栈顶的活动给用户。
活动状态:运行、暂停、停止、销毁。
活动的生存期:
Activity 类定义了下面的方法,覆盖了活动生命周期的每一个环节:
方法 | |
---|---|
onCreate() | 在活动第一次创建时调用,完成活动初始化,如加载布局,绑定事件等; |
onStart() | 在应用程序为用户可见时调用 |
onResume() | 在应用程序与用户开始可交互的时候调用; |
onPause() | 当当前活动将要被暂停,上一个活动将要被恢复是调用;(被暂停的活动无法接受用户输入,不能执行任何代码。) |
onStop() | 当活动不在可见时调用; |
onDestroy() | 当活动被系统销毁之前调用; |
onRestart() | 当活动被停止以后重新打开时调用。 |
活动的基本用法
一、注册活动
一个应用程序可以有零个或多个活动,没有任何限制,而所有活动都需在AndroidManifest.xml中进行注册。
活动的注册声明要放在<application>
标签内,通过<activity>
标签对活动进行注册。其次,为使程序在启动时知道应先启动哪个活动,我们还应配置主活动,即在(意图过滤)标签中声明MAIN动作和LAUNCHER类别。如:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapplication">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".FirstActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SecondActivity">
</activity>
</application>
</manifest>
除此,还可以使用android:label指定标题栏中的内容。
二、加载布局(layout)
Android程序设计讲究逻辑和视图分离,最好每一个活动都能对应一个布局,布局就是来显示界面内容的。常将布局文件置于app/src/main/res/layout目录下。
布局文件中声明了对应活动中使用的各种UI控件(如button,text等),并对其进行属性设置。如:
属性 | |
---|---|
android:id | 指定元素唯一标识 |
android:layout_width | 指定宽度,使用match_parent表示和父元素一样宽 |
android:layout_height | 指定高度,使用wrap_content表示高度只要能刚好包含里面内容。 |
android:text | 指定元素显示的文本内容 |
接着在活动的onCreate()方法中调用setContentView()方法加载布局。如:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);
}
三、菜单(Menu)与Toast
在app/src/main/res/menu目录下增加菜单文件main,使用<item>
标签添加菜单项,通过android:id指定标识符,android:title指定名称。如:
<item
android:id=”@+id/add_item”
android:title=”Add” />
接着回到该活动的java文件中重写onCreateOptionsMenu()方法,使用getMenuInflater().inflate()方法并返回true。然后重写onOptionsItemSelected()方法定义菜单响应事件。如:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main,menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.add_item:
Toast.makeText(this,"Add",Toast.LENGTH_SHORT).show();
break;
case R.id.remove_item:
Toast.makeText(this,"Remove",Toast.LENGTH_SHORT).show();
break;
default:
}
return true;
}
Toast是Android提供的一种非常好的提醒方式,可以使用它将一些短小的信息通知给用户,这些信息会在一段时间后自动消失,且不会占用任何屏幕空间。
Toast的用法非常简单,通过静态方法makeText()创建出一个Toast对象,然后调用show()将Toast显示出来。用法如上。makeText()方法传入的3个参数:
一是Context,如活动;
二是文本内容;
三是Toast显示时长,有两个内置常量可以选择:Toast.LENGTH_SHORT、Toast.LENGTH_LONG。
四、使用Intent
1、显式Intent
创建两个活动:FirstActivity、SecondActivity,其中FirstActivity为主活动,有一个按钮,id为button1。
使用Intent(Context packageContext,Class<<\?> cls)方法,构建一个intent,传入FirstActivity.this做上下文,SecondActivity.class作为目标活动,再使用startActivity()方法执行这个intent。如:
Button button1=(Button)findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
startActivity(intent);
}
});
这时,点击按钮可打开活动2的页面。
2、使用隐式intent
隐式intent并不明确指出我们想要启动哪一个活动,而是指定了一系列更为抽象的action和category等信息,交由系统去分析这个intent,并找出合适的活动。
这时活动中<intent-filter>
标签定义<action>
、<category>
就起了作用。<action>
指明了当前活动可以响应的action,<category>
更精确地指明了当前活动能够响应的intent中还可能带有的category。只有<action>
,<category>
中的内容同时能匹配上intent中指定的action和category时,这个活动才能响应该intent。
我们到AndroidManifest.xml文件中修改SecondActivity的<intent-filter>
</activity>
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.example.myapplication.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.example.myapplication.MY_CATEGORY" />
</intent-filter>
</activity>
然后修改FirstActivity中按钮的onClick()响应。
Button button1=(Button) findViewById(R.id.button);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent("com.example.myapplication.ACTION_START");
intent1.addCategory("com.example.myapplication.MY_CATEGORY");
startActivity(intent);
}
});
最后可以再New一个ThirdActivity观察效果,这里不再给出代码。
五、销毁活动
Activity类中提供了一个finish()方法。修改FirstActivity中按钮的onClick()响应。
Button button1=(Button) findViewById(R.id.button);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
});
这时,按钮效果与按BACK相同,都关闭了app。