2017-07-18 60 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

太棒了,謝謝。我從谷歌那裏得到了一些關於東西的知識。我現在看到它爲什麼沒有意義。 –