请问有人能够解释一下Android操作系统中Intents的基本功能是什么吗?

3
我是Android应用程序编程的新手。就操作系统的一般架构而言,我知道进程被实现为Linux进程,并且每个进程都是沙盒式的。
然而,我对于使用的IPC和系统调用(如果有的话)感到非常困惑。我知道IBinder是其中一种形式;包裹在进程之间发送,而Bundle是包裹的数组形式(?)。但即使如此,这些还是很陌生。Intents也是一样。总的来说,我不明白实现了哪些IPC以及如何实现。
有没有人能够简要地解释一下用户级应用程序在Android操作系统中与彼此和操作系统通信所使用的具体方法?我已经进行过内核编程并尝试了Linux(Ubuntu和Debian)中的各种IPC,因此如果可以将其与我熟悉的内容联系起来解释,那将对我非常有帮助...
提前感谢!
2个回答

4

Android是一个面向服务的架构,这意味着设备上所有应用程序都由组件组成,这些组件使用高级消息(称为Intents)请求其他组件执行工作。虽然在幕后,跨应用程序发送的Intents使用了依赖于特殊的Android共享内存的Binder,但目标是让应用程序开发人员对实现毫不知情。唯一的要求是,当一个组件想要传递一个对象以及它的“意图”来请求另一个进程中的另一个组件执行工作时,该对象必须是可打包的(类似于可序列化)。此外,为了使应用程序能够使用其他应用程序的Intents,这些Intents必须在清单文件中发布,并使用Intent过滤器

一个想要触发网页显示的应用程序,其代码看起来像这样:

public class OpenInternet extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        ((Button) findViewById(R.id.OpenInternetButton))
                .setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        Intent i = new Intent(Intent.ACTION_VIEW, Uri
                                .parse("http://www.google.com"));
                        startActivity(i);
                    }
                });
    }
}

另一个能够通过显示网页来处理该意图的应用程序,在其清单文件中定义以下意图过滤器,以便捕获由其他应用程序发送的意图:
        <!-- For these schemes were not particular MIME type has been
             supplied, we are a good candidate. -->
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="http" />
            <data android:scheme="https" />
            <data android:scheme="about" />
            <data android:scheme="javascript" />
        </intent-filter>
        <!--  For these schemes where any of these particular MIME types
              have been supplied, we are a good candidate. -->
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.BROWSABLE" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="http" />
            <data android:scheme="https" />
            <data android:scheme="inline" />
            <data android:mimeType="text/html"/>
            <data android:mimeType="text/plain"/>
            <data android:mimeType="application/xhtml+xml"/>
            <data android:mimeType="application/vnd.wap.xhtml+xml"/>
        </intent-filter>

除了使用Intents,您还可以使用AIDL创建代理对象,这些对象允许您在进程边界上执行远程过程调用
由于您正在虚拟机中运行并且与libc相隔数层,因此您可能不需要担心libc如何执行syscalls。就“正常”IPC而言,您有套接字,但是由于被认为存在问题而被删除,因此您没有System V共享内存

1
在最基本的形式中,Intent 是一组数据,它被发送到指定对象的实例,以便它可以接收并执行某些操作。例如,您可能有一个来自 RSS 订阅的 URL,并且您想要在可能在应用程序内部或外部的浏览器中打开它。您将创建一个 Intent,包括您想要接收 Intent 的目标对象(Activity)和您想要发送到该对象的一些数据。对象可以具有接收器,接受 Intent,并注册,以便如果您创建一个 Intent,例如打开带有浏览器的 URL,Android 将识别您的“意图”是使用 Web 浏览器对象。由于您传递了一个 URL,因此浏览器应用程序可以接收并对其进行处理。Intent 非常灵活,可以是非常具体的消息,因此您可以向具有指定 ComponentName 的特定对象发送 Intent,或者您可以省略该选项,只添加一个类别,Android 将提示用户选择所有说他们是该类别对象的选项(例如,“Web 浏览器”),并将消息发送到用户选择的任何对象(再次,实际上只是一个 Activity)。
简而言之,您有:
  • MyActivity1 读取 RSS 源。
  • MyActivity1 创建一个意图,指定组件名称为 com.superawesome.MyWebBrowserActivity 和数据为 "http://www.stackoverflow.com"。
  • MyWebBrowserActivity 有一个接收器来接收意图并显示传递的 URL。

如果想了解更多关于意图的信息,请花一分钟阅读这篇文章,它非常值得:

Android Dev Guide: Intents and Intent Filters


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接