[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]
如果此时,因为屏幕切换而导致Activity重新常见,那么就会造成内存泄漏了。因为MyTask 引用着 MyActivity,而MyTask一直没有结束。如果多次屏幕切换的话,泄漏的内存就不可小觑了。
首先就是: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一直没有结束。如果多次屏幕切换的话,泄漏的内存就不可小觑了。