2017-07-18 63 views
0

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

我目前正在努力让这些子活动超时并返回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。

+0

对不起,是的,但这并没有帮助。 –

+0

您可以创建一个[mcve]所有相关的代码吗? –

+0

我不认为我可以在这里发布完整的最小化,完整和可验证。我知道如何发布的代码本身不会在没有大量Android Studio必要工作的情况下生成。不过,你可以在我的https://github.com/buelowp/aquarium页面看到完整的源代码。你应该能够检查出来并直接构建它。 –

回答

0

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

这是正确的。查看Activity Lifecycle

  1. 你开始MainActivity - >onCreateonStartonResume
  2. 你开始LightsActivity - >onCreateonStartonResume
  3. 同时,MainActivity进入后台 - > ,onStop
  4. 完成LightsActivity - > ,onStop,onDestroy
  5. MainActivity - >onStartonResume

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

你所描述的应该工作。如果没有,你有一个错误。但没有代码,截图,堆栈跟踪等,没有人可以说你做错了什么。将日志记录放入您的生命周期方法中,并调用finish并追踪整个步骤。

UPDATE:

那么这里是你的问题:

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

所以当然当你回到活动时,它有你以前设置的新布局。用这种方法取消对setContentView的呼叫。除非你有一个非常好的理由,否则你只能拨打onCreate中的setContentView

+0

我同意它应该,但我发布了一个没有其他代码的简化示例,它仍然不能正常工作。我想知道这是否是AT中的一个错误,但我无法在AT + Google+网站上找到任何其他人抱怨,并且该小组抱怨了很多。 –

+0

看到您的代码后查看我更新的答案。 – dominicoder

+0

太棒了,谢谢。我从谷歌那里得到了一些关于东西的知识。我现在看到它为什么没有意义。 –