android.content.ActivityNotFoundException: No Acti

2019-01-19 10:10发布

问题:

I am having an issue with loading up a new intent after my splash screen. I have looked at questions relating to this exception but they all seem to be dealing with thing like google play or google maps not being referenced correctly this is not the case for me.

These are the related questions I have looked at

Not found activity to handle intent?

activity not found to handle intent

no activity found to handle intent

Below is my manifest code

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android.main"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="15" />
    <uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".Splash"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".HomePage"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.HOMEPAGE" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
        <activity
            android:name=".OrderPlaced"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.ORDERPLACED" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Here is the code for the class splash

package com.android.main;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

public class Splash extends Activity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash);

        Thread timer = new Thread(){
            public void run(){
                try{
                    sleep(1000);
                }catch(InterruptedException e) {
                    e.printStackTrace();
                }finally{
                    Intent openStartingPoint = new Intent("com.android.main.HOMEPAGE");
                    startActivity(openStartingPoint);
                }
            }
        };
        timer.start();
    }

    @Override
    protected void onPause() {

        super.onPause();
        finish();
    }


}

And here is the class HomePage I am trying to load after the splash screen

package com.android.main;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;

public class HomePage extends Activity {
    /** Called when the activity is first created. */


    TextView name;
    EditText editName;
    TextView drinks;
    Spinner drinksSpinner;
    TextView message;
    CheckBox checkbox;
    Button createOrderButton;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        createOrder();
    }

    public void createOrder(){

        createOrderButton = (Button) findViewById(R.id.bCreateOrder);
        createOrderButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                postInformationtoAPI();

            }

            private void postInformationtoAPI() {

                goToOrderCompleted();
            }

            private void goToOrderCompleted() {
                Intent intent = new Intent(HomePage.this , OrderPlaced.class);
                HomePage.this.startActivity(intent);
                Log.i("onClick", "trying to start new activity to change layout");
            }
        });

    }
}

The app force quits after loading the splash screen and gives the following exception

03-14 22:32:33.553: E/AndroidRuntime(3166): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=com.android.main.HOMEPAGE }

Any help with this would be greatly appreciated

回答1:

You have to differentiate the Intent's Constructor,

 Intent openStartingPoint = new Intent("com.android.main.HOMEPAGE");

Which assume com.android.main.HOMEPAGE as Intent's action Filter. Which is not available in your application's android manifest.xml file. You have

<action android:name="android.intent.action.HOMEPAGE" />

which should be,

<action android:name="com.android.main.HOMEPAGE" />

OR just change it with,

Intent openStartingPoint = new Intent(Splash.this, HOMEPAGE.class);


回答2:

        <activity
        android:label="@string/app_name"
        android:name=".SplashScreen"
        android:screenOrientation="landscape"
        android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
        <intent-filter >
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name="com.android.main.HOMEPAGE"
        android:screenOrientation="landscape"
        android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
        <intent-filter >
            <action android:name="com.android.main.HOMEPAGE" />

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

Also i would have a timer task to display splash screen

public class SplashScreen extends Activity{

Timer splashTimer;
SplashTimerHandler splashTimerHandler;

private boolean applicationPaused=false;

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    requestWindowFeature(Window.FEATURE_NO_TITLE);

    setContentView(R.layout.main);

    this.setSplash();


}

private void setSplash() 
{
    this.splashTimerHandler=new SplashTimerHandler();
    this.splashTimer=new Timer();

    this.splashTimer.schedule(this.splashTimerHandler, 0, 1000);

}

@Override
public void onPause()
{
    super.onPause();
    this.applicationPaused=true;
    this.closeSplashTimer();
}

@Override
public void onResume()
{
    super.onResume();

    if(this.applicationPaused)
    {
        this.applicationPaused=false;
        this.closeSplashTimer();
        this.setSplash();
    }
}

public class SplashTimerHandler extends TimerTask{

    int splashTimerCounter=0;
    @Override
    public void run()
    {
        splashTimerCounter++;
        if(splashTimerCounter>2)
        {
            runOnUiThread(splashTimeOver);
        }       
    }

    private Runnable splashTimeOver=new Runnable() {

        @Override
        public void run()
        {
            closeSplashTimer();
            startHomeScreen();
        }
    };      
}

protected void closeSplashTimer() 
{
    if(this.splashTimer!=null)
    {
        this.splashTimer.cancel();
        this.splashTimer=null;
    }

}

private void startHomeScreen() 
{
    this.closeSplashScreen();
    startActivity(new Intent("com.android.main.HOMEPAGE"));

}

private void closeSplashScreen()
{
    this.closeSplashTimer();
    this.finish();

}

@Override
public boolean onKeyDown(int keycode, KeyEvent event)
{
    if(keycode==KeyEvent.KEYCODE_BACK)
    {
        this.closeSplashScreen();
    }
    return true;
}   
}