当前位置: 代码迷 >> Android >> Android 中的意图过滤器是什么?
  详细解决方案

Android 中的意图过滤器是什么?

热度:98   发布时间:2023-08-04 09:43:09.0

在我的 android 应用程序中,我想从初始活动“A”开始一个活动“B”。 我已经为这两个类创建了类。 但是,当使用以下代码启动 B 时,出现运行时错误: application has stopped unexpectedly, try again 这是我的代码:

Intent myIntent = new Intent(this, AddNewActivity.class);
startActivity(myIntent); 

当我在AndroidManifest.xml/manifest/application/activity/intent-filers为活动 B 添加一个新条目时,应用程序就工作了。

我有两个问题:

  • AndroidManifest.xml有多个 Activity 条目时,android 如何知道首先启动哪个 Activity?
  • 我无法理解意图过滤器。 任何人都可以请解释。

这是我的部分AndroidManifest.xml

<application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".ListAllActivity"
              android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".AddNewActivity" android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

Intent 过滤器是应用程序清单文件中的一个表达式,用于指定组件希望接收的 Intent 类型。

当您创建一个隐式 Intent 时,Android 系统会通过将 Intent 的内容与设备上其他应用程序的清单文件中声明的 Intent 过滤器进行比较来找到合适的组件来启动。 如果意图与意图过滤器匹配,则系统启动该组件并将其传递给意图对象。

AndroidManifest.xml

<activity android:name=".HelloWorld"
    android:label="@string/app_name">
    <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" android:host="androidium.org"/>
    </intent-filter>
</activity>

启动HelloWorld

Intent intent = new Intent (Intent.ACTION_VIEW, Uri.parse("http://androidium.org"));
startActivity(intent);

当AndroidManifest.xml中有多个activity条目时,android如何知道哪个activity先启动?

没有“第一”。 在你的情况下,你的清单如图所示,你的启动器中有两个图标。 用户点击哪一个就是启动的那个。

我无法理解意图过滤器。 任何人都可以请解释。

有很多的。 请考虑阅读该内容,然后提出更具体的问题。

此外,当您收到“应用程序意外停止,再试一次”时,请使用adb logcat 、DDMS 或 Eclipse 中的 DDMS 透视图检查与错误关联的 Java 堆栈跟踪。

当您创建一个隐式 Intent 时,Android 系统会通过将 Intent 的内容与设备上其他应用程序的清单文件中声明的 Intent 过滤器进行比较来找到合适的组件来启动。 如果意图与意图过滤器匹配,则系统启动该组件并将其传递给意图对象。 如果多个意图过滤器兼容,系统会显示一个对话框,以便用户可以选择要使用的应用程序。

Intent 过滤器是应用程序清单文件中的一个表达式,用于指定组件希望接收的 Intent 类型。 例如,通过为 Activity 声明一个 Intent 过滤器,您可以让其他应用程序直接使用某种 Intent 启动您的 Activity。 同样,如果您没有为活动声明任何意图过滤器,则它只能以显式意图启动。

根据:

首先更改xml,将您的第二个活动标记为DEFAULT

<activity android:name=".AddNewActivity" android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

现在您可以使用 StartActivity 方法启动此活动。

如果您的应用程序打开,您希望它成为第一个屏幕的Activity ,然后在意图类别中将其作为 LAUNCHER 提及,其余活动在意图类别中提及默认。

例如:- 有 2 个活动 A 和 B
活动 A 是 LAUNCHER,因此将其设置为意图类别中的 LAUNCHER,而 B 是活动 A 的子项,因此将其设置为 DEFAULT。

<application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".ListAllActivity"
              android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".AddNewActivity" android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
</application>

意图过滤器是出现在您的应用程序清单中的表达式,用于指定组件要接收的意图类型。 如果组件没有任何意图过滤器,它可以接收明确的意图。 如果组件带有过滤器,则同时接收隐式和显式意图

不可能有两个 Lancher AFAIK。 Logcat 是一个有用的工具,用于在后台调试和检查应用程序/机器状态。 从一项活动切换到另一项活动时,它将是自动的。

使用键MAINLAUNCHER保留第一个意图过滤器,并添加另一个作为ANY_NAMEDEFAULT

您的LAUNCHER将是活动 A,而DEFAULT将是您的活动 B。

如果可能,请尝试这个即时解决方案:

Intent intent =new Intent(getApplicationBaseContext,second_Act.class);
StartActivity(intent);

当有多个活动设置为 main 和启动器时,清单中有一个意图过滤器。 然后第一个活动被视为启动器活动,并且android启动或打开第一个活动。

<category android:name="android.intent.category.LAUNCHER" />  

上面的代码使设备菜单中的应用程序图标可用,因此如果我们在清单中声明 2 个启动器活动,将在设备应用程序菜单中创建 2 个应用程序图标。

所以会有 2 个应用程序图标,点击第一个图标,清单中第一个声明的活动将被启动,然后点击另一个第二个声明的活动被启动

  相关解决方案