Before I ask my question I saw android intent filter?
and Android: Activity not registered in the manifest
also I searched this
,but I could not find my answer.
In my App,I have to start Activty1
form IntentFilterActivity
(both are Activities) with implicit Intent
.Here is my code:
Manifest
<?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); } }); } }
Activity1
package com.your.namespace; public class Activity1 extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main1); } }
First I had one button(say b2
) in R.layout.main
and in it's onClick event I tried to start Activity1 with implicit Intent.But when I click it I get this error:
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=com.your.namespace.MY_MAIN cat=[com.your.namespace.MY_LAUNCHER] }
So I added another Buuton(say b1
) to R.layout.main
and in it's onClick event,I tried to start Activity1 with explicit Intent and Activity1 started fine.So my problem is in about registering Activity1 in manifest.
I tried to change package name,clean/build project,creating a new project and starting from there,importing the project in eclipse on a different computer,restarting eclipse and ... but I get error.My project has only one package(com.your.namespace
).
What do I do wrong?Please help me to solve this problem.
Edit:
When I change Intent filter of Activty1 to this:
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
and run App, Application's icon appears twice in Launcher
!This is strange,one intent filter seems to be ignored and another filter,not.
try this:
<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>
notice the change: android.intent.category.DEFAULT
Should work.