博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android之Task和Back Stack(回退栈)
阅读量:6087 次
发布时间:2019-06-20

本文共 5419 字,大约阅读时间需要 18 分钟。

通常一个应用程序包括多个Activity,我们在使用程序是,一个Activity到另一个Activity,又到别的Activity,然后我们按下返回键又能按打开的顺序,倒叙返回。android中是怎么做到的?TaskBack Stack与此密不可分。

Task存储了一组页面的集合,并且这个集合会被排列到一个叫Back Stack中,保存的目的在于记录Activity的打开顺序。

特点:系统会给每个程序分配唯一的Task和回退栈。

回退栈的特点:先进后出

改变Activity的排序方式:是通过修改主配置文件中的activity标签,增加android:launchmode属性。此属性的取值有四个,分别为standardsingleTopsingleTask, singleInstance

1、         standard:这个是默认情况。

2、         singleTop:若此activityactivity之间的跳转(不是从此activity又跳转到此activity)和默认情况一样;从此activity又跳转到此activity,不会创建新的此activity,也就是会这个activity不会重新打开。它在启动时,会判断设置了singleTop属性的页面是否位于回退栈的栈顶,如果是,不打开新页面,选用之前的页面,如果不是,打开新的。

3、  singleTask:当从activity1打开新activity2的时候,会在回退栈中新建新activity2对象加入栈中,当重新启动activity1时,会去判断之前的回退栈中是否存储了activity1的对象,如果有,那么将activity1之上所有activity弹出回退栈。

  1.          4、singleInstance:设置了此启动模式的activity会在此activity开启的时候给他    创建一个单独的task,那么每次启动此页面的时候,都会去这个单独的task中拿此对象。是单实例的。在一个新栈中创建该Activity实例,并让多个应用共享该Activity实例。一旦这种模式的Activity实例存在于某个栈中,任何应用再激活这个Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中。此启动模式和我们使用的浏览器工作原理类似,在多个程序中访问浏览器时,如果当前浏览器没有打开,则打开浏览器,否则会在当前打开的浏览器中访问。此模式会节省大量的系统资源,因为他能保证要请求的Activity对象在当前的栈中只存在一个。"launchMode"设置为"singleInstance"的Activity总是在栈底, 只能被实例化一次, 不允许其它的Activity压入"singleInstance"的Activity所在Task栈,  即整个Task栈中只能有这么一个Activity。

个人认为这里比较难理解,可以使用安卓程序辅助理解。

示例如下:

建立一个Android项目:有两个Activity,有两个布局文件

MainActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import 
android.app.Activity;
import 
android.content.Intent;
import 
android.os.Bundle;
import 
android.view.View;
 
public 
class 
MainActivity 
extends 
Activity
{
 
    
@Override
    
protected 
void 
onCreate(Bundle savedInstanceState)
    
{
        
super
.onCreate(savedInstanceState);
        
setTitle(
"MainActivity"
);
        
setContentView(R.layout.activity_main);
         
    
}
 
    
public 
void 
onClick(View v)
    
{
        
switch 
(v.getId())
        
{
        
case 
R.id.button1:
            
Intent intent = 
new 
Intent(
this
, MainActivity.
class
);
            
startActivity(intent);
            
break
;
 
        
case 
R.id.button2:
            
Intent intent2 = 
new 
Intent(
this
, TwoActivity.
class
);
            
startActivity(intent2);
            
break
;
        
}
    
}
}

TwoActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import 
android.app.Activity;
import 
android.content.Intent;
import 
android.os.Bundle;
import 
android.view.View;
 
public 
class 
TwoActivity 
extends 
Activity
{
    
@Override
    
protected 
void 
onCreate(Bundle savedInstanceState)
    
{
        
super
.onCreate(savedInstanceState);
        
setTitle(
"TwoActivity"
);
        
setContentView(R.layout.two);
         
    
}
     
    
public 
void 
onClick(View v)
    
{
        
switch 
(v.getId())
        
{
        
case 
R.id.button1:
            
Intent intent = 
new 
Intent(
this
, TwoActivity.
class
);
            
startActivity(intent);
            
break
;
        
case 
R.id.button2:
            
Intent intent2 = 
new 
Intent(
this
, MainActivity.
class
);
            
startActivity(intent2);
            
break
;
        
}
    
}
}

activity_main.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<
RelativeLayout 
xmlns:android
=
"http://schemas.android.com/apk/res/android"
    
xmlns:tools
=
"http://schemas.android.com/tools"
    
android:layout_width
=
"match_parent"
    
