什么是Activity
Activity是一种包含用户界面的应用程序组件,主要用于和用户进行交互。
Activity基本用法
创建一个Activity
app -> java -> package -> FirstActivity
public class FirstActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
创建和加载布局
创建布局
Android程序设计讲究逻辑和视图分离,最好每个活动都能对应一个布局。
创建一个布局文件:res -> layout -> first_layout.xml
这里选择LinearLayout作为根元素:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
</LinearLayout>
添加一个按钮:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/button_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button_1"
/>
</LinearLayout>
android:id="@+id/button_1" 设定该button的id为button_1
android:layout_width="match_parent" 设定当前元素的宽度,match_parent表示和父元素一样宽
android:layout_height="wrap_content"设定当前元素的高度,wrap_content表示高度只要能刚好包含里面的内容就行
android:text:设定元素显示的文字内容
加载布局
调用setContentView方法来给当前的活动加载一个布局,在该方法中传入一个布局文件的id(项目中任何添加的资源文件都会在R文件中生成一个相应的资源id,调用R.layout.first_layout即可得到first_layout.xml布局文件的id)
public class FirstActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);
}
}
在AndroidManifest文件中注册
注册活动
所有的的活动都要在Androidmanifest.xml中注册才能生效
activity的注册声明要放在<application>标签内,通过<activity>标签来进行注册.
在<activity>标签内,android:name 来指定具体注册哪一个活动。.FirstActivity表示com.example.activitytest.FirstActivity的缩写,因为application的package属性已经指明了程序的包名。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.activitytest">
<application
......
......>
<activity android:name=".FirstActivity"></activity>
</application>
</mainfest>
为程序配置主活动<intent-fliter>
在<activity>标签内加入<intent-fliter>标签,并且在该标签内添加如下两句声明
<intent-fliter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
<intent-fliter>
还可以通过android:label指定活动栏中标题的内容,标题栏是显示在活动最顶部的
修改后的xml文件如下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.activitytest">
<application
......
......>
<activity android:name=".FirstActivity"
android:label="This is FirstActivity">
<intent-fliter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
<intent-fliter>
</activity>
</application>
</mainfest>
完成以上步骤后,FirstActivity就是程序的主活动了,即点击桌面应用程序图标时首先打开的就是这个活动。(如果一个程序没有声明任何一个activity作为主活动,该程序依旧可以安装,但是无法在启动器中看到或者打开这个程序,这种程序一般都是作为第三方服务供其他应用在内部调用的)
在活动中使用Toast
Toast是Android系统提供的提示方式,可以提供一些消息的提示,且一段时间后会自动消失
findViewById()方法获取到在布局文件中定义的元素,返回一个View对象。Button向下强制类型转换成Button对象,得到按钮的实例- 调用
setOnClickListener()方法为按钮注册一个监听器,点击按钮时就会执行监听器中的onClick()方法 - 在onClick()方法中编写Toast
- Toast调用静态方法makeText()创建出一个Toast对象然后调用show()方法。makeText()需要调用三个参数
Toast toast = Toast.makeText(context,"", time);
(1) 第一个参数Context,即Toast所要求的上下文,由于活动本身就是一个Context,因此可直接传入FirstAvtivity.this.
(2) 第二个参数是Toast显示的文本内容
(3) 第三个参数是Toast内容显示的时长,有两个内置常量可以选择Toast.LENGTH_SHORT和Toast.LENGTH_LONG
public class FirstActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);
// 使用Toast
Button button1 = (Button) findViewById(R.id.button_1);
button1.setOnClickListener(new View.OnClickListener() {
@override
public void onClick(View v) {
Toast.makeText(FirstActivity.this, "You clicked Button 1", Toast.LENGTH_SHORT).show();
}
});
}
}
在活动中使用Menu
- res -> menu -> main.xml, 在main.xml文件中添加如下代码:
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/add_item"
android:title="Add"/>
<item
android:id="@+id/remove_item"
android:title="Remove"/>
</menu>
<item>标签是用来创建Menu里一个具体项的,然后通过android:id给这个菜单项指定一个唯一的标识符,通过android:title指定一个名称
- 然后回到FirstActivity中重写
onCreateOptionsMenu()方法:
- 调用
getMenuInflater()方法创建MenuInflater对象,再调用它的inflate()方法给当前活动创建菜单。 - inflate()接收两个参数,第一个参数用于指定通过哪个资源文件来创建菜单,第二个参数用于指定我们菜单项将添加到哪一个Menu对象当中
public void onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
- 定义菜单响应事件,在FirstActivity中重写
onOptionsItemSelected()方法:
通过item.getItemId()方法来判断我们获取点击的是哪个菜单项,然后给每个菜单项加入自己的逻辑处理。
public boolean onOptionsItemSelected(MenuItem item){
switch (item.getItemId()) {
case R.id.add_item:
Toast.makeText(this, "You click add", Toast.LENGTH_SHORT).show();
break;
case R.id.remove_item:
Toast.makeText(this, "You click remove", Toast.LENGTH_SHORT).show();
break;
default:;
}
return true;
}
销毁一个活动
- 直接按Back键
- 在程序中通过代码来销毁活动,Activity类提供了一个finish()方法,在活动中调用一下这个方法就可以销毁当前活动了。比如修改监听器中的代码,如下所示:
button1.setOnClickListener(new View.OnClickListener() {
@override
public void onClick(View v) {
finish();
}
});
重新运行程序,点击一下按钮,当前的活动就被成功销毁了,效果和按下Back键是一样的。
使用Intent在活动之间穿梭
在启动器中点击应用图标只会进入到该应用的主活动,如何跳转到其他活动?
显示Intent
创建一个新的的Activtiy:
com.example.avtivitytest 包 -> new Empty Activity -> SecondActivity, Layout File -> second_layout.xml, 不要设置为Launcher Activity
添加一个Button_2按钮:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/button_2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button_2"
/>
</LinearLayout>
AndroidManifest.xml新注册一个activity,因为SecondActivity不是主活动,所以不用注册配置<intent-fliter>
<activity android:name=".SecondActivity"></activity>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.activitytest">
<application
......
......>
<activity android:name=".FirstActivity"
android:label="This is FirstActivity">
<intent-fliter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
<intent-fliter>
</activity>
<activity android:name=".SecondActivity"></activity>
</application>
</mainfest>
启动第二个Activity: Intent
Intent有多个构造函数重载,其中一个是Intent(Context packageContext, Class<?> cls).第一个参数Context对象指定了启动活动的上下文,第二个参数是一个Class,指定要启动那个活动。通过Activity类中的startActivity()方法来启动活动,给该方法传入一个Intent对象即可。
修改FirstActivity中按钮的点击事件,代码如下所示:
button1.setOnClickListener(new View.OnClickListener(){
@override
public void onClick(View v){
Intent intent = new Intent(FirstActivity.this, SecondActivity.class)
startActivity(intent)
}
});
这样就在FirstActivity活动的基础上创建了SecondActivity这个活动。这种方式来启动活动,Intent的意图非常明显,因此称之为显式Intent
隐式Intent
隐式Intent并不明确指明要启动哪一个活动,而是指定了一系列的action和category等信息,然后交由系统去分析这个Intent, 并帮我们找出合适的活动去启动。通过在<activity>标签下配置的内容可以指定当前活动能够响应的action和category,只有action和category的内容同时能够匹配上Intent中指定的action和category时,活动才能响应该Intent。
打开AndroidManifest.xml,添加如下代码:
<activity android:name="./SeconndActivity">
<intent-fliter>
<action android:name="com.example.activitytest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
</intent-fliter>
</activity>
修改FirstActivity中按钮的点击事件,代码如下所示:
button1.setOnClickListener(new View.OnClickListener(){
@override
public void onClick(View v){
Intent intent = new Intent("com.example.activitytest.ACTION_START");
startActivity(intent);
}
});
这里使用了Intent的另一个构造函数,将action的内容传了进去,表明想启动能够响应该action的activity。这里没有指定category,是因为android.intent.category.DEFAULT是默认的category,在调用startActivity()方法时会自动将这个category添加到intent中。
每个Intent只能指定一个action,但可以指定多个category,可以通过调用intent的addCategory()方法来添加一个category。
button1.setOnClickListener(new View.OnClickListener(){
@override
public void onClick(View v){
Intent intent = new Intent("com.example.activitytest.ACTION_START");
intent.addCategory("com.example.activitytest.MY_CATEGORY");
startActivity(intent);
}
});
与此同时,不要忘记在activity中同步添加该category,否则程序运行会报错。
<activity android:name="./SeconndActivity">
<intent-fliter>
<action android:name="com.example.activitytest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.MY_CATEGORY" />
</intent-fliter>
</activity>
更多intent隐式用法
使用隐式Intent,使得Android多个应用程序之间的共享成了可能,比如在在程序中展示一个网页,这时只需要调用系统的浏览器即可而不必自己去实现一个浏览器。
一、将FirstActIvity中的按钮点击事件的代码修改成如下:
button1.setOnClickListener(new View.OnClickListener() {
@override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
}
});
Intent的Action是Intent.ACTION_VIEW,这是一个Android系统内置的动作,其常量值为android.intent.action.VIEW。然后,通过Uri.parse(),将一个网址字符串解析成了一个Uri对象,再调用Intent的setData()方法将这个Uri对象传递进去。
二、我们还可以在<intent-fliter>标签中再配置一个<data>标签,用于更加精确地指定当前活动能够影响什么类型的数据。<data>标签主要可以配置如下内容:
- android:scheme:用于指定数据的协议部分
- androId:host:指定数据的主机名部分
- android:port:指定数据的端口部分
- android:path:用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容
- android:mimeType:用于指定可以处理的数据类型,允许使用通配符
只有Intent对象中携带的Data与intent-fliter中<data>标签指定的内容完全一致时,当前活动才能够影响该Intent。如指定android:scheme为http,就可以相应所有的http协议的Intent了。
三、建立一个活动,使其能够响应打开网页的Intent。
com.example.activitytest -> New Activity -> EmptyActivIty-> ThirdActivity,勾选Generate Layout File,布局文件命名为third_layout,点击Finish完成创建。然后编辑Third_layout.xml文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/button_3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button_3"
/>
</LinearLayout>
然后在AndroidManifest.xml中修改ThirdActivity的注册信息:
<activity android:name=".ThirdActivity"
android:label="This is ThirdActivity">
<intent-fliter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme:"http />
<intent-fliter>
</activity>
配置了当前活动能够响应的action是Intent.ACTION_VIEW的常量值,category是默认值,此外,在data中通过android:sheme指定了数据的协议必须是http协议,这样一来,ThIrdActivity应该就和浏览器一样,能够相应一个打开网页的Intent了。

除了http协议外,还可以指定很多其他的协议,比如geo表示显示地理位置,tel表示拨打电话。下面展示了如何在程序中调用系统拨号界面。
button1.setOnClickListener(new View.OnClickListener() {
@override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
}
});
Intent.ACTION_DIAL是Android系统的一个内置动作,在data部分指定协议是tel。重新运行程序,在FirstActivity的界面点击按钮,会显示如下:

本文详细介绍了Android中的Activity概念及其基本用法,包括创建Activity、加载布局、使用Toast和Menu等功能,并探讨了如何通过Intent实现在不同Activity间的跳转。
1620

被折叠的 条评论
为什么被折叠?



