Android: Start Activity from preferences.xml

56,067

Solution 1

I was having the same issue. I got this working by only declaring the action in my AndroidManifest.xml, as such:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.example.myapp" android:versionName="1.3" android:versionCode="4">

...

    <activity android:name=".activities.MyActivity" 
              android:label="@string/my_activity_title"
              android:theme="@android:style/Theme.Black.NoTitleBar">
        <intent-filter>
           <action android:name="com.example.myapp.activities.MyActivity" />
           <category android:name="android.intent.category.DEFAULT" />
       </intent-filter>
    </activity>

Then in my Preferences xml file:

<PreferenceCategory
        android:title="@string/my_activity_title">
    <PreferenceScreen
        android:title="@string/my_activity_title" 
        android:summary="@string/my_activity_title">
        <intent android:action="com.example.myapp.activities.MyActivity"/>
    </PreferenceScreen>
</PreferenceCategory>

Solution 2

I believe <intent> tag must be inside <Preference>, not <PreferenceScreen>.

<PreferenceCategory 
    android:title="@string/titleEtcSetup">
    <Preference
        android:key="renameCourses"
        android:title="@string/titleRenameCourses"
        android:summary="@string/textRenameDisplayedCoursesNames">
        <intent
             android:action="android.intent.action.VIEW"
             android:targetPackage="my.notifier.ui"
             android:targetClass="my.notifier.ui.EditCoursesNamesActivity" />         
    </Preference>
.....
</PreferenceCategory>

Solution 3

Caution! The value of targetPackage should be the package id of the app, as declared in the root element of your AndroidManifest.xml file (which you define in your Gradle build file). It is not necessary the same as the Java package of your Activity class (people usually put them in a subpackage of "ui").

So in your specific case, I bet you the targetPackage should be "my.notifier", not "my.notifier.ui" (I would have to see the manifest to be sure).

Solution 4

No need to add IntentFilter. You can refer to activity by fully qualified name:

<intent android:targetPackage="my.notifier.ui"
    android:targetClass="my.notifier.ui.EditCoursesNamesActivity"/>

Solution 5

When I had this problem it was because I had made a sub-package for my activities. When I moved it into the root package the Preference screen could launch it.

Share:
56,067
Lama
Author by

Lama

Updated on February 01, 2020

Comments

  • Lama
    Lama over 4 years

    I would like to start an Activity from a default preferences.xml, with < intent > tag. The Activities are well tested, the problem is not with that. (I'm extending PreferenceActivity in my app, so the preferences.xml is "comes" with that) Please look at the code, what's wrong?

    preferences.xml:

    .... 
    <PreferenceCategory 
        android:title="@string/titleEtcSetup">
        <PreferenceScreen
            android:key="renameCourses"
            android:title="@string/titleRenameCourses"
            android:summary="@string/textRenameDisplayedCoursesNames">
            <intent
                 android:action="android.intent.action.VIEW"
                 android:targetPackage="my.notifier.ui"
                 android:targetClass="my.notifier.ui.EditCoursesNamesActivity" />         
        </PreferenceScreen>
    .....
    </PreferenceCategory>
    ..... 
    

    manifest.xml:

    ....
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="my.notifier.ui"....
    ....
    <activity android:name=".EditCoursesNamesActivity" android:label="@string/titleRenameCourses">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
     .....
    

    The Activity isn't calling when I press the "renameCourses item", nothing happens. The LogCat is "clear", no errors or warnings. I was searching a lot, and I didn't find a solution, maybe I just missed something... Please help!

  • Lama
    Lama almost 13 years
    Thanks for the post! But everything still the same in that way too. (btw: I used build-in API Demos at base to create the code, and it contains intent tags in PreferenceScreen)
  • Michael
    Michael almost 13 years
    I've tried this code on my Samsung Galaxy S and it works fine. What Android version have you tried this on?
  • Lama
    Lama almost 13 years
    I've tried it on AVD, all of the 7 API bethween version 4-10. I have no idea what could be the problem... :(
  • Lama
    Lama almost 13 years
    ...I'd like to ask you: please trie it with the <PreferenceScreen> tag. Maybe it works on your device too...
  • Michael
    Michael almost 13 years
    Yes, it did. I changed names and replaced string references with strings but I don't think these changes made it work.
  • Lama
    Lama almost 13 years
    Than, I really have no idea...:(
  • nmr
    nmr over 10 years
    As far as I can tell, any other app which responds to action .activities.MyActivity will also be eligible to field the started Intent. Which is sorta undesirable, particularly if you have Free/Pro versions of your app.
  • Fred
    Fred over 10 years
    Thanks, you are right. You don't need any <intent-filter>.
  • Morten Holmgaard
    Morten Holmgaard almost 10 years
    Keep this in mind when using different buildtypes/productFlavors with gradle!
  • TWiStErRob
    TWiStErRob almost 10 years
    @MortenHolmgaard that's it! But then how do you reference the package (for example: buildTypes.debug.applicationIdSuffix = ".debug")
  • Morten Holmgaard
    Morten Holmgaard almost 10 years
    @TWiStErRob you should reference your basepackage - to my knowledge you will get your buildtype specific file if you have a special one included, depending on you Bbuild Variant.
  • wsgeorge
    wsgeorge almost 9 years
    I'm using product flavours. android:targetPackage should be the applicationId NOT the package Id. Just thought we should be clear on the terminology so we don't confuse anyone.
  • Brais Gabin
    Brais Gabin over 8 years
    @BoD please, update this answer pointing out that now the important package is the one in your gradle, not in your Manifest.
  • Eric
    Eric about 8 years
    I just had the same problem, but I found a different solution. lets say my Activity is at com.example.subpackage.Activity...then the intent element should look like <intent android:targetPackage="com.example" android:targetClass="com.example.subpackage.Activity"/>
  • Kornilov Ruslan
    Kornilov Ruslan over 6 years
    This one is the best one. Worked for me.
  • Style-7
    Style-7 almost 5 years
    @Tim Stack I am not agree.
  • Tim Stack
    Tim Stack almost 5 years
    You can't disagree, it's just how it is. An answer with code only is not considered a good answer and gets picked up by the review system to be reviewed for quality