杀死飞溅屏幕

时间:2014-11-08 20:23:13

标签: android android-intent splash-screen multitasking

这是我的启动画面,如果我按下home或multitasking / appswitch按钮,当Intent启动应用程序崩溃时,在logcat中是FATAL EXEPTION:Thread-1277。当玩家按下主页按钮时,我可以杀死/删除此意图吗?

public class SplashScreen extends Activity {
private static int loadingTime = 1000;

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

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

    setVolumeControlStream(AudioManager.STREAM_MUSIC);

    setContentView(R.layout.loading_screen);

    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            Intent i = new Intent(SplashScreen.this, MainActivity.class);
            startActivity(i);
            finish();
        }
    }, loadingTime);
}
}

1 个答案:

答案 0 :(得分:0)

以下代码会跟踪SplashActivity是否至少部分显示。如果是,它将继续MainActivity。如果没有(通过按“返回”按钮完成活动,按“主页”按钮停止活动)没有任何反应。

此解决方案使用Fragment s,因此时间保持在例如屏幕方向更改(无论您旋转设备多少次,它都会占用指定的时间 - 计时器不会重置)。

public class SplashActivity extends Activity {
  // tracks when the activity is at least partially visible (e.g. under a dialog)
  private boolean mStarted = false;

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

    // your current code
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
        WindowManager.LayoutParams.FLAG_FULLSCREEN);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    setVolumeControlStream(AudioManager.STREAM_MUSIC);
    setContentView(R.layout.activity_startup);

    if (savedInstanceState == null) {
      // first time onCreate, create fragment which starts countdown
      getFragmentManager()
          .beginTransaction()
          .add(SplashFinishFragment.newInstance(), SplashFinishFragment.TAG)
          .commit();
    } else {
      // fragment already set up from first onCreate after screen rotation
    }
  }

  @Override
  protected void onStart() {
    // the activity becomes at least partially visible
    mStarted = true;

    super.onStart();
  }

  @Override
  protected void onStop() {
    // the activity is no longer visible
    mStarted = false;

    super.onStop();
  }

  public boolean isStarted2() {
    // there is already hidden method isStarted() in the framework
    // you can't use it and are not allowed to override it
    return mStarted;
  }

  public static class SplashFinishFragment extends Fragment {
    private static final String TAG = SplashFinishFragment.class.getSimpleName();

    private static final int DELAY = 1000; // one second delay

    private static final Handler mHandler = new Handler(); // one main thread anyway

    private final Runnable mRunnable = new Runnable() {
      @Override
      public void run() {
        if (getActivity() == null) {
          // this should never happen, there is no activity, so no fragment
          Log.e(TAG, "No activity!");
          return;
        }

        SplashActivity a = (SplashActivity) getActivity();

        if (a.isStarted2() || a.isChangingConfigurations()) {
          // if activity is even partially visible or is rotating screen right now, continue
          Intent i = new Intent(a, SettingsActivity.class);
          a.startActivity(i);
        }

        // in any case close splash
       a.finish();
      }
    };

    public static SplashFinishFragment newInstance() {
      return new SplashFinishFragment();
    }

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

      // the countdown will continue (not reset) across screen rotations
      setRetainInstance(true);

      // try running the main activity after specified time
      mHandler.postDelayed(mRunnable, DELAY);
    }

    @Override
    public void onDestroy() {
      // if the fragment gets destroyed (e.g. activity closes) do not launch main activity
      mHandler.removeCallbacks(mRunnable);

      super.onDestroy();
    }
  }
}

这是在虚拟Galaxy S2上测试的。当按下Home或Back按钮时它可以工作。按下“最近的应用程序”按钮时,它不起作用。我不知道你的用例,但我个人希望应用程序在浏览最近的应用程序时继续启动。

相关问题