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);
    }
    }
    

最初に1つのボタン(たとえばb2)がR.layout.mainあり、そのonClickイベントで暗黙のインテントを使用してActivity1を開始しようとしましたが、クリックすると次のエラーが発生します:

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

そこで、別のBuuton(say b1)をR.layout.mainonClickイベントに追加し、明示的なインテントでActivity1を開始しようとしましたが、Activity1は正常に開始されました。問題は、Activity1をマニフェストに登録することです。
パッケージ名を変更し、プロジェクトをクリーンアップ/ビルドし、新しいプロジェクトを作成してそこから開始し、別のコンピューターでEclipseにプロジェクトをインポートし、Eclipseを再起動して...エラーが発生します。私のプロジェクトにはパッケージが1つしかありません(com.your.namespace) 。
私は何を間違えますか?この問題を解決するのを手伝ってください。
編集
Activty1のインテントフィルターをこれに変更すると:

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

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

アプリを実行すると、アプリケーションのアイコンが2回表示されLauncherます!これは奇妙なことです。1つのインテントフィルターは無視され、別のフィルターは無視されているようです。

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オブジェクトは、フィルタの内容に関係なく、常にこのテストに合格する必要があります。それはほとんど真実です。ただし、1つの例外を除いて、Androidは、startActivity()に渡されたすべての暗黙的なインテントを少なくとも1つのカテゴリ「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 に答える