所以,我是一个新的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。
答案 0 :(得分:0)
我认为我想要做的是在Runnable中调用finish()并让它关闭活动并返回Main。这不行。我看到MainActivity onStart()运行,而不是onCreate(),这就是我想要的。
这是正常的。查看Activity Lifecycle。
MainActivity
- > onCreate
,onStart
,onResume
LightsActivity
- > onCreate
,onStart
,onResume
MainActivity
进入后台 - > onPause
,onStop
LightsActivity
- > onPause
,onStop
,onDestroy
MainActivity
- > onStart
,onResume
但是,屏幕上显示的是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
,除非您有充分的理由。