【问题标题】:How to transition from splash page to main activity?如何从启动页面过渡到主要活动?
【发布时间】:2013-11-19 16:37:43
【问题描述】:

目前,我的应用会加载启动画面并保持这种状态。我认为我的主要问题是 Android 生命周期。我将启动页面作为 onCreate,主要活动(以下面的私有 final 开头)也是 onCreate,但我认为这是不正确的。此外,每个活动都在一个 java 文件中。这个对吗?如何让我的启动页面加载、杀死自己,然后加载我的主要活动?

这是我的 MainActivity.java:

package com.deliveryfor;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.model.LatLng;

public class MainActivity extends Activity {

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

        Thread Timer = new Thread() { 
            public void run() { 
                try { sleep(3000); 

                startActivity (new Intent ("android.intent.action.SPLASH")); 


                } catch (InterruptedException e) { 
                    e.printStackTrace(); 

                } 

                finally { 

                    finish(); 

                } 

            } 

        }; 

        Timer.start(); 

    }

    private final LatLng LOCATION_STATE = new LatLng(49.27645, -122.917587);
    private final LatLng LOCATION_CITY = new LatLng(49.187500, -122.849000);
    private final LatLng LOCATION_YOU = new LatLng(49.187500, -122.849000);

    private GoogleMap map;



    protected void onCreate() {
        super.onCreate(null);
        setContentView(R.layout.activity_main);

        map  = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();

        map.setMyLocationEnabled(true);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    public void onClick_State(View v) {
        map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        CameraUpdate update = CameraUpdateFactory.newLatLngZoom(LOCATION_YOU, 9);
        map.animateCamera(update);
    }
    public void onClick_City(View v) {
        map.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
        CameraUpdate update = CameraUpdateFactory.newLatLngZoom(LOCATION_CITY, 16);
        map.animateCamera(update);

    }
    public void onClick_You(View v) {
        map.setMapType(GoogleMap.MAP_TYPE_NORMAL);
        CameraUpdate update = CameraUpdateFactory.newLatLngZoom(LOCATION_STATE, 18);
        map.animateCamera(update);

    }

}

这里是 Menu.java(启动页面):

package com.deliveryfor;

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

public class Menu extends Activity { 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView (R.layout.splash); }




    }

【问题讨论】:

    标签: java android eclipse splash-screen android-lifecycle


    【解决方案1】:

    您必须将 Splash Activity 创建为经典 Activity,并且您必须在 Manifest 中声明它将是第一个启动的 Activity。 将此行添加到活动启动标记中:

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

    然后,在您的 SplashActivity.java 中的 onCreate() 中,添加自动启动您的 MainActivity 的代码。 我像这样使用 TimerTask:

    Timer timer = new Timer();
            timer.schedule(new TimerTask(){
    
                @Override
                public void run() {
                    // TODO Auto-generated method stub
    
                    Intent toHomePage = new Intent(context,MainActivity.class);
                    startActivity(toHomePage);
                    finish();
                }}, 5000);
    

    5000 表示 Intent toHomePage 将在 5 秒后启动。 希望对你有帮助!

    【讨论】:

      【解决方案2】:

      您需要创建一个 Intent 来启动您的 MainActivity。现在,Menu 的代码除了创建它的 UI 之外什么也没做。 official documentation 描述了如何执行此操作。

      你需要这样的东西:

      Intent intent = new Intent(this, MainActivity.class);
      startActivity(intent);
      

      您可能还想重新考虑完全使用初始屏幕,除非您有令人信服的理由(似乎并非如此)。阅读this blog 帖子了解详情。这是一段我觉得很有趣的摘录:

      启动画面可用于在启动之前使资源可用 应用程序启动。个人认为 98% 没有必要 案件。对于积极依赖重载的应用程序可能很有用 资源,例如 Google 地球、天空地图或游戏,但这不是 适用于简单的实用应用程序,例如提要阅读器、社交 网络应用程序、新闻阅读器等。您不需要网络 启动时连接,也不会进行繁重的计算。

      【讨论】:

        【解决方案3】:

        我是这样使用的:

        public class SplashActivity extends Activity{
            private final static long SPLASH_TIME_OUT = 2000;
        
            // SplashActivity --> serves as entry-point for the app at several situations
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                 super.onCreate(savedInstanceState);
                 setContentView(R.layout.activity_splash);                      
                 new Handler().postDelayed(new Runnable() {
        
                      @Override
                      public void run() {
        
                        Intent i = new Intent(SplashActivity.this, RegisterActivity.class);
                        startActivity(i);
                        // close this activity
                        finish();
                      }
                }, SPLASH_TIME_OUT);
            }   
        }
        

        【讨论】:

          【解决方案4】:

          我将此 Activity 作为 MainActivity.java 添加到首页:

          public class MainActivity extends AppCompatActivity {
              oAuth_Model oAuth_model;
              @Override
              protected void onCreate(Bundle savedInstanceState) {
                  super.onCreate(savedInstanceState);
                  setContentView(R.layout.activity_main);
          
                  getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                          WindowManager.LayoutParams.FLAG_FULLSCREEN);
          
                  showBasicSplash();
              }
              private void showBasicSplash() {
                  new Thread(){
                      @Override
                      public void run() {
                          super.run();
          
                          try {
                              Thread.sleep(1500);
                              handler.sendEmptyMessage(0);
                          } catch (InterruptedException e) {
                              e.printStackTrace();
                          }
                      }
                  }.start();
              }
          
              @SuppressLint("HandlerLeak")
              Handler handler = new Handler(){
                  public void handleMessage(Message m){
                      if (getBoolean(Constant.AFTERLANG)){
                          Intent intent = new Intent(MainActivity.this, Landing_three.class);
                          startActivity(intent);
                          finish();
                      }else {
                          Intent intent = new Intent(MainActivity.this, Activity_Sec.class);
                          startActivity(intent);
                          finish();
                      }
                  }
              };
          }
          

          并将这个 Activity 添加到 Manifests.xml 中:

          <activity android:name=".MainActivity"
                  android:configChanges="orientation"
                  android:screenOrientation="portrait">
                  <intent-filter>
                      <action android:name="android.intent.action.MAIN" />
          
                      <category android:name="android.intent.category.LAUNCHER" />
                  </intent-filter>
              </activity>
          

          并在意图执行其他活动后杀死 Mainactivity。

          finish();
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-03-31
            • 2013-01-20
            • 2016-09-20
            相关资源
            最近更新 更多