Activity基础知识
阅读原文时间:2023年07月09日阅读:1

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();
    }
});

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()方法解析产生。

​ 此方法对应配置文件中的标签。

​ 主要用于向系统程序的跳转,如浏览器传递地址,短信传递接受手机号码,电话传递接口手机号码。

流程:

  • 以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用于区分返回处理结果是否成功。

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()

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 属性来选择启动模式。

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);
    }
}