Android语言基础教程(80)Android基本程序单元Activity概述:别卷了!Android开发“相亲角”大揭秘:Activity,你的App第一印象管理大师!

你好,我叫Activity,是你的App“门面担当”

想象一下,你打开一个交友软件。

第一步:闪屏页,一个酷炫的Logo让你觉得“这App有点东西”。—— 这是Activity A

第二步:手指一点,进入主页面,各种帅哥美女推荐刷到你手软。—— 这是Activity B

第三步:点开一个心动的头像,进入详情页,准备开始私聊。—— 这是Activity C

看到了吗?你这一路“刷刷点”,其实就是在不同的Activity之间“反复横跳”。它就是我们App里每一个能和用户直接“摸来摸去”的屏幕界面。

所以,说人话就是:一个Activity,就是你App的一个“房间”或“一页纸”。而你的工作,就是当好这个房间的“金牌管家”,知道用户什么时候来、什么时候走、什么时候被打断,然后把房间打理得井井有条。

第一章:Activity的“人生七步”——生命周期,它的灵魂戏法

如果说Activity只能学一个概念,那必须是生命周期。这是它的核心情商,决定了它如何应对手机世界里各种“突发状况”(比如来个电话、没电关机、你切出去回微信)。

别怕那些拗口的方法名,我们把它想象成一次“相亲全过程”:

  1. onCreate():初次见面,梳妆打扮。
    • 场景:系统第一次创建你这个Activity房间。
    • 你该干啥:必须干的事!加载布局(setContentView)、找控件(findViewById)、初始化数据。就像相亲前洗头、换衣服、准备话题,这是基础的“形象工程”。
  1. onStart():闪亮登场,进入视野。
    • 场景:Activity马上就要变得“可见”了,但还不能和你互动。
    • 你该干啥:可以准备一些需要“展示”的东西。比如,你人已经坐到咖啡店座位上了,对方能看到你,但还没开始打招呼。
  1. onResume():开始热聊,焦点在我!
    • 场景:Activity正式进入前台,用户可以和你“摸来摸去”了。
    • 你该干啥:开启动画、播放视频、恢复游戏逻辑。这是互动最紧密的时候,好比相亲双方开始对话,你是全场的焦点。
  1. onPause():半路杀出个程咬金。
    • 场景:另一个Activity来了,但它可能只挡住你一部分(比如一个弹窗)。或者,你要离开了。
    • 你该干啥:保存一些轻量的、需要立刻保存的数据;暂停动画、摄像头等耗电操作。因为下一个Activity要等你这步做完才会启动,所以不能做太耗时的事!就像聊天时服务员来倒水,你暂时停一下,但脑子还想着刚才的话题。
  1. onStop():彻底离场,背影远去。
    • 场景:你的Activity被完全挡住了,变得“不可见”。
    • 你该干啥:释放一些用户不看你时不需要的资源。比如,关闭网络连接。这时候你已经离开了咖啡店,对方看不见你了。
  1. onRestart():哎呀,我又回来了!
    • 场景:从onStop()状态重新回来。
    • 你该干啥:重新加载一些在onStop时释放掉的资源。好比你去上了个厕所,又回到座位。
  1. onDestroy():曲终人散,彻底拜拜。
    • 场景:Activity被系统干掉(比如用户按了返回键),或者你主动调用了finish()
    • 你该干啥:做最后的清理工作,释放所有资源,避免内存泄漏。这是相亲结束,各回各家,把所有垃圾都带走。

记住这个流程,你就拿捏了Activity一半的脾气! 它让你能优雅地处理各种中断,保证用户体验流畅,而不是动不动就卡死或数据丢失。

第二章:Activity之间的“传纸条”艺术——Intent与数据传递

两个Activity房间总不能老死不相往来吧?怎么从一个房间跳到另一个房间,还能顺便“递个小纸条”(传数据)呢?这就要请出我们的信使——Intent(意图)。

Intent有两种基本玩法:

玩法一:明信片——显式Intent
你知道你要去找谁,地址门牌号写得清清楚楚。

// 在MainActivity中,跳转到ProfileActivity
Intent intent = new Intent(MainActivity.this, ProfileActivity.class);
// 顺便塞一张“小纸条”(数据)
intent.putExtra("user_name", "Android小王子");
intent.putExtra("user_age", 18);
startActivity(intent);

玩法二:发朋友圈——隐式Intent
你不知道具体由哪个App或哪个Activity来接活,你只发布一个需求,比如“我要分享一张图”,系统就会让微信、微博、QQ等所有能处理这个需求的App蹦出来让你选。

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, "快看这个超棒的App!");
startActivity(Intent.createChooser(intent, "分享到"));

在目标Activity(比如ProfileActivity)里,怎么接收这张“小纸条”呢?

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

    // 接收数据
    Intent intent = getIntent();
    String userName = intent.getStringExtra("user_name");
    int userAge = intent.getIntExtra("user_age", 0); // 0是默认值

    // 现在你就可以用userName和userAge来更新UI了
    TextView nameTv = findViewById(R.id.tv_name);
    nameTv.setText("用户名:" + userName);
}

