意图过滤器
系统使用意图过滤器来尝试查找已安装的应用程序组件,这些组件可以接收系统试图解析的意图,即当意图没有指定特定的组件类作为目标时。例如,如果您这样做...
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivity(intent);
系统没有明确指示要启动哪个 Activity(或 Service,或 BroadcastReceiver)。它必须找到一些能够解析 Intent 的组件,并使用声明<intent-filter>
的 s 来执行此操作。通常,能够捕获图像的应用程序(如相机应用程序)将声明其活动处理此操作。
当您单击应用程序的启动器图标时,启动器基本上会创建一个这样的 Intent:
Intent mainIntent = new Intent(Intent.ACTION_MAIN);
mainIntent.setCategory(Intent.CATEGORY_LAUNCHER);
mainIntent.setPackage(/* your package */);
startActivity(mainIntent);
结果是系统试图在该包中找到一个组件,<intent-filter>
其中指定了<action android:name="android.intent.action.MAIN" />
和<category android:name="android.intent.category.LAUNCHER">
。
public static void main()
简而言之,它与Java中典型的存在完全无关。
XML
当系统在运行时加载一个 XML 文件(如布局文件)时,它实际上会根据通过解析文件找到的信息来创建 Java 对象。以布局为例,所有不同的 XML 标签(例如<ImageView>
)都有对应的 java 类(android.widget.ImageView
),并且您可以使用 XML 属性设置的大多数属性也可以使用这些视图上的公共方法进行设置。
如果您愿意,您可以通过自己实例化它们并使用set[Property]()
方法来完全用 Java 构建 Activity 的布局,这实际上是系统为您做的事情:
public void onCreate(Bundle saved) {
super.onCreate(saved);
LinearLayout layout = new LinearLayout(this);
layout.setPadding(20, 20, 20, 20);
layout.setOrientation(LinearLayout.VERTICAL);
TextView text = new TextView(this);
text.setTextSize(18);
text.setTextColor(Color.MAGENTA);
text.setText(R.string.hello_world);
layout.addView(text, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
setContentView(layout);
}
XML drawables 也会发生类似的事情,尽管在 Java 中创建它们有很大不同。
简而言之,您可以在 XML 中执行的许多操作也可以在 Java 中执行,但它也有缺点(例如,您失去了操作系统提供的自动资源处理)。