Android活动

什么是活动:

        原名叫Activity,安卓中最常用的组件之一,为用户提供了一个交互的界面,用于动画,图像的显示。

活动如何使用:

        在Android Studio中创建一个java类,继承AppCompatActivity类,重写onCreate方法,并在其中引用xml布局文件,此时,一个简单的活动就写好了,只是这个时候还没有任何界面显示。需要在xml文件中编写界面。

一,活动的生命周期:

        活动的生命周期就是,活动本身在安卓程序中存在的时间。

        谷歌将整个生命周期分为了三大阶段:

        1.创建阶段:

                期间执行onCreate()方法,此方法中进行活动的初始化操作,如设置布局、绑定控件、获取数据

        2.可见阶段

                onStart()方法和onResume()方法

        3.暂停阶段

                onStop(),此时界面依旧可见,只是失去焦点,可以在此方法中保存临时数据或释放资源,以便在后续恢复时使用。

        4.停止阶段

                onStop(),此时活动已经不可见,不可以和用户进行界面交互,可以在此方法中释放更多资源,以及处理一些界面的重置操作。

        5.销毁阶段

                onDestroy(),此方法中活动被完全销毁,释放所有资源,断开与数据库的连接

        几个生命周期之间也可以进行转化,

        由onPause() ---> onResume(),onStop() --执行onRestart()--> onStart(),

        当按下home键的时候,活动不可见,但是并没有被销毁,所以执行到onStop()方法,也就是一次执行onPause()和onStop()。

        按下back键的时候,活动不可见,但并未被销毁,所以同上

        当杀死这个进程的时候,活动就会执行onDestroy()方法  。

我们打上日志,看看执行

package com.example.activity;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;

public class ActStartActivity extends AppCompatActivity {
    public static final String TAG = "wang";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_act_start);
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "onStart");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "onResume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "onPause");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy");
    }
}

二,活动的启动模式:

        每一种启动模式都可以在java代码中和列表清单文件中进行设置launchMode中设置

1.默认模式:

①xml

        在activity节点中,将属性launchMode设置为"standard",或者不设置,,默认为标准

android:launchMode="standard"

②java代码

        可以设置点击事件,使用intent意图打开下一个活动的时候设置setFlags();设置

    Intent in = new Intent();
    in.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

 意为创建一个新的活动,如果不存在活动栈,就会重新创建一个活动栈。

2.栈顶复用模式:

①xml

        将同一个属性设置为

android:launchMode="singleTop"

②java代码

    Intent in = new Intent();
    in.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

 当活动本身处于栈顶的时候,如果再一次需要进入此活动,就会直接使用栈顶的

例子:

如果你已经打开了一个应用程序的界面,此时点击home,然后再一次,不会再次创建活动,而是直接使用你现在已经打开的活动,继续使用栈顶的活动,并使其可视化。

3.栈内复用模式:

①xml

android:launchMode="singleTask"

 ②java代码

   Intent in = new Intent();
   in.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

 当任务栈里面存在多个活动的时候:

 此时不会再创建新的活动2,而是检查栈中是否已经存在,如果存在,那么就会清空此活动上所有活动,是其成为栈顶,使用户可以看到,

我们使用例子,验证

例子:

思路:设置一个按钮,设置点击事件监听,如果点击按钮,就会创建一个活动2,如果,符合上述,那么在活动2再一次创建活动1的时候就会使最开始的活动1,再按返回就会退出

将活动1和活动2设置为栈内复用就可以

package com.example.activity;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class JumpFirstActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_jump_first);
        Button btn1 = findViewById(R.id.first_btn);

        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent in = new Intent(JumpFirstActivity.this, JumpSecondActivity.class);
                //设置为栈内复用模式
                //也就是说此时的栈里面,只能存在一个活动的实例
                in.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(in);
            }
        });
    }
}

package com.example.activity;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class JumpSecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_jump_second);
        Button btn2 = findViewById(R.id.second_btn);
        btn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent in = new Intent(JumpSecondActivity.this, JumpFirstActivity.class);
                //设置为栈内复用模式
                //也就是说此时的栈里面,只能存在一个活动的实例
                in.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(in);
            }
        });
    }
}

 点击活动2的按钮之后,再按一下返回键,就会发现直接返回到了主界面

4.全局唯一模式:

它会运行在一个新的独立任务栈中,并且不与其他任务栈共享。如果任务栈中已存在 MyActivity 的实例,系统将返回该实例,而不会创建新的实例。这样可以确保 MyActivity 是全局唯一的,不会被其他活动所复用,且不与其他活动共存于同一个任务栈。

①xml

android:launchMode="singleInstance"

②java代码

Intent in = new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_SINGLE_INSTANCE);
startActivity(intent);

 将原有的栈清空,并重新创建一个栈,只有一个这活动。

例子:

常用于用户登录一款app的时候,登录完成之后,再按下返回键,就不会返回到登录界面,而是直接退出到了主界面。

三,活动之间传递数据:

1.向下一个活动发送数据:

向下一个活动传递数据的方式,通过Intent类。

①显示Intent

此处我们使用点击触发,开启下一个活动。

我们Bundle包装数据,使用意图Intent,传递到下一个活动

>创建一个Intent的对象,传入上下文,和下一个活动的.class

Intent in = new Intent();
//设置上下文
in.setClass(this, ActReceiveActivity.class);

>创建一个Bundle的对象,往里面放入数据,通过键值对的方式存储

Bundle b = new Bundle();
//向包裹里面装东西
b.putString("time", new Date().toString());
b.putString("content", "我喜欢你很久了");

