Android从活动

时间:2017-07-18 03:42:04

标签: android android-activity

所以,我是一个新的Android开发者,但我正在取得进展。我有一个MainActivity这是我启动的,然后是一组子活动来做一些工作。

我目前正在努力让这些子活动超时并返回MainActivity以避免永远坐在一些随机窗口上。这是我正在处理的Kiosk类型应用,因此需要返回MainActivity

我已经能够在我的子活动类中使用Handler and Runnable()来完成这项工作。如果我在处理程序超时并且调用Runnable.run()时执行以下操作,则它可以正常工作。

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

但是,这会导致MainActivity再次运行onCreate。由于MainActivity已经在后台运行,我想返回该实例而不是开始新实例。

我认为我想要做的是在Runnable中调用finish()并让它关闭活动并返回Main。这不行。我看到MainActivity onStart()运行,而不是onCreate(),这就是我想要的。

但是,屏幕上显示的是LightsActivity设计布局,但实际上没有LightsActivity类。我在LightsActivity.onCreate()创建了一些定时器,它们在运行时每秒更新字段,但是在我调用finish()之后停止工作(再次,预期)。停止Activity类以及将UI更改回MainActivity窗口的诀窍是什么?

我做错了,或者这是一个错误。所有文件都说finish()应该做我想做的事。请注意,调用LightsActivity.this.finish()也无法在Runnable中运行,因此它不是我不会想到的范围问题。

希望拥有大量Android经验的人可以帮助我。

public class MainActivity extends Activity {
    private static final String TAG = MainActivity.class.getSimpleName();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(TAG, "onCreate");
    }

@Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "onStart");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "onStop");
    }

    public void viewLights(View view) {
        Log.d(TAG, "Managing the lights");
        setContentView(R.layout.activity_lights);
        startActivity(m_lights);
    }
}

public class LightsActivity extends Activity {
    private static final String TAG = LightsActivity.class.getSimpleName();

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lights);
        handler.postDelayed(finalizer, 1000 * 10);
        Log.d(TAG, "onCreate()");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "onStart");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy");
    }

    Runnable finalizer = new Runnable()
    {
        public void run()
        {
            Log.d(TAG, "Activity timed out");
            finish();
        }
    };
}

我得到以下输出。我可以用这个简单的例子重现,所有其他代码都被注释掉了。

07-19 13:20:37.761 1363-1363/? D/MainActivity: onCreate()
07-19 13:20:37.767 1363-1363/? D/MainActivity: onStart
07-19 13:21:20.280 1363-1363/com.home.pete.aquarium D/MainActivity: Managing the lights
07-19 13:21:20.569 1363-1363/com.home.pete.aquarium D/LightsActivity: onCreate()
07-19 13:21:20.571 1363-1363/com.home.pete.aquarium D/LightsActivity: onStart
07-19 13:21:21.089 1363-1363/com.home.pete.aquarium D/MainActivity: onStop
07-19 13:21:30.579 1363-1363/com.home.pete.aquarium D/LightsActivity: Activity timed out
07-19 13:21:30.615 1363-1363/com.home.pete.aquarium D/MainActivity: onStart
07-19 13:21:31.100 1363-1363/com.home.pete.aquarium D/LightsActivity: onStop
07-19 13:21:31.100 1363-1363/com.home.pete.aquarium D/LightsActivity: onDestroy

LightsActivity屏幕仍然显示,而不是MainActivity。

1 个答案:

答案 0 :(得分:0)

  

我认为我想要做的是在Runnable中调用finish()并让它关闭活动并返回Main。这不行。我看到MainActivity onStart()运行,而不是onCreate(),这就是我想要的。

这是正常的。查看Activity Lifecycle

  1. 您开始MainActivity - > onCreateonStartonResume
  2. 您开始LightsActivity - > onCreateonStartonResume
  3. 同时,MainActivity进入后台 - > onPauseonStop
  4. 完成LightsActivity - > onPauseonStoponDestroy
  5. MainActivity - > onStartonResume
  6.   

    但是,屏幕上显示的是LightsActivity设计布局,但没有实际运行的LightsActivity类。我在LightsActivity.onCreate()中创建了一些定时器,它们在运行时每秒更新一次字段,但是在调用finish()后再次停止工作(再次,预期)。什么是停止Activity类,并将UI更改回MainActivity窗口的技巧?

    您描述的内容应该有效。如果没有,你有一个错误。但是没有代码,截图,堆栈跟踪等,没有人能说出你做错了什么。将日志记录语句放入生命周期方法并调用finish并跟踪这些步骤。

    更新:

    这是你的问题:

    public void viewLights(View view) {
        Log.d(TAG, "Managing the lights");
        setContentView(R.layout.activity_lights);
        startActivity(m_lights);
    }
    

    MainActivity中,当导航到ViewLightsActivity时,首先将内容视图设置为activity_lights的布局(覆盖MainActivity的布局),然后导航到LightsActivity

    当然,当您返回Activity时,它具有您之前设置的新布局。在此方法中删除对setContentView的调用。您应该只在setContentView中致电onCreate,除非您有充分的理由。