2012-09-13 20 views
7

我需要为我的应用程序启动一个屏幕。 尝试创建一个具有我的闪屏图像的活动;并尝试使用for循环和Timer类来引入时间延迟。但它不会那样工作。 我做错了吗?如果是的话,什么是正确的方法?在Android应用程序中拥有启动画面的最佳方式?

+0

具体什么也没有关于定时器工作?这种方法应该可行。你能粘贴你的代码吗? –

+0

可能的重复http://stackoverflow.com/questions/8642730/splash-screen-in-android-application –

+0

如果它与另一个问题不同,你应该发布你的答案,或者如果它是相同的,删除帖子。 – Sababado

回答

16

上述解决方案很好,但如果用户在飞溅延迟结束之前按下后退键(并关闭了您的应用程序)会怎么样。 该应用程序可能仍会打开下一个活动,这不是真正用户友好的。

这就是为什么我使用自定义处理程序,并删除onDestroy()中的任何挂起的消息。

public class SplashActivity extends Activity 
{ 
    private final static int MSG_CONTINUE = 1234; 
    private final static long DELAY = 2000; 

    @Override 
    protected void onCreate(Bundle args) 
    { 
     super.onCreate(args); 
     setContentView(R.layout.activity_splash); 

     mHandler.sendEmptyMessageDelayed(MSG_CONTINUE, DELAY); 
    } 

    @Override 
    protected void onDestroy() 
    { 
     mHandler.removeMessages(MSG_CONTINUE);  
     super.onDestroy(); 
    } 

    private void _continue() 
    { 
     startActivity(new Intent(this, SomeOtherActivity.class)); 
     finish(); 
    } 

    private final Handler mHandler = new Handler() 
    { 
     public void handleMessage(android.os.Message msg) 
     { 
      switch(msg.what){ 
       case MSG_CONTINUE: 
        _continue(); 
        break; 
      } 
     } 
    }; 
} 
+0

我认为onPause是removeMessages()调用的更好选择。我发现onDestroy在生命周期中被调用得太晚,并且后面的Activity在点击后出现。 +1虽然:-) – barry

1

您可以延迟吗?

Thread delay = new Thread() { 
    @Override 
    public void run() { 
     try { 
      Thread.sleep(3000); 
     } catch (InterruptedException e) { 
     } 

     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       startNextActivity(); 
      } 
     }); 
    } 
}; 
3

试试这个

public class SplashActivity extends Activity { 
    Handler handler; 
    private long timeDelay = 2000; //2 seconds 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.SplashLayout); 
     final Intent i = new Intent(this, Landing.class); 
     handler = new Handler(); 
     handler.postDelayed(new Runnable() { 
      public void run() { 
       startActivity(i); 
       finish(); 
      } 
     }, timeDelay); 
    }  
} 
1

试试这个,

protected int _splashTime = 15000; 

private Handler handler; 
private Runnable runnable; 

private Context context; 


@Override 
public void onCreate(Bundle savedInstance) 
{ 
    super.onCreate(savedInstance); 
    setContentView(R.layout.splash); 

    final SplashScreen sPlashScreen = this; 

    handler = new Handler(); 

    runnable = new Runnable() { 
     @Override 
      public void run() { 
      try { 
       handler.removeCallbacks(runnable); 
       handler.postDelayed(runnable, _splashTime); 
       } 
      finally { 
       finish(); 
       //start a new activity 

       //mtdCheckLicense(); 
       Intent main = new Intent(); 
       main.setClass(sPlashScreen, YourMainActivity.class); 
       startActivity(main); 
       handler.removeCallbacks(runnable); 

      } 
     } 
    }; 
    handler.postDelayed(runnable, 2000); 
} 

它会溅了一段时间,推出的主要活动。在这段代码中,启动屏幕等待2秒,然后启动主要活动。

0

我为我的每一个项目做的最简单方法是如下:

public class SplashActivity extends Activity { 
    protected boolean active = true; 
    protected int splashTime = 1000; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.splash_screen); 
     Thread splashTread = new Thread() { 
      @Override 
      public void run() { 
       try { 
        int waited = 0; 
        while(active && (waited < splashTime)) { 
         sleep(100); 
         if(active) { 
          waited += 100; 
         } 
        } 
       } catch(InterruptedException e) { 
        // do nothing 
       } finally { 
        finish(); 
        // Start your Activity here 
       } 
      } 
     }; 
     splashTread.start();  
    } 
//... 
0

对于此处描述你在浪费时间,因为他们暂停初始化2-3seconds他们继续之前的解决方案。

