2

在我问我的问题之前,我看到android intent filter?Android: Activity not registered in the manifest搜索了this,但我找不到我的答案。
在我的应用程序中,我必须以 . 开始Activty1表单IntentFilterActivity(两者都是活动)。这implicit Intent是我的代码:

  • 显现

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.your.namespace"
    android:versionCode="1"
    android:versionName="1.0" >
    
    <uses-sdk android:minSdkVersion="2" />
    
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:label="@string/app_name"
            android:name=".IntentFilterActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />
    
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:label="Activity1"
            android:name="com.your.namespace.Activity1" >
            <intent-filter >
                <action android:name="com.your.namespace.MY_MAIN"/>
    
                <category android:name="com.your.namespace.MY_LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>
    
    </manifest>
    
  • IntentFilterActivity

    package com.your.namespace;
    
    public class IntentFilterActivity extends Activity {
    protected String action = "com.your.namespace.MY_MAIN";
    protected String category = "com.your.namespace.MY_LAUNCHER";
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button b1 = (Button) findViewById(R.id.button1);
        b1.setOnClickListener(new OnClickListener() {
    
            @Override
            public void onClick(View v) {
    
                Intent i = new Intent(IntentFilterActivity.this,Activity1.class);
                IntentFilterActivity.this.startActivity(i);
            }
        });
    
        Button b2 = (Button) findViewById(R.id.button2);
        b2.setOnClickListener(new OnClickListener() {
    
            @Override
            public void onClick(View v) {
                Intent i = new Intent();
                i.setAction(action);
                i.addCategory(category);
                IntentFilterActivity.this.startActivity(i);
            }
        });
    }
    }       
    
  • 活动1

    package com.your.namespace;
    
    public class Activity1 extends Activity {
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main1);
    }
    }
    

首先,我有一个按钮(比如说b2),R.layout.main在它的 onClick 事件中,我尝试使用隐式 Intent 启动 Activity1。但是当我单击它时,我收到了这个错误:

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=com.your.namespace.MY_MAIN cat=[com.your.namespace.MY_LAUNCHER] }

因此,我在 onClick 事件中添加了另一个 Buuton(例如b1R.layout.main,我尝试使用显式 Intent 启动 Activity1,并且 Activity1 启动良好。所以我的问题在于在清单中注册 Activity1。
我试图更改包名称,清理/构建项目,创建一个新项目并从那里开始,在另一台计算机上的 eclipse 中导入项目,重新启动 eclipse 和......但我得到错误。我的项目只有一个包(com.your.namespace) .
我做错了什么?请帮我解决这个问题。
编辑
当我将 Activty1 的 Intent 过滤器更改为:

<intent-filter >
        <action android:name="android.intent.action.MAIN" />

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

并运行应用程序,应用程序的图标出现两次Launcher!这很奇怪,一个意图过滤器似乎被忽略了,另一个过滤器没有。

4

2 回答 2

0

尝试这个:

<activity
    android:label="Activity1" android:name="com.your.namespace.Activity1" >
    <intent-filter >
        <action android:name="com.your.namespace.MY_MAIN"/>

        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>

注意变化:android.intent.category.DEFAULT

应该管用。

于 2012-08-05T08:17:52.810 回答
0

感谢 Zelter Ady 的回答,我搜索了一下startActivity()"android.intent.category.DEFAULT"发现文档说:

因此,原则上,一个没有类别的 Intent 对象应该总是通过这个测试,不管过滤器中有什么。这大多是真的。但是,除了一个例外,Android 将所有传递给 startActivity() 的隐式意图视为至少包含一个类别:“android.intent.category.DEFAULT”(CATEGORY_DEFAULT 常量)。因此,愿意接收隐式意图的活动必须在其意图过滤器中包含“android.intent.category.DEFAULT”。(具有“android.intent.action.MAIN”和“android.intent.category.LAUNCHER”设置的过滤器是例外。它们标记开始新任务并在启动器屏幕上表示的活动。它们可以包括“android.intent .category.DEFAULT" 在类别列表中,但不要

我希望这可以帮助任何有同样问题的人。

于 2012-08-05T12:56:41.690 回答