《Android 应用案例开发大全(第二版)》——6.7节获取第三方程序中可调用的窗口

简介:

本节书摘来自异步社区《Android 应用案例开发大全(第二版)》一书中的第6章,第6.7节获取第三方程序中可调用的窗口,作者李宁,更多章节内容可以访问云栖社区“异步社区”公众号查看

6.7 获取第三方程序中可调用的窗口
Android开发权威指南(第二版)
第X问1 源代码目录:src/ch06/InvokeSinaWeibo

现在很多程序中使用的功能并未包含在程序本身,都是通过各种插件方式获得的其他程序的资源。例如,经常会使用到的“分享”功能就是调用了系统中所有可以处理某类资源的窗口来实现的,如果这样的窗口多于一个,就会显示一个选择列表。

如果想利用其他程序中的资源,首先要了解程序对外的接口。但很多程序并没有公开相应的接口,在这种情况下,就需要通过该程序的APK文件获取我们需要的信息。本节就以新浪微博Android客户端分析如何获取第三方程序中可调用的窗口和调用方法。读者可从官方网站(http://weibo.com)下载最新的新浪微博客户端安装包(APK文件)。安装完后应先登录微博再测试本例。

由于APK文件就是ZIP压缩格式文件,所以读者可以随便找一个解压软件将APK文件解开。这里假设APK文件的文件名为sina_weibo.apk,解开sina_weibo.apk文件后,再解压根目录会找到一个AndroidManifest.xml文件,不过该文件是被编译过的,无法使用文本编辑器查看其内容。但可以使用一些工具将其反编译。本节介绍一个简单的工具AXMLPrinter2,该工具用Java编写,是一个jar文件,所以可以在任何支持JDK的操作系统平台上使用。该工具的下载地址如下:

http://android4me.googlecode.com/files/AXMLPrinter2.jar
读者也可以在随书光盘的tools目录中找到该工具。

现在将AXMLPrinter2.jar文件与AndroidManifest.xml文件放到一个目录,然后在控制台(终端)进入该目录,并执行如下的命令,将AndroidManifest.xml文件解压为AndroidManifest.txt。

java -jar ./AXMLPrinter.jar ./AndroidManifest.xml > ./AndroidManifest.txt
现在用任何一个文本编辑器打开AndroidManifest.txt,除了引用的资源都变成了十六进制的值外,其他的内容都恢复了原样。

本例会使用sina_weibo.apk的3个功能:显示微博主界面、发布微博(显示空的微博发布窗口)和分享微博(将要发布的文本和图像传入微博发布窗口)。在运行本例之前一定要安装sina_weibo.apk,否则程序会因为没找到相应的窗口而抛出异常。

首先来看如何显示微博主界面。既然显示的是主界面,那么一定是单击程序图标显示的窗口,也就是包含android.intent.action.MAIN的窗口,了解了这些后,马上在AndroidManifest.txt文件中搜索android.intent.action.MAIN,我们会找到一个SplashActivity窗口,这是显示程序封面的窗口,该窗口关闭后,就会显示微博主窗口(带微博列表的窗口),由于在SplashActivity类中需要做一些初始化工作,所以不能直接显示主窗口(MainTabActivity)。

现在搜素SplashActivity窗口的过滤器,会找到如下一个过滤器。我们会发现这个过滤器很眼熟。在6.6.3小节介绍的系统浏览器(Browser)也使用了类似的过滤器,只不过scheme不同,而且也没指定host。

<intent-filter>
  <action
    android:name="android.intent.action.VIEW">
  </action>
  <category
    android:name="android.intent.category.DEFAULT">
  </category>
  <category
    android:name="android.intent.category.BROWSABLE">
  </category>
  <data
    android:scheme="sinaweibo"
    android:host="splash">
  </data>
</intent-filter>

如果读者仔细阅读了6.5节的内容,应该很容易知道如何显示这个过滤器所在的窗口,代码如下。

public void onClick_StartSinaWeibo(View view)
{
  Intent intent = new Intent("android.intent.action.VIEW");
  intent.addCategory("android.intent.category.BROWSABLE");
  intent.setData(Uri.parse(**"**sinaweibo://splash**"**));
  startActivity(intent);
}

现在要找到可以发布新微博的窗口,继续搜索AndroidManifest.txt文件的内容(主要搜索标签),会找到一个叫com.sina.weibo.intent.action.NEW_BLOG的Action,对应的窗口类是EditActivity。现在用下面的代码测试一下,发现完全可以显示微博的发布界面。

public void onClick_PostWeibo(View view)
{
  Intent intent = new Intent("com.sina.weibo.intent.action.NEW_BLOG");
  startActivity(intent);
}

最后要实现“分享”功能,这个功能需要使用前面涉及的一个通用的Action,就是Intent.ACTION_SEND(android.intent.action.SEND),分享微博的代码如下:

public void onClick_Share(View view)
{
  Intent intent = new Intent("android.intent.action.SEND");
  // 设置要分享的文本
  intent.putExtra(Intent.EXTRA_TEXT, "今天气温很低,注意保暖哦,亲!");
  // 必须指定Mime Type为text/plain
  intent.setType("text/plain");
  startActivity(intent);
}

如果读者还想确定一下的话,可以在AndroidManifest.txt文件中搜索android.intent.action.SEND,会找到两个指定该Action的过滤器。一个设置了Mime Type为“text/plain”,用于处理文本数据;另一个Mime Type为“image/*”,用于处理文本和图像数据。如果想同时处理文本和图像数据(发布带图像的微博),可以使用下面的代码。

Intent intent = new Intent("android.intent.action.SEND");
intent.putExtra(Intent.EXTRA_TEXT, "今天气温很低,注意保暖哦,亲!");
// 需要指定图像文件的绝对路径
intent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file:///sdcard/test.jpg"));
// 通常设为Mime Type为image/*
intent.setType("image/*");
startActivity(intent);

如果使用上面的代码可能会有多个窗口符合条件,这样就会显示选择列表。如果不想显示选择列表,直接调用新浪微博的分享微博界面,可以使用下面的代码。

public void onClick_ShareWithSinaWeibo(View view)
{
    Intent intent = new Intent("android.intent.action.SEND");
    // 直接指定Package Name和Activity Class Name
    intent.setClassName("com.sina.weibo", "com.sina.weibo.EditActivity");
  intent.putExtra(Intent.EXTRA_TEXT, "今天气温很低,注意保暖哦,亲!");
  intent.setType("text/plain");
  startActivity(intent);
}

注意

使用显式方式调用EditActivity,也需要指定android.intent.action.SEND,这是因为在微博程序内部检测了Action,如果不为Intent对象指定Action,则Action为null,系统就不会继续处理传递的数据了。如果想通过显式方式分享文本和图像,对Intent对象的设置与隐式方式完全一样。
如果读者想调用系统内置的程序,并且没有Android源代码,也可以从Android模拟器上使用adb pull命令下载相应的APK文件,并按着本节的方法进行分析。

相关文章
|
2天前
|
移动开发 API Android开发
构建高效Android应用:Kotlin协程的实践指南
【5月更文挑战第11天】 在移动开发领域,性能优化和资源管理是至关重要的。特别地,对于Android开发者来说,合理利用Kotlin协程可以极大地改善应用的响应性和稳定性。本文将深入探讨Kotlin协程在Android中的实际应用,包括它们如何简化异步编程模型、提高UI线程的响应性,以及减少内存消耗。我们将通过具体案例分析,了解如何在实际项目中有效地使用协程,从而帮助开发者构建更加高效的Android应用程序。
|
4天前
|
Java 开发工具 Android开发
如何在Eclipse中查看Android源码或者第三方组件包源码(转)
如何在Eclipse中查看Android源码或者第三方组件包源码(转)
13 4
|
4天前
|
Android开发
Android应用实例(一)之---有道辞典VZ.0
Android应用实例(一)之---有道辞典VZ.0
10 2
|
6天前
|
机器学习/深度学习 Java Shell
[RK3568][Android12.0]--- 系统自带预置第三方APK方法
[RK3568][Android12.0]--- 系统自带预置第三方APK方法
26 0
|
12小时前
|
移动开发 Android开发 开发者
构建高效Android应用:探究Kotlin协程的优化实践
【5月更文挑战第13天】 在移动开发领域,Android平台的流畅体验至关重要。随着Kotlin语言的普及,协程作为其核心特性之一,为异步编程提供了简洁且高效的解决方案。本文将深入探讨Kotlin协程在Android应用中的优化使用,从基本概念到实际案例分析,旨在帮助开发者构建更加响应迅速、性能卓越的应用。我们将通过对比传统线程与协程的差异,展示如何利用协程简化代码结构,并通过优化实践减少资源消耗,提升用户体验。
|
1天前
|
移动开发 监控 Android开发
构建高效Android应用:Kotlin协程的实践与优化
【5月更文挑战第12天】 在移动开发领域,性能与响应性是衡量一个应用程序优劣的关键指标。特别是在Android平台上,由于设备的多样性和系统资源的限制,开发者需要精心编写代码以确保应用流畅运行。近年来,Kotlin语言因其简洁性和功能性而广受欢迎,尤其是其协程特性,为异步编程提供了强大而轻量级的解决方案。本文将深入探讨如何在Android应用中使用Kotlin协程来提升性能,以及如何针对实际问题进行优化,确保应用的高效稳定执行。
|
3天前
|
Java Android开发
Android开发--Intent-filter属性详解
Android开发--Intent-filter属性详解
|
3天前
|
物联网 Java 开发工具
安卓应用开发:打造未来移动生活
【5月更文挑战第10天】 随着科技的飞速发展,智能手机已成为我们日常生活中不可或缺的一部分。作为智能手机市场的两大巨头,安卓和iOS分别占据了一定的市场份额。在这篇文章中,我们将重点关注安卓应用开发,探讨如何利用先进的技术和创新思维,为用户打造更加便捷、智能的移动生活。文章将涵盖安卓应用开发的基本概念、关键技术、以及未来发展趋势等方面的内容。
|
4天前
|
XML Java Android开发
如何美化android程序:自定义ListView背景
如何美化android程序:自定义ListView背景
|
4天前
|
开发工具 Android开发 Windows
Android应用] 问题2:ERROR: unknown virtual device name:
Android应用] 问题2:ERROR: unknown virtual device name: