Activity, Intent

本文详细解析了Android中Intent的FLAG_XXX标志的作用及容易混淆的地方,并通过实例阐述了如何避免Activity引起的内存泄漏。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[b][size=medium]关于Intent的FLAG_XXX[/size][/b]
首先就是:FLAG_ACTIVITY_NEW_TASK,是否觉得当你在一个Intent上设置该flag后,你的Activity就会在新的Task上启动?
但实际上并没有(文档中是讲的零零散散,将各个部分拼起来就能够知道了),因为你的Activity总是在main task上启动,原因是你的Activity与main task有相同的taskAffinity,如果有task的taskAffinity与将启动的Activity相同,则那个task就会被bring front,同时将Activity放到那个task上。

还有NO_HISTORY和EXCLUDE_FROM_RECENTS也容易让人混淆:
NO_HISTORY:是说你一离开具有该标记的Activity,它会自动finish()(即使你没调用)

EXCLUDE_FROM_RECENTS:是针对task的root activity(一般就是作为launcher的那个Activity),如果你对它设了这个标记,在你长按home键时,就不会从Recents列表中看到该task了

FLAG_ACTIVITY_REORDER_TO_FRONT:将如果启动的Activity在task中已存在,则提取到最前面,否则启动新的放在最前面

launch a new activity from an existing one,这个不清楚应该是怎么理解,是不是利用task中已存在的Activity来创建出一个新的Activity(就是两个Activity的某些属性是一样的)

FLAG_ACTIVITY_FORWARD_RESULT:例如:有A->B->C->D,现在D以该属性startActivityForResult启动B,则现在为的task为A->B->C->D->B,因为B的setResult是返回给A的,所以最顶上的B将结果也返回给A,而不是D(不知道理解是否正确哦)

FLAG_ACTIVITY_PREVIOUS_IS_TOP:该属性应该是与其它属性组合起来用的,使用它是就是将前一个视为task的第一个,如:A->B->C->D,使用该属性时,C被认为是第一个,而无视D


还有很多其它的控制Activity和Task的属性:
<activity>标签有:
android:launchMode
android:taskAffinity
android:clearTaskOnLaunch
android:alwaysRestainTaskState
android:allowTaskReparenting
android:excludeFromRecents
android:finishOnTaskLaunch
android:noHistory


涉及的文档:
docs/reference/android/content/Intent.html
docs/guide/topics/manifest/application-element.html
docs/guide/topics/manifest/activity-element.html
docs/guide/topics/fundamentals/tasks-and-back-stack.html
docs/guide/topics/fundamentals.html#acttask


[b][size=medium]关于activity的内存泄漏[/size][/b]

public class MyActivity extends BaseActivity {
// some code

// 非static的线程类
private class MyTask extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
}

@Override
protected Void doInBackground(Void... params) {
try {
Thread.sleep(10000000);
} catch (InterruptedException ex) {
}
return null;
}

@Override
protected void onPostExecute(Void result) {
}
}
}

如果此时,因为屏幕切换而导致Activity重新常见,那么就会造成内存泄漏了。因为MyTask 引用着 MyActivity,而MyTask一直没有结束。如果多次屏幕切换的话,泄漏的内存就不可小觑了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值