android实现原理说明之一_application Intent Task Activity

Task

       在android中,task的定义是,多个activity协同工作来完成某一项应用的过程。注意,这里的activity并不要求属于同一个application。如下图所示,我们的task所需要的activity可能来自多个application。 

 

       activity可以看做是独立存在于系统中,并且作为现实具体应用的主体,task将一些activity关联起来以便实现一个更复杂的功能,一个或者多个task又可以组成一个application。这就是三者之间的关系。简单点说,就是一个application包含一个或多个task,而一个task又包含一个或者多个activity。

      下面说一下activity和task的基本原理:

      绝大多数的application都是通过home screen的快捷方式启动的,(另一种启动方式是通过系统的application launcher启动)。启动某个application之后,该application的根activity将会显示在当前窗口,首页activity将会隐藏到后台。

当我们在home页中点击email图标的时候,应用中的list message activity将会显示在当前窗口,而home activity则隐藏到了后台。按back键我们便可以重新返回到home页面。

这里要注意,应用back键和home键退出是有本质上区别的:两者虽然都可以离开当前activity,但是back会销毁当前activity的状态,home则会保存当前activity的状态。

关于back:

       将会终止当前的activity,返回到之前的activity(如果当前的activity已经是根activity,那么就直接返回到home screen),在这个过程中,系统会销毁当前activity的状态信息,当我们再次回到这个activity时,展示给我们的将会是一个全新的activity。

 

如图

 

 

 

我们可以看到当我们在list messages这个activity中点击back按钮时,我们的list messages activity将会被销毁掉。

关于home:

 

我们可以看到,当我们通过home键返回home screen时,list message activity并没有被销毁,而是被调到了后台。这就意味着,当我们再次跳转到该activity时,看到的还是原来的activity。

 

       当然,上面说的只是大部分的情况,世界上哪里都存在着特例,android当然也不会例外。

       某些Activity从Background被“召唤”到foreground之后依然是相当于重新创建了新实例,其有区别于前边所论述的结果。即便是暂时保存在Background模式下(没有被Destroied),其State数据也将丢失。例如:Contacts 和 Gallery 等。当用户启动了Contact应用程序,并点选某个条目查看详细信息,如果通过Home键返回后,再次重复启动Contact应用程序时,看到的并不是之前所打开的特定条目的详细信息,而是初始的默认界面。这个例子说明不是所有情况下通过Home键返回后都可以保存当前Activity的State信息。

       另外一种是与Back键有关的特殊情况。前边提及到大部分的Activity通过Back键返回到Home Activity时,其自身将被彻底销毁,默认情况下Activity响应Back按键的方法被定义了Destroy行为。但对于某些特别情况,开发者可以根据需求将相应Back按键事件的行为重新“override”,撤消默认的Destroy行为。音乐播放器是与其相关的一个典型应用,当用户在播放器的Root Activity中触发Back按键后,转为Background模式下继续播放当前的音乐,同时Home Activity转为Foreground。

       综上所述,就一句话,对于开发者的我们来说,开发过程中,我们是可以通过某些参数的设置来指定当用户点击back或者home时,到底销毁还是不销毁当前的activity。后边的文章中,我们将会详细的讨论。

      

       Activity的重用:

在多个application中,我们可以都需要用到同一个activity,这时候,就牵扯到了一个有关复用的问题。

举例说明:Contacts(电话簿)应用Gallery(画廊)获取图像资源。

众所周知Contacts是手机中最常用的应用程序,主要用于存储当前用户的联系人信息,其中需要包含联系人的头像信息。在Android平台中的图像信息是由Gallery管理,所以Contacts必然需要复用Gallery Activity来获取相应的图像信息。

针对于Android或者其它平台开发应用程序都需要有良好的复用性意识,这个需要贯穿于项目的整个开发过程。包括如何利用当前系统的现有资源,或者考虑到将来可能会被其它应用程序用于完成特定的需求。当用户正在调用的Intent filter不唯一时(IntentFilter不唯一说明当前activity被多个地方使用了),系统将弹出一个供用户选择的对话框,这的确是一个完美的解决方法。

 

 

 

 

如图所示,当我们在home screen中点击电话簿时,会进入list contacts activity,然后我们选择查看某个人的电话信息,这时候我们会跳转到view Contact activity,然后我们点击编辑信息,又跳转到了edit Contact activity。当我们在编辑页面中选择添加图片的时候,便会调用Gallery应用中的list pictures activity,将手机中存储的图片展示给用户,用户选定一张图片,然后跳转到crop picture activity对图片的大小进行剪辑……。