>将Bundle放入Intent里面,

in.putExtras(b);

>打开下一个活动

startActivity(in);

有发送就有接收

下一个活动接受上一个传过来的数据:

>使用getIntent().getExtras()得到快递盒子Bundle

Bundle b = getIntent().getExtras();
String time = b.getString("time");
String content = b.getString("content");
//将包裹里面的String拼接起来
String src = String.format("发送时间:%s\n发送内容:%s\n",time,content);
tv.setText(src);

 最后将String显示在想要显示的地方,此处使用TextView控件。

②隐式Intent

隐式intent常用于和软件上的其他应用的活动传递信息

使用隐式intent

>创建Intent对象

Intent in = new Intent();

>设置intent的动作action:

intent.setAction(Intent.ACTION_SEND);

在 Android 中,Intent 的动作(Action)是一个标识符,用于指定要执行的操作类型。以下是一些常用的 Intent 动作:

  1. ACTION_VIEW显示指定数据的内容。例如,显示网页、图片、视频等

  2. ACTION_EDIT编辑指定数据的内容。

  3. ACTION_DIAL:  拨打电话,需要在数据中指定电话号码。

  4. ACTION_CALL直接拨打电话,需要在数据中指定电话号码,需要权限。

  5. ACTION_SEND:  发送数据。例如,发送文本、图片、视频等。

  6. ACTION_SENDTO:  发送数据给指定接收者。

  7. ACTION_PICK:  从数据中选择一个项目。

  8. ACTION_GET_CONTENT:  选择特定类型的数据,例如图片或视频。

  9. ACTION_CAMERA:  打开相机应用。

  10. ACTION_SEARCH:  执行搜索操作。

  11. ACTION_WEB_SEARCH:  执行网络搜索操作。

  12. ACTION_INSTALL_PACKAGE:  安装应用程序。

  13. ACTION_DELETE:  删除数据。

  14. ACTION_SEND_MULTIPLE:  发送多个数据。

  15. ACTION_MAIN:  主要入口点,用于启动应用程序的主活动。

>设置Intent的数据类型

intent.setType("text/plain");

 而intent可以设置的数据类型可以有很多

  1. 文本类型:

    • text/plain: 纯文本类型,通常用于传递普通文本信息。
    • text/html: HTML 文档类型,用于传递包含 HTML 标记的文本信息。
    • text/xml: XML 文档类型,用于传递包含 XML 数据的文本信息。
  2. 图像类型:

    • image/jpeg: JPEG 图像类型。
    • image/png: PNG 图像类型。
    • image/gif: GIF 图像类型。
  3. 音频类型:

    • audio/mpeg: MPEG 音频类型,通常用于 MP3 音频文件。
    • audio/wav: WAV 音频类型,通常用于无损音频文件。
  4. 视频类型:

    • video/mp4: MP4 视频类型,通常用于 MP4 视频文件。
    • video/3gpp: 3GP 视频类型,通常用于移动设备录制的视频。
  5. 应用程序类型:

    • application/pdf: PDF 文档类型,通常用于传递 PDF 文件。
    • application/zip: ZIP 压缩类型,通常用于传递 ZIP 压缩文件。

>创建intent选择器

Intent chooser = Intent.createChooser(intent, "Select an app to share");

>放置数据或者使用setData方法

intent.putExtra(Intent.EXTRA_TEXT, "This is some text to share.");

 或者

String PhoneNum = "123456789";
Uri uri = Uri.parse("tel:"+PhoneNum);
intent.setData(uri);
startActivity(intent);

 >检查是否有可以处理该 Intent 的应用程序:

if (intent.resolveActivity(getPackageManager()) != null) {
    startActivity(chooser);
}

>启动intent

startActivity(intent);

2.向上一个活动发送数据:

分为下一个活动和上一个活动

同样我们设置一个按钮,并设置按钮点击监听,如果点击按钮,那么就会向上一个数据发送消息

①此活动(request)

>创建register注册对象

ActivityResultLauncher<Intent> register = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
    @Override
    public void onActivityResult(ActivityResult result) {
         if (result != null) {
             Intent intent = result.getData();//获得从下一个活动传回来的数据
             if (intent != null && result.getResultCode() == Activity.RESULT_OK) {
                //如果回复是ok,意图不为空
                   Bundle bundle = intent.getExtras();//取到快递盒子
                    String response_time = bundle.getString("time");//根据key获得数据
                    String response_content = bundle.getString("content");
                    String desc = String.format("收到返回消息:\n应答时间为%s\n应答内容为%s", response_time, response_content);//将String放在一起重新编辑
                    // 把返回消息的详情显示在文本视图上
                     tv_response.setText(desc);
              }
          }
    }
});

>点击事件中设置数据

Intent in = new Intent(this, ActResponseActivity.class);
Bundle b = new Bundle();
b.putString("mss", mss);
in.putExtras(b);
register.launch(in);

将需要传递给下一个活动的数据打包,使用register.launch发送

 ②下一个活动(reponse)

>接受来自上一个活动的信息,详情看给下一个活动传递数据

Bundle b = getIntent().getExtras();
String src = b.getString("mss");

然后将信息打印在视图上

>通过点击事件传回数据:

Intent in = new Intent();
Bundle b = new Bundle();
//同样打包数据
b.putString("time", new Date().toString());
b.putString("content", ans);
in.putExtras(b);
//将结果回传回去
setResult(Activity.RESULT_OK, in);//来自继承父类的方法
finish();//结束掉此活动,就可以返回到上一个活动了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值