Activity
一、Activity是什么
Activity是一种可以包含用户界面的组件,主要用于和用户进行交互。一个应用程序可以包含零个或多个活动。
二、活动的基本用法
1. 手动创建活动
打开android studio,在src/main/java目录下右键选择new -> Activity -> Empty Activity即可。默认情况下会勾选Generate a Layout File,即自动生成布局文件。
2. 创建和加载布局文件
若步骤1中并未勾选默认创建布局文件,则在src/main/res目录下,右键选择new->Android Resources File,新建一个布局文件,并在相应的activity中,调用setContentView(R.id.资源文件名)方法设置为该activity的引用布局文件。
3. 在AndroidManifest文件中注册
注册代码示例:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.joygin.viewtest">
<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注册代码-->
<!--name为被注册的activity名称,label为标题栏的名称,主Activity的标题栏名称还会成为应用程序名称-->
<activity android:name=".MainActivity" android:label="标题栏名称">
<!--意图过滤器-->
<intent-filter>
<!--配置该Activity为主Activity,即程序的最开始画面-->
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
4. 在Activity中使用Menu
1、在res目录下创建一个名为menu的Directory,并在menu目录下右键new -> Menu resource file ,创建一个名为main的菜单布局文件
2、菜单布局文件中设置menu的内容,示例代码如下:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<!--id指定菜单项的唯一标识符,title指定菜单项的名称-->
<item android:id="@+id/add_item"
android:title="add" />
<item android:id="@+id/remove_item"
android:title="Remove"/>
</menu>
3、在对象的Activity源文件中,重写onCreateOptionsMenu()方法,示例代码如下:
//返回值为true,表示允许创建的菜单显示出来,返回false表示禁止显示。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
4、设置菜单项相应事件,重写activity中的onOptionsItemSelected()方法,示例代码如下:
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getGroupId()){
case R.id.add_item:
Toast.makeText(this, "clicked add", Toast.LENGTH_SHORT).show();
break;
case R.id.remove_item:
Toast.makeText(this,"clicked remove",Toast.LENGTH_SHORT).show();
break;
default:;
}
return true;
}
5. 销毁Activity
按下系统的back键即可销毁Activity,如果要程序主动销毁Activity,需调用finish()方法。
示例代码:
//设置按钮btn1的监听事件,点击后关闭页面
btn1.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v){
finish();
}
});
三、Activity间的跳转和数据传递
1. Intent的作用
Intent是Android程序中各组件之间交互的一种重要方式,其作用主要有以下两点:
- 用于不同组件之间传递数据。
- ntent用于启动Activity、Service、Broadcast等。
- 用于启动其他应用程序。
2. Intent实现ativity间的跳转
显示Intent跳转
//在原activity调用
Intent intent = new Intent(上下文,目标Activity.class);//第一个参数为上下文,activity本身就是一个上下文,可以直接调用this
startActivity(intent);
隐式Intent跳转
AndroidManifest.xml文件中:
<!--假设目标Activity是SecondActivity,使用隐式intent跳转到Activity-->
<!--AndroidManifest.xml中配置SecondActivity-->
<activity android:name=".SecondActivity">
<intent-filter>
<!--只有同时匹配action和category的intent才能匹配到这个activity-->
<action android:name="com.example.activitytest.ACTION_START"/> <!--action只有一个,action名称自定义,一般为类的全限定路径-->
<!--category可以有多个,此为系统提供的默认category,activity调用时无需添加-->
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="com.example.activitytest.MY_CATEGORY"/><!--自定义的category-->
</intent-filter>
</activity>
调用方activity中:
Intent intent = new Intent("com.example.activitytest.ACTION_START");
intent.addCatefory("com.example.activitytest.MY_CATEGORY");
startActivity(intent);
3. 隐式Intent打开浏览器
Intent.setData(Uri uri):
用于传递字符串数据,参数一般通过Uri.parse()方法解析产生。
此方法对应配置文件中的<data 属性="属性值">标签。
主要用于向系统程序的跳转,如浏览器传递地址,短信传递接受手机号码,电话传递接口手机号码。
流程:
- 以Intent.ACTION_VIEW为参数新建一个Intent。
- 调用intent.setData设置Uri。
- 调用startActivity实现跳转。
示例代码
btn1.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v){
Intent intent = new Intent(Intent.ACTION_VIEW);.//Intent.ACTION_VIEW是Android系统内置的action
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
}
});
4. Intent传递数据
方式:调用intent.putExtra方式设置数据进行传递。接受方通过getIntent()获取intent,再通过intent.get对象类型Extra("键")获取数据。
流程:
- 新建Intent
- 通过intent.putExtra("键" , 值 ) 方法设置数据
- 接受方getIntent().get类型Extra("键")获取数据。
示例代码
//原activity传递数据
btn1.setOnClickListener(new OnClickListener(){
@Override
public void OnClick(View v){
String data = "Hello World";
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("key",data)
startActivity(intent);
}
});
//目标activity接受数据
@Override
protected void OnCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.second_layout);
Intent intent = getIntent();
String data = intent.getStringExtra("key");
}
5. 返回数据到上一个Activity
方式:通过startActivityForResult(intent, requesCode)方法跳转到目标activity,目标activity调用setResult(resultCode , intent)方法设置数据,原activity再重写onActivityResult获取数据。
流程:
- 原activity新建intent并通过startActivityForResult()跳转到目的activity。
- 原activity重写onActivityResult方法获取数据。
- 目标activity新建intent设置数据,再通过setResult(intent)设置数据。
示例代码:
//----------原activity
//设置按钮监听
btn1.setOnClickListener(new OnClickListener(){
@Override
public void OnClick(View v){
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivityForResult(intent, 1);
}
});
//重写onActivityResult方法
@Override
protected void OnActivityResult(int requestCode, int resultCode, Intent data){
switch (requestCode){
case 1:
if(resultCode == 2){
String data = data.getStringExtra("key");
}
break;
default:
}
}
//-----------目标activity
btn2.setOnClickListener(new OnClickListener(){
@Override
public void OnClick(View v){
Intent intent = new Intent();
intent.putExtra("key","Hello World");
setResult(2, intent);
finish();
}
});
requestCode和resultCode区别:
requestCode用于区分不同的请求,resultCode用于区分返回处理结果是否成功。
四、Activity的生命周期
1、返回栈
activity是保存在返回栈中的,activity显示时则位于栈顶,按下系统后退键则弹出任务栈。在此界面上再打开一个activity则将新activity压入栈。调用activity的finish()方法则弹出栈。
2、Activity状态
运行状态
当一个活动位于返回栈的栈顶时,该活动处于运行状态。
暂停状态
活动不再处于栈顶位置,但仍然可见。例如通过小窗模式打开新的activity,则原先的activity处于暂停状态。
停止状态
活动不再处于栈顶位置,并且完全不可见
销毁状态
活动从返回栈中移除后处于销毁状态。系统优先回收该类活动。
3、Activity的生命周期
生命周期涉及到的7个方法
onCreate():Activity第一次创建时调用。常在该方法中完成初始化操作,如加载布局,绑定事件等。
onStart():Activity由不可见变为可见时调用。
onResume():activity准备好和用户进行交互时调用,即重新回到返回栈顶时调用。
onPause():activity离开栈顶时。
onStop():activity变为完全不可见时调用。
onDestroy():activity被销毁前调用。
onRestart():活动由停止状态变为运行状态之前调用,在onStart()方法之前执行,首次创建时不执行。
注:除了onRestart()方法,其他方法都是两两相互对应的。
Activity生命周期划分为3种生命周期
完整生存期:从onCreate()到onDestroy()
可见生存期:onStart()到onStop()
前台生存期:onResume()到onPause()
五、Activity的启动模式
1. standard模式
使用standard模式的activity,不管返回栈中是否已经存在该activity,每次启动都会创建该activity的一个新的实例。
2.singleTop模式
启动activity时,如果发现返回栈的栈顶已经是该activity,则直接使用它,否新新建该activity的实例。
3.singleTask模式
指定为singleTask模式的activity,每次创建该activity会先检查返回栈中是否存在,如果存在,则将该activity上的所有activity都移除返回栈。否则会创建一个新的activity实例。
4.singleInstance模式
指定为singleInstance模式的activity会启用一个新的返回栈管理该活动。使用场景:该程序和其他程序一同使用共享该activity。
5. 设置Activity启动模式
在AndroidManifest.xml中,给标签指定 android:launchMode 属性来选择启动模式。
六、Activity使用技巧
1.获取当前页面的Activity名称
方式:
- 创建一个基础Activity:BaseActivity。
- 重写onCreate()方法。
- 在该方法中使用Log.d("BaseActivity", getClass().getSimpleName());
- 让新建的子类都继承BaseActvity。
2.随时随地退出程序
方式:
- 建立ActivityCollector类作为活动管理器,在该类中建立一个静态变量,存储activity。
- 实现addActivity(Activity activity)方法、removeActivity(Activity activity)方法、finishAll()方法。
- 在先前的BaseActivity中,重写onCreate方法,加入ActivityCollector.addActivity(this)
- 在先前的BaseActivity中,重写onDestroy方法,加入ActivityCollector.removeActivity(this)
- 退出程序的按钮可调用 ActivityCollector.finishAll()结束程序。
ActivityCollector示例代码:
public class ActivityCollector{
public static List<Activity> activities = new ArrayList<>();
public static void addActivity(Activity activity){
activities.add(activity);
}
public static void removeActivity(Activity activity){
activities.remove(activity);
}
public static void finishAll(){
for(Activity activity : activities){
if(!activity.isFinishing()){
activity.finish();
}
}
activities.clear();
}
}
BaseActivity示例代码:
public class BaseActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Log.d("BaseActivity", getClass().getSimpleName());
ActivityCollector.addActivity(this);
}
@Override
protected void onDestroy(){
super.onDestroy();
ActivityCollector.removeActivity(this);
}
}