Activity可以共享的依据是,具有相同IntentFilter的activity是可以相互替换的。往往系统在遇见多个这种情况时,会给用户弹出一个选择列表,让用户进行选择,用户选择的activity将会被载入当前线程替代原有的默认activity。

多个任务同时运行举例:

如图所示:

 

我们可以看到,在statue1时,用户通过在home screen点击map应用的快捷方式启动了view map activity;然后用户点击home键,跳转到state2,在state2中我们可以看到view map activity被调到了后台,当前窗口显示的是home screen;这时用户在home screen点击mcalendar应用的快捷方式启动了day view activity进入state3;然后我们再次返回home screen,通过点击map应用的图标重新进入view map activity,我们可以看到当前的map和我们刚才通过home键离开时的map一摸一样。这就是一个典型的多个任务同时运行的例子,当我们运行一个应用的时候,另一个应用并没有被destroyed,而是被转移到了后台,等待再次接受调用,显示到当前窗口。

启动application的两种不同方式:

每个App都需要提供至少一个Entry point(入口点)供用户或者系统调用其所关联的Activities,Application launcher中的小图标就是每个单独App的Entry Point。另外App也可以相互间通过Activity作为Entry Point来启动,可以将App所包含的每个Activity看作为潜在的Entry point。

例如上图中的打电话应用,我们一种方法可以通过打电话的程序直接拨号;另一种是先去电话簿中找到一个电话号码,然后通过电话簿的activity进行关联,调用拨号程序。

Intent解析

Intent代表意图,这个意图的解释有很多,我这里说一下我个人的理解。

       记得上高中的时候,一节课要上好长时间的,时不时的就会口渴,结果非常悲剧的是我没有带水,于是便想问朋友借瓶水喝。可是两个人离得比较远,又是上课时间,我又不能弄成很大的动静,于是我就写了纸条扔给了我朋友,然后我很满足的喝上了水。

       在这个例子中,我想喝水是我的一个想法,而我朋友则能给我提供水。但是光有想法和水也不行啊,我得让我朋友知道我想喝水啊。这时候,纸条便起到了一个关键的作用,它记载着我想做的事情,记载着我的意图。所以说,这里记载着我的想法的纸条就是一个意图。

(我们都知道意图在我们平时的理解中代表着想法,是一种虚无缥缈的东西,怎么就和纸条这种实体的东西等价了呢。这里可以这么认为,Intent可以认为是意图的载体。)

Intent对象包含两个元素:

1)Action :例如 查看、编辑、拨打电话、查看图像资源等等(纸上写的“我想喝水”)。

2)Data:提供给某种行为的具体数据(纸上写的信息来源等信息,比如chenzheng_java)。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,您提供的代码中使用了 Android 11 及以下版本中的一些 API,这些 API 在 Android 12 中已经被废弃或删除了。为了使您的应用程序在 Android 12 上运行,您需要对代码进行更新。以下是可能需要更改的一些部分: 1. 获取 WindowManager 服务的方式: 在 Android 12 中,您需要使用 `Context#getSystemService()` 方法,传递 `Context.WINDOW_SERVICE` 常量来获取 WindowManager 对象。例如: ``` WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE); ``` 2. 获取 Display 对象的方式: 在 Android 12 中,您可以使用 `Context#getDisplay()` 方法来获取默认的 Display 对象。如果您需要获取其他 Display 对象,可以使用 `WindowManager#getDisplays()` 方法来获取所有的 Display 对象。例如: ``` // 获取默认的 Display 对象 Display display = getDisplay(); // 获取所有的 Display 对象 Display[] displays = windowManager.getDisplays(); ``` 3. 设置 Intent 的标志: 在 Android 12 中,您需要使用 `Intent#addFlags()` 方法来设置 Intent 的标志。例如: ``` // 设置 Intent.FLAG_ACTIVITY_NEW_TASK 标志,确保在副屏幕上启动应用 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 设置 Intent.FLAG_ACTIVITY_MULTIPLE_TASK 标志,确保在副屏幕上启动应用 intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); ``` 4. 设置启动参数: 在 Android 12 中,您需要使用 `ActivityOptions#makeBasic()` 方法来创建基本的 ActivityOptions 对象。例如: ``` ActivityOptions options = ActivityOptions.makeBasic(); options.setLaunchDisplayId(display.getDisplayId()); startActivity(intent, options.toBundle()); ``` 希望这些修改能够帮助您在 Android 12 上运行您的应用程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值