开发者

How are Intent-Categories matched?

开发者 https://www.devze.com 2023-01-14 17:15 出处:网络
I don\'t get the Android Intent matching concept! I must be missing something, but I read and re-read the docs and don\'t get it. Maybe some kind soul can shed some light on this?

I don't get the Android Intent matching concept! I must be missing something, but I read and re-read the docs and don't get it. Maybe some kind soul can shed some light on this?

I am able to start an Activity if I specify a Category filter android.intent.category.DEFAULT in the manifest:

    ...
    <activity 
        android:name="mmmo.android.test.ItemDetails"
        <intent-filter>
            <action android:name="android.intent.action.INSERT" />
            <category android:name="android.int开发者_如何学Pythonent.category.DEFAULT" />
        </intent-filter>
    </activity>
    ...

and if I then don't add any Category to the Intent object:

        ...
        Intent intent = new Intent(Intent.ACTION_INSERT);
        startActivity(intent);
        ...

That works. However, as soon as I define any other category than android.intent.category.DEFAULT I am only getting ActivityNotFoundExceptions. E.g. if I specify:

    ...
    <activity 
        android:name="mmmo.android.test.ItemDetails"
        <intent-filter>
            <action android:name="android.intent.action.INSERT" />
                    <category android:name="foo.bar" />
        </intent-filter>
    </activity>
    ...

and then try to start that Activity using:

        ...
        Intent intent = new Intent(Intent.ACTION_INSERT);
        intent.addCategory("foo.bar"); 
        startActivity(intent);
        ...

this does not work. The doc reads "... every category in the Intent object must match a category in the filter. ...". The category name I add to the Intent matches the category I specified in the filter. So why does this not match up and just throws an exception???

Michael


You must also add

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

to the intent filter for the intent to be resolved.

See Intent:

Activities will very often need to support the CATEGORY_DEFAULT so that they can be found by Context.startActivity().


From the documentation:

In principle, therefore, an Intent object with no categories should always pass this test, regardless of what's in the filter. That's mostly true. However, with one exception, Android treats all implicit intents passed to startActivity() as if they contained at least one category: "android.intent.category.DEFAULT" (the CATEGORY_DEFAULT constant). Therefore, activities that are willing to receive implicit intents must include "android.intent.category.DEFAULT" in their intent filters

A "bug" is present if the observable behaviour does not match its documented one. This one does not a bug make.

0

精彩评论

暂无评论...
验证码 换一张
取 消