`

[Android Samples视频系列之ApiDemos] App-Activity-IntentActivityFlags

阅读更多
1.前言
该Demo的分析参考了mapdigit的关于Api Demos的文章,我在他的基础上更进一步分析了相关知识点。
2.Demo效果



3.Demo分析
首先,进入到IntentActivityFlags后的界面如下图所示:



通过布局文件可以知道该例子布局很简单:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:orientation="vertical"android:padding="4dip" 
       android:gravity="center_horizontal" 
       android:layout_width="match_parent"android:layout_height="match_parent"> 
    <TextView 
       android:layout_width="match_parent"android:layout_height="wrap_content" 
       android:layout_weight="0" 
       android:paddingBottom="4dip" 
       android:text="@string/intent_activity_flags"/> 
    <Button android:id="@+id/flag_activity_clear_task" 
       android:layout_width="wrap_content"android:layout_height="wrap_content" 
       android:text="@string/flag_activity_clear_task"> 
        <requestFocus /> 
    </Button> 
    <Button android:id="@+id/flag_activity_clear_task_pi" 
       android:layout_width="wrap_content"android:layout_height="wrap_content" 
       android:text="@string/flag_activity_clear_task_pi"> 
        <requestFocus /> 
    </Button> 
</LinearLayout> 
整个布局容器是线性布局,各个元素在其中以垂直,水平居中的方式进行排布。
功能为:
点击第一个”FLAG_ACTIVITY_CLEAR_TASK”的按钮,程序界面会跳转到Views->Lists示例的界面,如下图。



点击第二个”FLAG_ACTIVITY_CLEAR_TASK(PI)”的按钮,程序界面依然会跳转到Views->Lists示例的界面,同上图。
如果大家多多观察会发现,在我们点击两个按钮中任意一个后,都会跳转到ApiDemos->Views->Lists的示例中,然后点击“返回”会回到ApiDemos->Views,再点击“返回”会回到最初进入ApiDemos的列表界面。
为什么两个按钮点击后实现的功能一样呢,它们在点击后的响应事件处理中有什么不同吗?我们先从一个主要的函数代码来看:
private Intent[] buildIntentsToViewsLists() { 
        // We are going to rebuild our task with a new back stack.  This will 
        // be done by launching an array of Intents, representing the new 
        // back stack to be created, with the first entry holding the root 
        // and requesting to reset the back stack. 
        Intent[] intents = new Intent[3]; 
  
        // First: root activity of ApiDemos. 
        // This is a convenient way to make the proper Intent to launch and 
        // reset an application's task. 
        intents[0] = Intent.makeRestartActivityTask(new ComponentName(this, 
               com.example.android.apis.ApiDemos.class)); 
  
        Intent intent = new Intent(Intent.ACTION_MAIN); 
        intent.setClass(IntentActivityFlags.this,com.example.android.apis.ApiDemos.class); 
        intent.putExtra("com.example.android.apis.Path", "Views"); 
        intents[1] = intent; 
  
        intent = new Intent(Intent.ACTION_MAIN); 
        intent.setClass(IntentActivityFlags.this,com.example.android.apis.ApiDemos.class); 
        intent.putExtra("com.example.android.apis.Path", "Views/Lists"); 
  
        intents[2] = intent; 
        return intents; 

通过函数中的注释我们可以知道,这个函数的作用是通过启动一个Intents Array来重建一个“返回栈”,本例中的Intent[]有三个元素。
Intent[0]是通过
makeRestartActivityTask(new ComponentName(this, 
               com.example.android.apis.ApiDemos.class)); 
方法得到的,通过官方文档可以知道该方法返回一个Intent,用以重建一个Activity Task并保持为根(root)状态。也就是说,com.example.android.apis.ApiDemos.class这个Activity在启动后将会作为这一个Activity Task的入口Activity。
      Intent[1]和Intent[2]均是通过setClass()来指明具体的意图,并向分别向各自键为:"com.example.android.apis.Path"的变量中存入"Views "和"Views/Lists"两个值,用以指示ApiDemos获取相应的内容来填充其List列表。
      主要函数看完了再分别看看两个按钮的点击事件的实现:
      第一个按钮“FLAG_ACTIVITY_CLEAR_TASK”点击后执行如下代码: startActivities(buildIntentsToViewsLists());
我们经常用到的是startActivity(Intent),而startActivities(Intent[])的作用与之完全相同,无非就是将Intent[]中的三个Intent所指向的跳转目标Activity从后至前依次添加到当前Activity栈中,如果大家在点击完按钮后用“Back”键返回,会发现返回的顺序和Intent[]中的顺序从后至前一致。
      第二个按钮“FLAG_ACTIVITY_CLEAR_TASK(PI)”作用和第一个按钮实现的功能相同,只是运用了PendingIntent,它的功能实际上是事先定义好一个Intent,然后在满足条件的时候启动(即使当前Context销毁,外部也可以从初始化PendingIntent中的Context启动这一Intent)。
try { 
                pi.send(); 
            } catch (CanceledException e) { 
                Log.w("IntentActivityFlags", "Failed sending PendingIntent", e); 
            } 
        } 
4.视频讲解:http://www.eyeandroid.com/thread-9802-1-1.html

5.这个Demo我们学会了:
1. Android Intent和PendingIntent的区别详细分析
http://www.eyeandroid.com/thread-1419-1-1.html
2. PendingIntent的重复问题,当新建的PendingIntent匹配上一个已经存在的PendingIntent时可能不会创建新的
http://www.eyeandroid.com/thread-9784-1-1.html
3. Reference:PendingIntent翻译
http://www.eyeandroid.com/thread-9785-1-1.html
  • 大小: 67.6 KB
  • 大小: 22.6 KB
  • 大小: 28.2 KB
2
4
分享到:
评论

相关推荐

    android4.4samples(包含ApiDemos)

    "android4.4samples"是一个包含了Android 4.4(KitKat)SDK中的示例代码集合,它为开发者提供了一个深入学习Android API的平台。这些示例代码涵盖了各种功能和组件的使用方法,帮助开发者更好地理解和应用Android...

    vuforia-samples-advanced-android-ios-unity-4-2-3

    vuforia-samples-advanced-android-ios-unity-4-2-3.zip官网下载太慢了,放在网盘方便大家下载

    vuforia-samples-core-android-ios-unity-4-2-3

    vuforia-samples-core-android-ios-unity-4-2-3.zip官网400M下载太慢了,传到百度云盘,方便大家下载,一分意思一下!

    android-L\legacy\ApiDemos

    andorid L\adt-bundle-windows-x86_64-20140624\sdk\samples\android-L\legacy\ApiDemos 最新的androidl 的apidemos

    arcgis runtime samples android master

    总结,ArcGIS Runtime SDK for Android为开发者提供了构建强大GIS应用的途径,"arcgis-runtime-samples-android-master"则是学习和掌握这个工具的宝贵资源。通过深入研究和实践,开发者可以创建出具有专业GIS功能的...

    arcgis-runtime-samples-android-100.4-master.zip

    这个“arcgis-runtime-samples-android-100.4-master.zip”压缩包包含了一系列100.5版本的示例代码,旨在帮助开发者快速理解和掌握ArcGIS Runtime for Android的开发技术。 1. **ArcGIS Runtime SDK介绍** ArcGIS ...

    vuforia-samples-core-android-7-2-21.zip

    这个"vuforia-samples-core-android-7-2-21.zip"压缩包包含了Vuforia的最新版本7.2.21的Android示例项目,旨在帮助开发者理解和实践Vuforia的各项功能。以下是对这些关键知识点的详细介绍: 1. **Vuforia SDK**: ...

    vuforia-samples-unity-9-8-11

    使用Unity2019.4打包的Vuforia Core Samples.apk ; vuforia-samples-unity-9-8-11.apk

    开源项目-Azure-Samples-azure-sdk-for-go-samples.zip

    在"Azure-Samples-azure-sdk-for-go-samples-master"目录下,你可以找到多个子目录,每个子目录代表一个特定的示例场景。这些示例涵盖了Azure服务的广泛应用,包括但不限于: 1. **虚拟机管理**:如何创建、启动、...

    vuforia-samples-advanced-android-7-1-34

    这个“vuforia-samples-advanced-android-7-1-34”压缩包包含了多个用于Android平台的高级Unity示例项目,帮助开发者深入了解Vuforia的功能和用法。 首先,我们来看看每个子文件的含义: 1. **VideoPlayback-7-1-...

    vuforia-samples-core-android-8-6-10_0.zip

    "vuforia-samples-core-android-8-6-10_0.zip"是一个包含Vuforia SDK 8.6.10版本的核心Android示例项目的压缩包。这个压缩包特别适用于开发者,尤其是那些在2020年2月期间遇到官方下载困难的情况,因为当时可能由于...

    vuforia-samples-core-android-ios-unity-4-0-103

    原始资源太大,381M,放在网盘里供下载。官网下载太慢,只有十几KB的速度

    android-samples.zip

    最后,Android 23的samples还包括了如何利用最新的API与设备硬件交互,如蓝牙、GPS、传感器等。这可以帮助开发者更好地利用手机的各种功能,开发出更具创新性的应用。 总的来说,“android-samples.zip”这个压缩包...

    mg-samples-1.6.0.rar_mg-sampl_mg-samples-1.6_mg-samples-str_mg-s

    《MiniGUI开发示例库详解——mg-samples-1.6.0》 MiniGUI,全称微型图形用户界面,是一种轻量级的图形系统,主要用于嵌入式设备和资源有限的计算机上,提供图形用户界面的支持。它以其小巧、高效、易用的特点在...

    Android 自带Samples

    标题中的“Android 自带Samples”指的是Android SDK中包含的一系列示例项目,这些项目展示了如何使用Android API来实现特定功能或交互。 描述中提到的"ApiDemos"是Android Samples中最为经典的一个,它几乎包含了...

    spring-android-samples

    "spring-android-samples-master"目录下的源代码包含了一系列示例应用,覆盖了上述所有功能点。通过这些案例,开发者可以了解如何在实际项目中应用Spring for Android,例如创建一个HTTP客户端,处理不同类型的HTTP...

    spring-android-samples-master

    spring-android-samples-master

    google-api-ruby-client-samples.zip

    google-api-ruby-client-samples 是 Google API Ruby 客户端的示例。 标签:google

Global site tag (gtag.js) - Google Analytics