android:layout_height
=
"match_parent"
    
android:paddingBottom
=
"@dimen/activity_vertical_margin"
    
android:paddingLeft
=
"@dimen/activity_horizontal_margin"
    
android:paddingRight
=
"@dimen/activity_horizontal_margin"
    
android:paddingTop
=
"@dimen/activity_vertical_margin"
    
tools:context
=
".MainActivity" 
>
 
    
<
Button
        
android:id
=
"@+id/button1"
        
android:layout_width
=
"wrap_content"
        
android:layout_height
=
"wrap_content"
        
android:layout_alignParentTop
=
"true"
        
android:layout_centerHorizontal
=
"true"
        
android:layout_marginTop
=
"104dp"
        
android:onClick
=
"onClick"
        
android:text
=
"@string/ziji" 
/>
 
    
<
Button
        
android:id
=
"@+id/button2"
        
android:layout_width
=
"wrap_content"
        
android:layout_height
=
"wrap_content"
        
android:layout_alignLeft
=
"@+id/button1"
        
android:layout_below
=
"@+id/button1"
        
android:layout_marginTop
=
"61dp"
        
android:onClick
=
"onClick"
        
android:text
=
"@string/other" 
/>
     
</
RelativeLayout
>

two.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?
xml 
version
=
"1.0" 
encoding
=
"utf-8"
?>
<
RelativeLayout 
xmlns:android
=
"http://schemas.android.com/apk/res/android"
    
android:layout_width
=
"match_parent"
    
android:layout_height
=
"match_parent" 
>
 
    
<
Button
        
android:id
=
"@+id/button1"
        
android:layout_width
=
"wrap_content"
        
android:layout_height
=
"wrap_content"
        
android:layout_alignParentTop
=
"true"
        
android:layout_centerHorizontal
=
"true"
        
android:layout_marginTop
=
"104dp"
        
android:onClick
=
"onClick"
        
android:text
=
"@string/ziji" 
/>
 
    
<
Button
        
android:id
=
"@+id/button2"
        
android:layout_width
=
"wrap_content"
        
android:layout_height
=
"wrap_content"
        
android:layout_alignLeft
=
"@+id/button1"
        
android:layout_below
=
"@+id/button1"
        
android:layout_marginTop
=
"61dp"
        
android:onClick
=
"onClick"
        
android:text
=
"@string/one" 
/>
</
RelativeLayout
>

strings.xml中添加如下代码:

1
2
3
    
<
string 
name
=
"other"
>去二页面</
string
>
    
<
string 
name
=
"one"
>去一页面</
string
>
    
<
string 
name
=
"ziji"
>打开自己</
string
>

AndroidManifest.xml修改成下列代码:

1
2
3
4
5
6
7
8
9
10
11
<
activity
            
android:name
=
"com.zzh.day06_task.MainActivity"
            
android:label
=
"@string/app_name"
            
android:launchMode
=
"singleTask" 
>
            
<
intent-filter
>
                
<
action 
android:name
=
"android.intent.action.MAIN" 
/>
 
                
<
category 
android:name
=
"android.intent.category.LAUNCHER" 
/>
            
</
intent-filter
>
        
</
activity
>
        
<
activity 
android:name
=
"com.zzh.day06_task.TwoActivity"
></
activity
>

AndroidManifest.xml中不断修改android:launchMode="singleTask"的取值,查看效果,辅助理解。

本文转自 墨宇hz 51CTO博客,原文链接:http://blog.51cto.com/zzhhz/1626550

转载地址:http://iktwa.baihongyu.com/

你可能感兴趣的文章
酷派8705救砖
查看>>
iOS10里的通知与推送
查看>>
# C 语言编写二进制/十六进制编辑器
查看>>
EMS SQL Management Studio for MySQL
查看>>
我的友情链接
查看>>
做母亲不容易
查看>>
Power Plot
查看>>
前端框架蜘蛛网
查看>>
详细的文档(吐槽)
查看>>
为什么千里马常有,而伯乐不常有
查看>>
CentOS 7.6安装配置MariaDB异步主从复制
查看>>
求珠子的长度最小区间
查看>>
FineReport如何用JDBC连接阿里云ADS数据库
查看>>
字母大小写转化
查看>>
linux运维实战练习案例-2015年12月20日-12月31日(第一次)
查看>>
URL集合
查看>>
消灭Bug!十款免费移动应用测试框架推荐
查看>>
安装与配置windbg的symbol(符号)
查看>>
nginx的结构体 ngx_conf_t
查看>>
mysql binlog
查看>>