15

Well I searched a lot, but I didn't find a precise answer how to export an Activity, so an app can start it with startActivityforResult.

How do I achieve that? Do I have to change the Manifest in some ways?

Force
  • 6,312
  • 7
  • 54
  • 85

2 Answers2

32

As an alternate to Dalmas' answer, you can actually export an Activity without creating an <intent-filter> (along with the hassle of coming up with a custom action).

In the Manifest edit your Activity tag like so:

<activity
    android:name=".SomeActivity"
    ....
    android:exported="true" />

The important part is android:exported="true", this export tag determines "whether or not the activity can be launched by components of other applications". If your <activity> contains an <intent-filter> then this tag is set to true automatically, if it does not then it is set to false by default.

Then to launch the Activity do this:

Intent i = new Intent();
i.setComponent(new ComponentName("package name", "fully-qualified name of activity"));
startActivity(i);

Of course with this method you will need to know the exact name of the Activity you are trying to launch.

Tony Chan
  • 8,017
  • 4
  • 50
  • 49
  • 1
    thanks so much! my app suddenly started throwing this error even after making an inconsequential change, even after I removed that change, but this fixed that! – Michael Nov 09 '16 at 18:21
  • very good specification about the default behavior. An external app was saying that the main activity of my app was exported and I couldn't understand why until I read your answer... have a good day! – Antonino Jul 27 '17 at 06:35
15

You need to declare an intent-filter in your Manifest (I took the following example from Barcode Scanner) :

<activity android:name="...">
    <intent-filter>
        <action android:name="com.google.zxing.client.android.SCAN" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

Then create an intent with the same action string :

Intent intent = new Intent("com.google.zxing.client.android.SCAN");
startActivityForResult(intent, code);

Android should start your activity (or it will show a drop-down box if there are multiple apps sharing the same action string).

Dalmas
  • 26,409
  • 9
  • 67
  • 80
  • Thanks, I just read through the Barcodescanner Manifest and found out the same thing. :] – Force Nov 16 '11 at 10:45