窗口跳转管理补充

ActivityStackSupervisior管理ActivityStack:ActivityStack就是回退栈,分为系统和应用,id为0的是系统的回退栈,id为1的是应用的回退栈。

ActivityStack管理着TaskRecord,也就是任务栈

TaskRecord管理着ActivityRecord

 

一般在点击手机Back键的时候就是在当前任务栈返回,返回到最底下一个activity时,就返回桌面(最底下的activity是从桌面图标启动的),而不是返回其他的任务栈,因为一个任务栈大致就可以代表一个应用,如果退完一个应用就进入另一个应用会非常奇怪。如果最底下的那个activity是从另一个应用启动的,那么就会返回到那个应用的顶层,但如果在按back键之前,现将启动它的那个应用返回桌面,那么再返回被启动的应用时也将是返回桌面。

 

关于上一条其实可以这么理解:桌面和最近列表其实是一个大的回退栈,是系统的,当我们点击home或者最近列表时,大的回退栈就将上面所有的应用的回退栈弹栈。而我们的每个应用都有且只有一个回退栈,这个回退栈是记录任务的。比如我们点击一个应用图标,那么这个应用就会新建一个回退栈,并且这个回退栈是在系统的大的回退栈上面的,我们不用管系统的,我们现在只管自己应用的回退栈,此时,在应用中点击打开另一个任务,那么这个任务就会压入回退栈,点击back键就回到上一个任务,再点击就回到桌面。

 

一个应用启动另一个应用的界面,会有seamless机制,即启动的另一个应用的activity模式是standard和singleTop,那么就会是这个模式;但是如果它是singleTask或者singleInstance模式,那么就不是这样,而是相当于开启另一个任务栈。

 

一个任务栈的任务名就是最底层那个activity的taskAffinaty属性。任务栈的任务名可以重名,不过任务id不会重名,不过如果任务名重名,在最近列表里可不会显示两个相同任务名的任务。

 

点击应用图标就是找到这个应用的入口activity,先查看它的taskAffanity属性所属任务存不存在,存在的话直接将这个任务放置前台,不存在就启动这个activity

 

一切从Activity出发,开启了这个应用的activity,就是开启了这个应用的进程,但是并不一定开启了这个应用的任务

 

回退栈不会回退任务,而是直接返回桌面,除非这个任务是由另一个任务启动的。

 

activity就是封装的窗口,而ActivityRecord、TaskRecord、ActivityStack、ActivityStackSupervisior这些只是为了对窗口的切换进行管理。扩展一下,WindowsManager、WindowsManagerService、SurfaceFlinger是对增加窗口进行管理。

 

回退栈的理解:

应用、窗口、任务、回退栈这几者的关系要弄清楚:
可能应用无窗口;
可能应用有窗口了但是没有任务
每个应用都有一个回退栈
回退栈的运行是不影响任务的存在,有可能回退栈里有3个任务,一一回退到桌面,但是打开最近列表,这3个任务依旧还在。考虑回退栈的时候就考虑回退栈,考虑任务的时候就考虑任务,千万不要把他们联系在一起考虑

任务栈的理解:
1、任务可以同名,但是taskId不同,他们依然是两个不同的任务,不过在最近列表中会将同名的任务展示在一起

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现Java窗口跳转到新窗口,可以使用Java Swing的JFrame和JDialog组件。 首先,您需要创建一个JFrame对象作为主窗口。然后,在该窗口中添加一个按钮或其他组件,以便当用户单击该组件时打开新窗口。 以下是一个简单的示例代码,演示如何实现窗口跳转: ```java import javax.swing.*; import java.awt.*; import java.awt.event.*; public class WindowSwitcher extends JFrame implements ActionListener { private JButton openButton; public WindowSwitcher() { super("Main Window"); // 创建一个按钮并将其添加到主窗口 openButton = new JButton("Open New Window"); openButton.addActionListener(this); getContentPane().add(openButton, BorderLayout.CENTER); } public void actionPerformed(ActionEvent e) { if (e.getSource() == openButton) { // 创建一个新对话框并打开它 JDialog dialog = new JDialog(this, "New Window", true); dialog.setSize(200, 100); dialog.setLocationRelativeTo(null); dialog.setVisible(true); } } public static void main(String[] args) { WindowSwitcher mainWindow = new WindowSwitcher(); mainWindow.setSize(300, 200); mainWindow.setLocationRelativeTo(null); mainWindow.setVisible(true); } } ``` 在这个例子中,我们创建了一个JFrame对象作为主窗口,并添加了一个名为“Open New Window”的按钮。当用户单击该按钮时,我们创建了一个JDialog对象作为新窗口,并将其显示出来。 请注意,我们将JDialog的第三个参数设置为true,这意味着它是一个模态对话框,当它处于打开状态时,用户无法与主窗口进行交互。如果您不想使用模态对话框,则可以将该参数设置为false。 希望这可以帮助您实现窗口跳转功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值