Activity与intent解析

1. 先从看的见的入手( Toast 与 Menu )

Toast 是一种 android 中一种非常好的提醒方式,它可以将一些短小的信息通知给用户,一段时间后自动消失,不会占用任何的屏幕空间。

Menu 则可以大幅度帮我们节省屏幕空间,将菜单收缩。

具体实现

我们先在 res 目录下新建 menu 文件夹:右击 res 目录 -New-Directory

再再 menu 文件夹下新建 main 菜单文件:右击 menu 文件夹 -New-Menu resource file

就像这样:
在这里插入图片描述
在main.xml中添加如下代码:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/add_item"
        android:title="Add"/>

</menu>

<item是一个标签,用来创建一个具体的菜单项 id 则是一个唯一的标识符,主要用来在全局中找到这个 item title 则是给其指定一个名称
然后我们在 MainActivity 里重写 onCreateOptionsMenu() ,重写方法通过 Ctrl+O 快捷键寻找

然后添加以下代码:

 @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main,menu);
        return true;
    }

inflate里我们传入两个参数,第一个指定哪一个资源文件创建菜单,第二个表明菜单项添加到哪一个 Menu 对象中,这样我们就可以看得到菜单了!

当然不仅要看,还要用的了。所以定义一下菜单响应事件,我们在 MainActivity 里重写 onOptionsItemSelected() 方法。

 @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){
            case R.id.add_item:
                Toast.makeText(this,"You clicked it",Toast.LENGTH_SHORT).show();
                break;
        }
        return true;
    }

这里面用了一个全新的 Toast ,其通过静态方法 makeText() 创建 Toast 对象,然后调用 show() 将其显示出来就ok了。

makeText 里要传入三个参数,第一个是 Context ,其是一个抽象类。Activity 本身就是 Context 的子类,所以我们直接传入 this ,第二个是显示的文字,第三个则是显示时长 LENGTH_SHORT(2s) 与 LENGTH_LONG(3.5s)
在这里插入图片描述
非常好!我们就这样简单的掌握了两个工具。

当然他们还有更多更复杂的功能,这里就不一一列举了,阔以去看看这几篇博客:

  • menu:https://blog.csdn.net/castanea/article/details/80992027
  • Toast:https://www.cnblogs.com/plokmju/p/android_Toast.html

2. intent初步解析

使用Intent穿梭活动

显式Intent

一个Activity太单薄了,作为一个秃头 的程序猿,我们应该高级一点。

我们再创建一个活动,命名为SecondActivity:File-New-Activity-Empty Activity
我们就获得了第二个活动。

编辑layout目录下的activity-main.xml,替换成以下代码:

<?xml version="1.0" encoding="utf-8"?>
<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="Button1">
    </Button>
</LinearLayout>

<Button代表一个按钮,其他的我们在之后会讲。

接着我们在MainActivity里添加以下代码:

Button button1=findViewById(R.id.button_1);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(MainActivity.this,SecondActivity.class);
                startActivity(intent);
            }
        });

findViewById() 方法用于获取在布局文件中定义的元素,button_1 正是通过 android:id="@+id/button_1" 这样指定的。

然后我们通过调用 setOnClickListener() 方法为按钮注册一个监听器,点击按钮时即会执行 onClick 方法。

Intent 有多个构造函数的重载,这是其中一个。这个构造函数接收两个参数,第一个为 Context 要求启动活动的上下文,第二个 class 则是指定想要启动活动的目标。建立完后通过调用 startActivity() 方法就可以启动活动了,其接收一个 Intent 参数,我们将构建好的 Intent 传进去就行了。

然后运行,就可以跳转活动了!

隐式Intent

相较于显式,隐式 Intent 更智能了一点,我们可以通过指定更为抽象的 action 和 category 信息,然后让系统帮我们去找要启动哪个活动。

  • action: 一个字符串,指明了当前活动可以响应这个字符串
  • category: 指明当前活动的环境

只有 action 和 category 同时匹配时,这个活动才能响应 Intent。

我们先打开 AndroidManifest.xml ,找到 SecondActivity ,添加如下代码:

 <activity android:name=".SecondActivity">
            <intent-filter>
                <action android:name="Start"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>

这里我们就指定了 SecondActivity 的 action 为 “Start”,category 为 “android.intent.category.DEFAULT” 。

进入 MainActivity ,修改 onClick 里的内容像这样:

 public void onClick(View v) {
                Intent intent=new Intent("Start");
                startActivity(intent);
            }

我们同样可以进入第二个活动。

用Intent传递数据

1. 向下一个活动传递数据

Intent除了跳转活动,还可以在各个活动之间传递数据,我们来看一下。

启动活动时传递数据很简单,通过 putExtra() 方法,我们就可以将数据暂存在 Intent 中,putExtra() 里要传入两个参数,第一个是键,用于第二个活动找到你,第二个则是存储的数据。

