初来学习Activity,基本用法
活动是Android的四大组件之一,它是一种可以包含用户界面的组件,主要用于和用户进行交互
创建活动
- Activity是Android系统提供的一个活动基类,所有的活动都必须直接或间接继承此类才能拥有活动的特性
- Android程序的设计讲究逻辑和视图的分离,最好一个活动都能对应一个布局,布局就是用来显示界面内容的
布局文件
- 创建布局文件: Android中布局文件是XML文件类型,当布局文件创建时,R.java文件会自动对此布局文件生成一个唯一标识符(资源ID,在内部类Layout中),当在布局文件内部组件添加时,R.java文件不会对组件自动生成资源ID,需要手动生成资源ID,方式:
android:id="@+id/id_name"
(在内部类Id中) - 加载布局文件: 在活动中调用方法:
setContentView()
,将布局文件的资源ID作为参数,即实现了在此活动中加载此布局文件。资源ID在R.java文件中的所属的类都是静态的,资源ID也是静态的成员
//在代码中引用资源ID
setContentView(R.layout.activity_main);
//在XML文件中引用资源ID
@string/hello_world
在清单文件中注册活动
-
活动的注册声明要放在
application
标签内,通过标签activity
来对活动进行注册<activity <!-- 具体注册哪一个活动 --> android:name="com.example.databasetest.MainActivity" <!-- 指定活动标题栏的内容(app快捷方式的名字) --> android:label="@string/app_name" > <!-- 可以定义action和category子标签 --> <intent-filter> <!-- 指定当前活动可以响应的action --> <action android:name="android.intent.action.MAIN" /> <!-- 指定当前活动可以响应的category --> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
-
注意:
<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter>
活动在注册时,
action
标签内和category
标签内若以上内容,代表此活动是此应用程序的主活动(程序启动时,首先打开此活动)
隐式启动活动
-
一个活动若想被隐式启动,需要在此活动的
<Activity>
标签下配置<intent-filter>
标签<intent-filter > <action android:name="com.array.second"/> <data android:scheme="array" android:mimeType="aa/bb"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter>
-
action
标签指定动作 -
data
标签指定操作的数据-
android:scheme
:用于指定数据的协议部分 -
android:mimeType
:用于指定可以处理的数据类型,允许使用通配符的方式进行指定
-
-
category
标签指定类别
-
隐式意图启动
Activity
,需要为intent
设置以上三个属性,且值必须与该Activity
在清单文件中对三个属性的定义匹配intent-filter
节点及其子节点都可以同时定义多个,隐式启动时只需与任意一个匹配即可
隐式启动活动传递以及获取数据
-
隐式启动活动,通过
setData(Uri uri)
传递数据/*启动系统打电话应用,通过setData传递数据,tel就是Data标签中的scheme约束*/ intent.setAction(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:911"));
-
获取
setData
中传递过来的数据//获取启动此Activity的intent对象 Intent intent = getIntent(); Uri uri = intent.getData();
启动活动时传递数据
-
Activity
通过Intent
启动时,可以通过Intent
对象携带数据到目标Activity
Intent intent = new Intent(this, SecondActivity.class); intent.putExtra("maleName", maleName); intent.putExtra("femaleName", femaleName); startActivity(intent);
-
在目标
Activity
中取出数据Intent intent = getIntent(); String maleName = intent.getStringExtra("maleName"); String femaleName = intent.getStringExtra("femaleName");
Intent
还可以结合Bundle
一起用于传递数据,首先可以把需要传递的数据都保存在Bundle
对象中,然后再将Bundle
对象存放在Intent
里。都了目标活动之后先从Intent
中取出Bundle
,再从Bundle
中一一取出数据
返回数据给上一个活动
从A界面打开B界面, B界面关闭的时候,返回一个数据给A界面
-
在A界面:
Activity
中有一个startActivityForResult()
方法,此方法也是用于启动活动的,但这个方法期望在活动销毁的时候能够返回一个结果给上一个活动。/** * startActivityForResult(Intent intent, int requestCode) * intent:意图对象 * requestCode:请求码,用来区分是从哪个Activity返回的数据 * * 用这个api启动的Activity,在销毁时,系统会回调活动的onActivityResult */ startActivityForResult(intent, MainActivity.RESULT);
-
在B界面:
//构建一个用于传递数据的Intent对象 Intent intent = new Intent(); //存储数据 intent.putExtra("name", name); /** * setResult(int resultCode, Intent data):这个方法是专门向上一个活动返回数据用的 * resultCode:用于向上一个活动返回处理结果,一般只是用 RESULT_OK 或 RESULT_CANCELED * data:带有数据的Intent对象 */ setResult(RESULT_OK, intent); //将此活动销毁 finish();
-
在A界面: 回调方法
onActivityResult
/** * requestCode:请求码,和startActivityForResult方法中读取请求码对应,判断是从哪个Activity返回的数据 * resultCode:返回的处理结果 * data:携带着返回数据的Intent */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { //通过requestCode判断是从哪一个Activity传递过来的数据 switch (requestCode) { case MainActivity.RESULT: if (resultCode == RESULT_OK) { //取出数据 String name = data.getStringExtra("name"); textView.setText(name); } break; default: break; } }
活动的启动模式
每一个应用程序都有一个属于自己的任务栈
活动的启动模式一共有四种,分别是standard
、singleTop
、singleTask
和singleInstance
,可以在AndroidManifest.xml
中通过给<activity>
标签指定android:launchMode
属性来选额启动模式
-
standard
模式:活动默认的启动模式,对于以此模式启动的活动,系统不会在乎这个活动是否已经在返回栈中存在,每次启动都会创建该活动的一个新的实例 -
singleTop
模式:当活动的启动模式指定为singleTop
,在启动活动时如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的活动实例。不过当活动未处于栈顶位置时,这时再启动该活动,还是会创建新的实例 -
singleTask
模式:当活动的启动模式指定为singleTask
,每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例 -
singleInstance
模式:指定为singleInstance
模式的活动会启用一个新的返回栈来管理这个活动。以此模式启动的活动属于共享活动,系统中只有此活动的一个实例
活动中隐藏标题栏
-
代码:
//隐藏标题栏 requestWindowFeature(Window.FEATURE_NO_TITLE); //加载布局文件 setContentView(R.layout.activity_main);
隐藏标题栏的代码一定要在加载布局文件之前执行,否则程序会报错
Toast(吐司)来提示信息
吐司是一种很好的提醒方式,一段时间后会自动消失,并且不会占用任何屏幕空间
-
假设在布局文件中已经定义了一个按钮,ID定义为:button_1.
//findViewById()方法获得View对象,下转型到Button对象 Button button1 = (Button)findViewById(R.id.button_1); //调用setonClickListener方法为按钮注册监听器 button1.setOnClickListener(new OnClickListener() { @Override //按钮点击,就会触发onClick方法 public void onClick(View v) { Toast.makeText(MainActivity.this, "toast", Toast.LENGTH_SHORT).show(); } });
Toast的方法
makeText(Context context, CharSequence text, int duration)
方法创建一个Toast对象,三个参数:context
代表Toast要求的上下文对象,text
代表Toast显示的文本内容,duration
代表Toast显示的时长,Toast有两个内置常量可选LENGTH_LONG
和LENGTH_SHORT
使用menu
- 在创建一个活动的时候,基类
Activity
会提供一个方法onCreateOptionsMenu
,这个方法当你在点击手机上的功能键是会触发这个事件
-
1: 菜单
menu
XML文件<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" > <!-- item标签用来创建具体的一个菜单项 --> <item <!-- 为菜单项指定一个唯一的标识符 --> android:id="@+id/add_item" <!-- 给菜单项指定一个名称 --> android:title="Add" /> <item android:id="@+id/remove_item" android:title="Remove" /> </menu>
-
2:显示菜单文件的代码
@Override public boolean onCreateOptionsMenu(Menu menu) { //应用布局对象创挨近菜单 getMenuInflater().inflate(R.menu.main, menu); //返回true,显示菜单;若返回false,创建的菜单将无法显示 return true; }
-
3: 定义菜单响应事件
@Override public boolean onOptionsItemSelected(MenuItem item) { //根据定义的ID来判断我们点击的是哪一个菜单项 switch (item.getItemId()) { case R.id.add_item: Toast.makeText(FirstActivity.this, "you click add", Toast.LENGTH_SHORT).show(); break; default: break; } return true; }
销毁一个活动
- 按下back键可以销毁一个活动
- 调用
finish()
方法可以销毁一个活动