【问题标题】:How can I start MAIN activity with the help of <intent-filter>?如何在 <intent-filter> 的帮助下启动 MAIN 活动?
【发布时间】:2012-07-28 17:21:45
【问题描述】:

当我以这种方式宣布我的主要活动时:

<activity android:name=".MyActivity"
          android:configChanges="orientation|keyboardHidden"
          android:windowSoftInputMode="stateHidden"
          android:screenOrientation="portrait">
    <intent-filter>
          <action android:name="android.intent.action.MAIN"/>
          <action android:name="com.package.name.MyActivity"/>
          <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

然后我在使用此代码时收到错误No Activity found to handle Intent { act=com.package.name.MyActivity flg=0x24000000 }

Intent intent = new Intent("com.package.name.MyActivity");
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(intent);

如果不使用Intent i = new Intent(this, MyActivity.class);,我该如何在action for &lt;intent-filter&gt; 的帮助下做到这一点

没有帮助:

 <intent-filter>
      <action android:name="android.intent.action.MAIN"/>
      <action android:name="com.package.name.VIEW"/>
      <category android:name="android.intent.category.LAUNCHER" />
 </intent-filter>

代码:

Intent intent = new Intent("com.package.name.VIEW");
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(intent);

【问题讨论】:

  • 创建自定义“操作”,例如 com.package.name.ACTION_VIEW,并按照 Jeffery Blatman 的建议,删除 com.package.name.MyActivity 的“操作”。然后,您只需使用自定义操作来启动 Activity
  • 我更改了代码,但对我没有帮助。我哪里做错了?

标签: android intentfilter


【解决方案1】:

尝试指定两个意图过滤器:

<activity android:name=".MyActivity"
          android:configChanges="orientation|keyboardHidden"
          android:windowSoftInputMode="stateHidden"
          android:screenOrientation="portrait">
    <intent-filter>
          <action android:name="android.intent.action.MAIN"/>
          <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    <intent-filter>
          <action android:name="com.package.name.MyAction"/>
          <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>

然后你可以使用动作名称启动活动:

Intent intent = new Intent("com.package.name.MyAction");
context.startActivity(intent);

或类名:

Intent intent = new Intent(context, MyActivity.class);
context.startActivity(intent);

【讨论】:

  • Intent intent = new Intent("com.package.name.MyAction"); context.startActivity(intent); 没有帮助(找不到处理 Intent 的活动):( 使用类名工作,但我想使用 动作名
  • @Svyatoslav:我非常有信心这里给出的答案是正确的,并且您错误地实施了解决方案。
  • @CommonsWare 我发现当第二个 &lt;intent-filter&gt; 包含 else 时使用 action name 可以工作.
  • @Svyatoslav:啊,是的,我很抱歉。如果没有指定其他类别,startActivity() 总是将 CATEGORY_DEFAULT 添加到 Intent。因此,&lt;activity&gt;&lt;intent-filter&gt; 始终需要 &lt;category&gt;,无论是 DEFAULT 还是其他。
  • 答案已编辑以添加默认类别。很抱歉忘记了。
【解决方案2】:

action 标记中的name 属性是操作的名称,而不是您的活动的名称。删除线,

  <action android:name="com.package.name.MyActivity"/>

由于意图过滤器标签位于您的活动标签下,系统已经知道它已应用于该活动。

【讨论】:

  • 所以我将有两行 &lt;action android:name="android.intent.action.MAIN"/&gt; &lt;category android:name="android.intent.category.LAUNCHER"/&gt;。我必须在 java 代码中写什么?
  • 你不需要用java写任何东西。该意图过滤器将显示一个链接到该活动的启动器图标。
【解决方案3】:

你的班级名称不是com.package.name.MyActivity,而是com.package.name.general.MyActivity

避免这个错误的一个简单方法是使用类而不是包名来创建新的 Intent。您可以使用自动完成来填写正确的班级。

您说您不想通过指定类来创建 Intent。我想知道为什么不——我认为这是一个好方法。

【讨论】:

    猜你喜欢
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    • 2018-05-10
    • 1970-01-01
    • 1970-01-01
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多