0

我已经在 SO 上查找了类似的帖子。我添加了 splash.java 类、splash_layout.xml 文件,

我有 2 个应用程序图标出现在桌面模拟器上,并且启动画面在那里,但是 2 个图标不好 我怀疑它是关于清单的,我应该在其中作为 android.MAIN、android.DEFAULT 放什么?

这是我的 android manifest.xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.kaban.it_ebooksinfomobile" >

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

<application
    android:allowBackup="true"
    android:icon="@drawable/logo"
    android:label="@string/app_name"
    android:theme="@style/Theme.Book">


    <something must be here for splash screen before MainActivity...>

    <activity
        android:name=".MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

这是启动 java 文件:

package com.example.kaban.it_ebooksinfomobile;

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

public class SplashScreen extends Activity {


    private final int SPLASH_DISPLAY_LENGTH = 1000;
    private static boolean splashLoaded = false;


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

        if(!splashLoaded){
            setContentView(R.layout.splashscreen);
            splashLoaded = true ;

        /* New Handler to start the Menu-Activity
         * and close this Splash-Screen after some seconds.*/
            new Handler().postDelayed(new Runnable(){
                @Override
                public void run() {
                /* Create an Intent that will start the Menu-Activity. */
                    startActivity(new Intent(SplashScreen.this, MainActivity.class));
                    finish();
                }
            }, SPLASH_DISPLAY_LENGTH);
        }
        else {
            Intent goToMainActivity = new Intent(SplashScreen.this, MainActivity.class);
            goToMainActivity.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
            startActivity(goToMainActivity);
            finish();
        }

    }
}

但它仍然没有加载我的飞溅!它曾经加载,但在虚拟模拟器桌面上有 2 个应用程序图标,这很愚蠢。我认为将 .SplashActivity 作为启动器是不对的,我已经这样做了:

<activity
            android:name=".HomeScreen"
            android:label="@string/app_name" >>     
        </activity>

        <activity
            android:name=".Splash"
            android:label="@string/title_activity_splash_screen" >>     
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />>     
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        < /activity>
4

5 回答 5

5

尝试这个:

    <activity
        android:name=".SplashScreen">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />                
        </intent-filter>
    </activity>
于 2015-03-25T10:30:53.287 回答
2

看看这个:

<activity android:name=".MainActivity" />
    <activity
        android:name=".SplashActivity"
        android:configChanges="orientation|keyboardHidden|screenSize"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

这是我用于 SplashActivity 的类,它与你的类似,但将处理程序声明为匿名我用 Wea​​kReference 编写了一个内部类,看看

public class SplashActivity extends Activity {

//Private declarations
private InternalHandler mHandler;
private long mStartTime;


//Constants
private static final int GO_AHEAD = 1;
private static final long MAX_TIME = 1500L;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);
    mStartTime = SystemClock.uptimeMillis();
    mHandler = new InternalHandler(this);

}

@Override
protected void onStart(){
    super.onStart();
    final Message goAHeadMessage = mHandler.obtainMessage(GO_AHEAD);
    mHandler.sendMessageAtTime(goAHeadMessage, mStartTime + MAX_TIME);

}

private void endSplash(){
    Intent main = new Intent(this, MainActivity.class);
    startActivity(main);
    finish();

}



private static class InternalHandler extends Handler {

    private WeakReference<SplashActivity> mSAWeakRef;

    public InternalHandler(SplashActivity mSARef){
        this.mSAWeakRef = new WeakReference<SplashActivity>(mSARef);
    }

    @Override
    public void handleMessage(Message msg){
        final SplashActivity mActivity = mSAWeakRef.get();
        if (mActivity == null)
            return;
        switch (msg.what){
            case GO_AHEAD:
                long elapsedTime = SystemClock.uptimeMillis() - mActivity.mStartTime;
                if (elapsedTime >= MAX_TIME) {
                    mActivity.endSplash();
                }
                break;
        }
    }
}

}

于 2015-03-25T10:51:40.027 回答
1

您无需提及意图过滤器。

只需声明 Activity 单独。

 <activity
    android:name=".MainActivity"
    android:label="@string/app_name" >
</activity>
于 2015-03-25T10:31:51.840 回答
1

请使用这个:

SplashView.java

import com.studentconnection.Presenter.SplashPresenter;

import android.os.Bundle;

public class SplashView extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.splash_view);
    new SplashPresenter(this);
}

}

SplashPresenter.java

import com.studentconnection.View.SigninView;
import com.studentconnection.View.SplashView;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Handler;
import android.os.Message;

public class SplashPresenter {
private SplashView mSplashView;
private static final int WAIT_TIME = 3000;
private static final int HANDLER_MSG = 1;
@SuppressLint("HandlerLeak")
private Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        switch (msg.what) {
        case HANDLER_MSG:
            Intent mMainActivity = new Intent(mSplashView,
                    MainActivity.class);
            mMainActivity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                    | Intent.FLAG_ACTIVITY_CLEAR_TASK);
            mSplashView.startActivity(mMainActivity);
            break;

        default:
            break;
        }
    }
};

public SplashPresenter(SplashView mSplashView) {
    this.mSplashView = mSplashView;
    callHandler();
}

public void callHandler() {
    handler.sendEmptyMessageDelayed(HANDLER_MSG, WAIT_TIME);
}

}

主播

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

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="18" />

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

<application
    android:name="com.studentconnection.Support.AppStorage"
    android:allowBackup="true"
    android:icon="@drawable/app_logo"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".SplashView"
        android:label="@string/app_name"
        android:screenOrientation="portrait"
        android:theme="@android:style/Theme.Light.NoTitleBar" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:screenOrientation="portrait"
        android:theme="@android:style/Theme.Light.NoTitleBar" >
    </activity>
</application>

</manifest>

希望这会奏效..

于 2015-03-25T10:51:38.637 回答
0

ok,我偷懒没放日志,现在发现问题了,如果你这样做:

<manifest>
<uses-permission android:name="android.permission.INTERNET" />

<application
    android:allowBackup="true"
    android:icon="@drawable/logo"
    android:label="@string/app_name"
    android:theme="@style/Theme.Book">

    <activity
        android:name=".SplashScreen"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

    //other activities i have here...
    <activity> ..... </activity>
    <activity> ..... </activity>

    </manifest>

它不知道 MainActivity 在哪里,它总是以 .SplashScreen 开头,但没有提到 MainAcitivty,所以把这个(我不确定顺序很重要)放在启动活动标签之后,你的清单看起来像这样:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"    

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

<application
    android:allowBackup="true"
    android:icon="@drawable/logo"
    android:label="@string/app_name"
    android:theme="@style/Theme.Book">

    <activity
        android:name=".SplashScreen"
        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=".MainActivity"
        android:label="@string/app_name" >
    </activity>

所以它知道在启动画面消失后它必须去的 Mainactivity。

于 2015-03-25T10:49:40.303 回答