处理程序在重新启动活动时不会再次执行

时间:2016-09-28 04:44:16

标签: android splash-screen runnable android-handler

此代码适用于我的启动画面活动:

    @Override
    protected void onResume() {
    super.onResume();
    handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            Intent intent = new Intent(SplashActivity.this, MainActivity.class);
            startActivity(intent);
        }
    }, 5000);
}

当我点击设备后退按钮时,MainActivity将完成并再次启动SplashActivity,并再次使用onResume方法获取调用, 这里的问题是处理程序没有再次执行,MainActivity在5秒后也没有重新启动!我希望它再次执行!

问题是什么,我该怎么办?

感谢您的关注。

5 个答案:

答案 0 :(得分:1)

我修改了你的代码一点点检查

@Override
    protected void onResume() {
    super.onResume();
   new  android.os.Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            Intent intent = new Intent(SplashActivity.this, MainActivity.class);
            startActivity(intent);
        }
    }, 5000);
}

答案 1 :(得分:1)

移动您的代码段以启动onCreate()finish()。在startActivity()方法之后立即致电finish()。同时删除MainActivity课程中的{{1}}来电。

答案 2 :(得分:1)

将代码放入MainActivity s onCreate(),例如:

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            handler = new Handler();
            handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent intent = new Intent(SplashActivity.this, MainActivity.class);
                startActivity(intent);
                finish();
                }
            }, 5000);
     }

onResume()中放置这样的处理程序不是一个好方法

答案 3 :(得分:1)

首先,我想告诉你这不是添加启动画面的正确方法。根本不需要处理程序。

一般情况下,启动屏幕只是您在应用启动时看到的自然延迟。添加自己的5秒延迟根本不推荐。

现在,如果您想要对自然延迟进行样式化并制作正确的自定义初始屏幕,那么您需要遵循此过程。

  

首先创建一个background_splash.xml drawable,它将作为启动画面的用户界面

<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@color/gray"/> <item> <bitmap android:gravity="center" android:src="@mipmap/ic_launcher"/> </item> </layer-list>
  

接下来,您必须将此设置为style.xml中的Spash屏幕背景

<resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> </style> <style name="SplashTheme" parent="Theme.AppCompat.NoActionBar"> <item name="android:windowBackground">@drawable/background_splash</item> </style> </resources>
  

现在您相应地配置了您的Android清单

<activity android:name=".SplashActivity" android:theme="@style/SplashTheme"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
  

最后将您的Splash屏幕java类编码为

public class SplashActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent intent = new Intent(this, MainActivity.class); startActivity(intent); finish(); } }

来源: bignerdranch

因此,您不必使用处理程序线程来操纵应用程序启动时间。这将消除应用程序启动延迟的白色背景,并为您提供自定义的xml drawable。

作为参考,您可以查看所有Google应用程序(如YouTube等)在没有白色背景延迟和其他高质量应用程序启动的情况下启动。

请考虑为您的启动画面使用此正确的流程。它只是一个窗口背景,没有像多线程,处理程序等那样复杂的

答案 4 :(得分:1)

我测试了你的代码,它为我工作没有任何问题。请检查我的代码。

当你按下第二个Activity的后退按钮时,你真的想要执行处理程序。你应该把Handler放在&#34; onStart&#34;或&#34; onResume&#34;只要。因为&#34; onCreate&#34;按第二个活动的后退按钮时未调用第一个活动的方法。

如果你的场景是Splash Screen,你应该在Intent执行后关闭它。因为我们只应该第一次显示启动画面。

@Override
    protected void onResume() {
        Log.i(TAG,"onResume Called");
        super.onResume();
        handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                startActivity(intent);
            }
        }, 5000);

    }

和SecondActivity代码如下。

protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_activity);
   }