首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >杀死溅溅屏的意图

杀死溅溅屏的意图
EN

Stack Overflow用户
提问于 2014-11-08 20:23:13
回答 1查看 751关注 0票数 0

这是我的Splash屏幕,如果我在启动时按home或多任务/应用程序切换按钮,则在logcat中是致命的冒失:线程-1277。当玩家按“主页”按钮时,我可以删除这个意图吗?

代码语言:javascript
复制
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);
}
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-08 23:12:58

下面的代码跟踪SplashActivity是否至少部分显示。如果是,它将继续MainActivity。如果没有(活动通过按回按钮完成,活动通过按Home按钮停止),什么都不会发生。

该解决方案使用Fragment,因此在屏幕方向改变(无论您旋转设备多少次都需要指定的时间-计时器将不会重置)的时间保持不变。

代码语言:javascript
复制
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();
    }
  }
}

这在虚拟星系S2上进行了测试。当按下“主页”或“后退”按钮时,它会工作。它不工作时,最近的应用程序按钮被按下。我不知道你的用例,但就我个人而言,我希望这个应用会在我浏览最近的应用程序时继续发布。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26821689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档