我们在 MainActivity 将之前的代码修改一下:

button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String data="Hello!";
                Intent intent=new Intent(MainActivity.this,SecondActivity.class);
                intent.putExtra("extra_data",data);
                startActivity(intent);
            }
        });

那么第二个活动就得到了 Intent 里包含的数据,我们要将他取出来,通过 getIntent 来获取 Intent ,然后通过 getStringExtra 来获取传递的数据。(如果是 int 类型就是 getIntExtra ,以此类推)

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        Intent intent=getIntent();
        String data=intent.getStringExtra("extra_data");
        Log.d("SecondActivity",data);
    }

在这里插入图片描述

2. 返回数据给上一个活动

具体参考"第一行代码",原理一样,这里就不赘述了。
当然Intent还有一些其他的功能,具体可以看看这个
Intent:https://www.jianshu.com/p/67d99a82509b

3. 活动的生命周期

在这里插入图片描述
Android 是使用任务( Task )来管理 Activity 的,一个任务就是一组存放在栈里的 Activity 集合,这个栈被称作返回栈,栈(堆栈)是一种先进后出的数据结构。

在这里插入图片描述每当启动一个新的Activity时,它会被放入返回栈中,并处于栈顶的位置。每当我们按下Back键或调用activity的finish()方法去销毁一个活动时,处于栈顶的Activity会出栈,这时前一个入栈的Activity就会重新处于栈顶的位置。系统总是会显示处于栈顶的Activity给用户。

Activity的生存期

Activity类中定义了7个回调方法,覆盖了Activity生命周期的每一个环节,下面来一一介绍这7个方法:

1.onCreate()
  这个方法在每一个Activity类都会有,当我们新建一个Activity类时,一定会重写父类的onCreate方法,onCreate方法会在Activity第一次被创建时调用。我们应该在这个方法中完成Activity的初始化操作,比如说加载布局,初始化布局控件,绑定按钮事件等。

2.onStart()
  这个方法在Activity由不可见变为可见时调用。

3.onResume()
  这个方法在Activity准备好喝用户交互的时候调用。此时的Activity一定位于返回栈的栈顶,并且处于运行状态。

4.onPause()
  这个方法在系统准备去启动或者恢复另一个Activity的时候调用。

5.onStop()
  这个方法在Activity完全不可见的时候调用。它和onPause()方法的主要区别在于,如果启动的新Activity是一个对话框式的activity,那么,onPause()方法会得到执行,而onStop()方法并不会执行。

6.onDestory()
  这个方法在Activity被销毁之前调用,之后Activity的状态将变为销毁状态。

7.onRestart()
  这个方法在Activity由停止状态变为运行状态之前调用,也就是Activity被重新启动了

4. 活动的启动模式

1. 默认启动模式standard

该模式可以被设定,不在 manifest 设定时候,Activity 的默认模式就是 standard 。在该模式下,启动的Activity会依照启动顺序被依次压入 Task 中:
在这里插入图片描述

2.栈顶复用模式singleTop

在该模式下,如果栈顶 Activity 为我们要新建的 Activity(目标 Activity),那么就不会重复创建新的 Activity。

在这里插入图片描述

3.栈内复用模式singleTask

与singleTop模式相似,只不过singleTop模式是只是针对栈顶的元素,而singleTask模式下,如果task栈内存在目标Activity实例,则:

  1. 将task内的对应Activity实例之上的所有Activity弹出栈。
  2. 将对应Activity置于栈顶,获得焦点。
    在这里插入图片描述

4.全局唯一模式singleInstance

这是我们最后的一种启动模式,也是我们最恶心的一种模式:在该模式下,我们会为目标 Activity 分配一个新的 affinity ,并创建一个新的 Task 栈,将目标 Activity 放入新的 Task,并让目标 Activity 获得焦点。新的 Task 有且只有这一个 Activity 实例。 如果已经创建过目标 Activity 实例,则不会创建新的 Task ,而是将以前创建过的 Activity 唤醒(对应 Task 设为 Foreground 状态)
在这里插入图片描述

作业:

1.敲出并运行《第一行代码》中2.44:体验活动的生命周期,里面的所有代码,安照书中截图所有的打印日志。

2.使用singleTop启动模式启动AActivity和BActivity,并完成以下任务:

  1. 使用隐式Intent从AActivity跳转至BActivity,并传递数字"250",将其打印;
  2. BActivity返回AActivity时,传递字符"Yes!",将其打印;

拓展博客:

  • menu:https://blog.csdn.net/castanea/article/details/80992027
  • Toast:https://www.cnblogs.com/plokmju/p/android_Toast.html
  • Intent:https://www.jianshu.com/p/67d99a82509b

转载自:https://blog.csdn.net/weixin_43312313/article/details/102497709

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值