2016-02-08 3 views
0

У меня есть основная активность, из которой я называю Splash Screen Intent, которая уничтожает себя через 3 секунды, но между жизненным циклом Splash Screen Intent основная активность также разрушает (что неправильно!) .. поэтому, когда намерение Splash Screen завершено, приложение вылетает из-за того, что основная активность была уничтожена сама.Основная деятельность Destroyed before Splash Screen return

Я действительно ценю, если кто-то может помочь мне в этом, у меня действительно нет идей на этом этапе.

Вот мой код:

MainActivity.java

public class MainActivity extends Activity { 

    private WebView webview; 

    public MainActivity() { 

    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     log.debug("onCreate(): " + savedInstanceState); 
     MyApplication.startSomeMobileCore(this); 
     MyApplication.startSomeMobileNotifier(this); 

     setContentView(R.layout.main); 
     this.onNewIntent(this.getIntent()); 
    } 

    @Override 
    protected void onStart() { 
     log.debug("onStart()"); 
     super.onStart(); 
    } 

    @Override 
    protected void onRestart() { 
     super.onRestart(); 
     this.wasRestarted = true; 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
    } 

    protected void onPause() { 
     super.onPause(); 
     this.receivedIntent = false; 
    } 

    protected void onStop() { 
     super.onStop(); 
     this.receivedIntent = false; 
    } 

    public void onDestroy() { 
     super.onDestroy(); 
    } 

    @Override 
    public void onNewIntent(Intent intent) { 
     log.debug("onNewIntent(): " + intent); 
     super.onNewIntent(intent); 

     if(intent == null) { 
      log.warn("Received null intent, will ignore"); 
     } 

     if ("OK".equals(authCode)) { 
      if (intent != null && intent.getData() != null && 
       ("content".equals(intent.getData().getScheme()) || 
       "http".equals(intent.getData().getScheme()))) { 
       log.debug("intent.getData() :" + intent.getData() + "; intent.getData().getScheme() : " + intent.getData().getScheme()); 
       String requestedPath; 
       if ("http".equals(intent.getData().getScheme())) { 
        requestedPath = URLDecoder.decode(intent.getData().toString()); 
       } else { 
        requestedPath = intent.getData().getPath(); 
       } 
       showResource(requestedPath); 
      } else { 
       log.debug("Intent without data -> go to entry page after splash screen"); 
      showResource(Configuration.properties.getProperty("PORTAL")); 
      } 
     } else { 
      Intent errorIntent = new Intent(this, ErrorIntent.class); 
      startActivity(errorIntent); 
      // finish actual activity 
      finish(); 
     } 

     log.debug("Show splash screen"); 
     Intent intentSplash = new Intent(this, SplashIntent.class); 
     startActivity(intentSplash); 
    } 

    void showResource(String resourceToShow) { 
     webview = (WebView)findViewById(R.id.browser); 
     webview.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH); 
     webview.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT); 
     webview.setWebViewClient(new WebViewClient()); 
     webview.getSettings().setJavaScriptEnabled(true); 
     webview.getSettings().setDomStorageEnabled(true); 
     webview.loadUrl(resourceToShow); 
    } 
} 

}

вот мой SplashIntent.java

public class SplashIntent extends Activity { 
    // Time splash screen should be shown (in ms) 
    private static final int splashTime = 3000; 
    static Logger log = Logger.getLogger(SplashIntent.class); 

    @Override 
    public void onCreate(final Bundle savedInstanceState) { 
     log.debug("SplashIntent: onCreate"); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.splash); 

     Handler handler = new Handler(); 
     handler.postDelayed(new Runnable() { 
      public void run() { 
       log.debug("SplashIntent: killing splash"); 
       finish(); 
      } 
     }, splashTime); 

    } 
} 

вот part of logcat

+0

Это не имеет особого смысла. 'this.onNewIntent (this.getIntent());' вызывается из 'onCreate'.Значение по умолчанию 'authCode', вероятно, не' OK', поэтому вы начнете операцию 'ErrorIntent',' finish() 'your' MainActivity', а затем запустите операцию' SplashIntent'. Как вы хотите, чтобы это работало точно? Когда установлен 'authCode'? –

+0

После всех этих проверок всегда отображается экран заставки (3 секунды), а затем основная активность @GeorgeMulligan –

ответ

1

Кажется, нет никаких причин переопределять onNewInent в вашей MainActivity.

В методе OnCreate() использовать следующее:

if(savedInstanceState == null){ 
    Intent splashIntent = new Intent(this, SplashIntent.class); 
    startActivity(splashIntent); 
} 

Это запустит заставку всякий раза, когда MainActivity инициализируются без сохраненного состояния. Поскольку ваш вызов активности SplashIntent заканчивается после его завершения, он должен вернуться к последнему действию в стеке (также известный как MainActivity).


Еще лучший способ сделать это было бы использовать SplashIntent деятельность в качестве пусковой деятельности, а затем перенаправить пользователя на MainActivity помощью намерения.

Очень простой пример был бы:

public class SplashIntent extends Activity { 

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

    log.debug("SplashIntent: onCreate"); 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.splash); 

    Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
     public void run() { 
      log.debug("SplashIntent: killing splash"); 
      Intent intent = new Intent(this, MainActivity.class); 
      startActivity(intent); 
      finish(); 
     } 
    }, splashTime); 
    } 
} 
+0

спасибо за ваш ответ, все еще следуя вашему решению. Я получаю цикл, и Splash запускается снова и снова, без достижения MainIntent. @Helix –

+0

Похоже, вы использовали второе предложение, но не удалили цель запуска всплеска из основного Activity. Удалите startActivity (intentSplash) из основного класса активности. – Helix

+0

Устранение startActivity (intentSplash) из основного класса активности остается проблемой. –

1

Попробуйте startActivityForResult для запуска заставки экрана (SplashIntent).

вместо

Intent intentSplash = new Intent(this, SplashIntent.class); 
startActivity(intentSplash); 

Попробуйте ниже

startActivityForResult 

, а затем из SplashIntent.java

Intent i = new Intent(); 
setResult(Activity.RESULT_OK,i); //pass your result 
finish(); // Call finish to remove splash from the stack 

Ref ссылка: http://developer.android.com/training/basics/intents/result.html

Пример кода:

public class MainActivity extends Activity { 
    static final int SHOW_SPLASH_SCREEN_REQUEST = 1; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     showSplashSCreen(); 
    } 

    private void showSplashSCreen() { 
     Intent intentSplash = new Intent(this, SplashActivity.class); 
     startActivityForResult(intentSplash, 
            SHOW_SPLASH_SCREEN_REQUEST); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, 
            Intent data) { 
     // Check which request we're responding to 
     if (requestCode == SHOW_SPLASH_SCREEN_REQUEST) { 
      // Make sure the request was successful 
      if (resultCode == RESULT_OK) { 
       // code to handle anything after splash screen finished. 
      } 
     } 
    } 
} 

Splash Screen:

общественный класс SplashActivity расширяет активность {

private static final int splashTime = 3000; 

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

    Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
     public void run() { 
      // optional per your requirement 
      setResult(MainActivity.SHOW_SPLASH_SCREEN_REQUEST); 
      // must call finish 
      finish(); 
     } 
    }, splashTime); 
} 
} 
+0

спасибо за ответ, все равно получите ту же ошибку. @Pattabiraman V –

+0

Я попробовал startActivityForResult и его работу. –

+0

Можете ли вы указать параметры, которые вы положили в startActivityForResult (?,?) –