我更喜欢在我的main_activity.xml之上添加Splash Screen Layout。我通过扩展应用程序来检测应用程序的第一次启动。如果it's第一个开始,我告诉我的启动画面,而UI是建立在后台...(使用后台线程,如果进度落后!)你MainActivity

//Extend Application to save the value. You could also use getter/setter for this instead of Shared Preferences... 
public class YourApplication extends Application { 

    public static final String YOUR_APP_STARTUP = "APP_FIRST_START"; 

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

     //set SharedPreference value to true 
     SharedPreferences mPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
     SharedPreferences.Editor editor = mPreferences.edit(); 
     editor.putBoolean(YOUR_APP_STARTUP, true); 
     editor.apply();  
     ...  
    } 

检查你的第一次启动

public class YourMainActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    //hide actionbar and other menu which could overlay the splash screen 
    getActionBar().hide(); 

    setContentView(R.layout.activity_main); 

    Boolean firstStart = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getBoolean(TVApplication.YOUR_APP_STARTUP, true); 

    if (firstStart) { 
     //First app start, show splash screen an hide it after 5000ms 
     final RelativeLayout mSplashScreen = (RelativeLayout) findViewById(R.id.splash_screen); 
     mSplashScreen.setVisibility(View.VISIBLE); 
     mSplashScreen.setAlpha(1.0f); 
     final FrameLayout mFrame = (FrameLayout) findViewById(R.id.frame_container); 
     mFrame.setAlpha(0.0f); 

     Handler handler = new Handler(); 
     handler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       Animation fadeOutAnimation = AnimationUtils.loadAnimation(getApplicationContext(), 
         R.anim.fade_out_animation); 
       fadeOutAnimation.setDuration(500); 
       fadeOutAnimation.setAnimationListener(new Animation.AnimationListener() { 

        @Override 
        public void onAnimationStart(Animation animation) { 
         mFrame.setAlpha(1.0f); 
         getActionBar().show(); 
        } 

        @Override 
        public void onAnimationEnd(Animation animation) { 
         mSplashScreen.setVisibility(View.GONE); 
        } 

        @Override 
        public void onAnimationRepeat(Animation animation) { 

        } 
       }); 
       mSplashScreen.startAnimation(fadeOutAnimation); 
      } 
     }, 5000); //<-- time of Splash Screen shown 

    } else { 
     ((RelativeLayout) findViewById(R.id.splash_screen)).setVisibility(View.GONE); 
     getActionBar().show(); 
    } 

将SplashScreen插入main.xml中的顶部。我更喜欢RelativeLayout。在这个例子中,SplashScreen被放置在Navitgation Drawer的布局中,我们真的很喜欢,不是吗?

//main_activity.xml 
<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <android.support.v4.widget.DrawerLayout 
     android:id="@+id/drawer_layout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" > 

     <!-- The main content view --> 

     <FrameLayout 
      android:id="@+id/frame_container" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 

     <!-- The navigation drawer list --> 

     <ListView 
      android:id="@+id/slider_list" 
      android:layout_width="240dp" 
      android:layout_height="match_parent" 
      android:layout_alignParentTop="true" 
      android:layout_gravity="start" 
      android:background="@color/tvtv_background" 
      android:choiceMode="singleChoice" 
      android:divider="@drawable/nav_bar_divider" 
      android:dividerHeight="1dp" 
      android:listSelector="@android:color/transparent" /> 
    </android.support.v4.widget.DrawerLayout> 

    <RelativeLayout 
     android:id="@+id/splash_screen" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_alignParentTop="true" 
     android:background="@color/tvtv_white" 
     android:visibility="visible" > 

     <ImageView 
      android:id="@+id/splash_screen_logo" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_centerInParent="true" 
      android:paddingLeft="50dp" 
      android:paddingRight="50dp" 
      android:scaleType="fitCenter" 
      android:src="@drawable/ic_launcher" /> 

     <TextView 
      android:id="@+id/splash_screen_text" 
      style="@style/TVTextBlueContent" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_below="@+id/splash_screen_logo" 
      android:layout_centerHorizontal="true" 
      android:padding="10dp" 
      android:text="Awesome splash shiat" /> 

     <ProgressBar 
      android:id="@+id/splash_screen_loader" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_below="@+id/splash_screen_text" 
      android:layout_centerHorizontal="true" 
      android:clickable="false" 
      android:indeterminate="true" /> 
    </RelativeLayout> 

</RelativeLayout> 
+1

这意味着即使您没有使用它,您的闪屏始终会处于您的视图层次结构中。如果你想使用这种方法,最好使用'ViewStub'。 http://developer.android.com/reference/android/view/ViewStub.html – Jelle

相关问题