你好,我叫Activity,是你的App“门面担当”
想象一下,你打开一个交友软件。
第一步:闪屏页,一个酷炫的Logo让你觉得“这App有点东西”。—— 这是Activity A。
第二步:手指一点,进入主页面,各种帅哥美女推荐刷到你手软。—— 这是Activity B。
第三步:点开一个心动的头像,进入详情页,准备开始私聊。—— 这是Activity C。
看到了吗?你这一路“刷刷点”,其实就是在不同的Activity之间“反复横跳”。它就是我们App里每一个能和用户直接“摸来摸去”的屏幕界面。
所以,说人话就是:一个Activity,就是你App的一个“房间”或“一页纸”。而你的工作,就是当好这个房间的“金牌管家”,知道用户什么时候来、什么时候走、什么时候被打断,然后把房间打理得井井有条。
第一章:Activity的“人生七步”——生命周期,它的灵魂戏法
如果说Activity只能学一个概念,那必须是生命周期。这是它的核心情商,决定了它如何应对手机世界里各种“突发状况”(比如来个电话、没电关机、你切出去回微信)。
别怕那些拗口的方法名,我们把它想象成一次“相亲全过程”:
- onCreate():初次见面,梳妆打扮。
-
- 场景:系统第一次创建你这个Activity房间。
- 你该干啥:必须干的事!加载布局(
setContentView)、找控件(findViewById)、初始化数据。就像相亲前洗头、换衣服、准备话题,这是基础的“形象工程”。
- onStart():闪亮登场,进入视野。
-
- 场景:Activity马上就要变得“可见”了,但还不能和你互动。
- 你该干啥:可以准备一些需要“展示”的东西。比如,你人已经坐到咖啡店座位上了,对方能看到你,但还没开始打招呼。
- onResume():开始热聊,焦点在我!
-
- 场景:Activity正式进入前台,用户可以和你“摸来摸去”了。
- 你该干啥:开启动画、播放视频、恢复游戏逻辑。这是互动最紧密的时候,好比相亲双方开始对话,你是全场的焦点。
- onPause():半路杀出个程咬金。
-
- 场景:另一个Activity来了,但它可能只挡住你一部分(比如一个弹窗)。或者,你要离开了。
- 你该干啥:保存一些轻量的、需要立刻保存的数据;暂停动画、摄像头等耗电操作。因为下一个Activity要等你这步做完才会启动,所以不能做太耗时的事!就像聊天时服务员来倒水,你暂时停一下,但脑子还想着刚才的话题。
- onStop():彻底离场,背影远去。
-
- 场景:你的Activity被完全挡住了,变得“不可见”。
- 你该干啥:释放一些用户不看你时不需要的资源。比如,关闭网络连接。这时候你已经离开了咖啡店,对方看不见你了。
- onRestart():哎呀,我又回来了!
-
- 场景:从
onStop()状态重新回来。 - 你该干啥:重新加载一些在
onStop时释放掉的资源。好比你去上了个厕所,又回到座位。
- 场景:从
- onDestroy():曲终人散,彻底拜拜。
-
- 场景:Activity被系统干掉(比如用户按了返回键),或者你主动调用了
finish()。 - 你该干啥:做最后的清理工作,释放所有资源,避免内存泄漏。这是相亲结束,各回各家,把所有垃圾都带走。
- 场景:Activity被系统干掉(比如用户按了返回键),或者你主动调用了
记住这个流程,你就拿捏了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,创建一个你的专属“房间”,开始你的表演吧!

被折叠的 条评论
为什么被折叠?