看,是不是像玩接力赛一样简单?

第三章:Activity的“房间管理术”——启动模式

想象一下,你不停地打开同一个聊天界面,结果后台堆了10个一模一样的房间,这得多浪费内存啊!Activity的启动模式就是来解决这个“房间管理”问题的。

它主要在AndroidManifest.xml里给Activity配置launchMode属性:

  • standard(标准模式)憨憨模式。每次启动都创建一个新的Activity实例。就像复印机,咔咔咔地印,你启动几次,后台就可能堆几个。这是默认模式。
  • singleTop(栈顶复用)小聪明模式。如果这个Activity已经在栈顶了,就不会创建新的,而是复用栈顶的这个,同时会触发onNewIntent()方法。好比你在刷朋友圈,不断下拉刷新,不会给你开一堆新的朋友圈页面。
  • singleTask(栈内复用)霸道总裁模式。在一个指定的任务栈中,这个Activity只允许有一个实例。如果已经存在,就会把在这个实例上面的所有其他Activity都清掉,让它成为栈顶。典型的应用就是App的主页,你无论从哪里点回主页,都不会创建新的主页,还会清掉上面的所有页面。
  • singleInstance(单实例模式)孤独王者模式。让这个Activity独自待在一个新的任务栈里,并且这个任务栈里只有它自己。常用于系统Launcher(桌面)或者来电界面,保证全局唯一。

理解启动模式,能让你设计出更符合直觉、性能更好的页面流。

第四章:实战!打造一个“极简交友App”Activity流水线

理论说再多,不如代码跑一跑。我们来搞一个超简单的例子,串联上面所有知识点。

功能:从登录页跳到主页,并在主页显示登录名。

第一步:创建第一个Activity - LoginActivity
布局activity_login.xml(略,就是一个输入框和一个按钮)

public class LoginActivity extends AppCompatActivity {

    private EditText mUsernameEditText;

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

        mUsernameEditText = findViewById(R.id.et_username);
        Button loginButton = findViewById(R.id.btn_login);

        loginButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 1. 获取用户名
                String username = mUsernameEditText.getText().toString().trim();
                if (username.isEmpty()) {
                    Toast.makeText(LoginActivity.this, "用户名不能为空哦!", Toast.LENGTH_SHORT).show();
                    return;
                }

                // 2. 创建Intent(明信片),跳转到MainActivity
                Intent intent = new Intent(LoginActivity.this, MainActivity.class);
                // 3. 传递用户名数据
                intent.putExtra("EXTRA_USERNAME", username);
                // 4. 启动!
                startActivity(intent);

                // 可选:登录成功后,结束自己,防止按返回键又回到登录页
                // finish();
            }
        });
    }
}

第二步:创建第二个Activity - MainActivity
布局activity_main.xml(略,就是一个TextView)

public class MainActivity extends AppCompatActivity {

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

        TextView welcomeTv = findViewById(R.id.tv_welcome);

        // 接收来自LoginActivity的数据
        Intent intent = getIntent();
        if (intent != null) {
            String username = intent.getStringExtra("EXTRA_USERNAME");
            if (username != null) {
                welcomeTv.setText("你好呀," + username + "!欢迎来到交友大厅!");
            }
        }
    }

    // 体验生命周期:按Home键和返回键,观察LogCat打印的日志
    @Override
    protected void onPause() {
        super.onPause();
        Log.d("Lifecycle", "MainActivity: onPause - 我要被挡住了或要离开了");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d("Lifecycle", "MainActivity: onResume - 我又成为焦点了!");
    }
}

第三步:在AndroidManifest.xml中注册
系统可不知道你偷偷创建了这两个房间,得去“物业”那里登记一下。

<application ... >
    <!-- LoginActivity作为启动页 -->
    <activity
        android:name=".LoginActivity"
        android:exported="true"> <!-- exported=true表示允许外部启动 -->
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <!-- MainActivity -->
    <activity
        android:name=".MainActivity"
        android:launchMode="standard" /> <!-- 这里可以尝试修改为其他启动模式 -->
</application>

运行这个App,你就能完整地体验到从一个Activity跳转到另一个,并且数据成功传递的整个过程!

结语:从“会用”到“玩转”

好啦,看到这里,你已经不是Activity小白了!你知道了它如何“出生入死”(生命周期),如何“交际往来”(Intent),以及如何“管理自己的房间”(启动模式)。

Activity是Android开发的基石,把它吃透,后面学习Fragment、Service等组件都会事半功倍。多写,多试,多思考“如果现在来个电话会怎样?”,你就能真正玩转这位“第一印象管理大师”,打造出体验丝滑的App。

现在,就打开你的Android Studio,创建一个你的专属“房间”,开始你的表演吧!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

值引力

持续创作,多谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值