2017-07-18 12 views
0

私は少し新しいAndroidデベロッパーですが、進歩しています。私はMainActivityを持っています。これは私がブートしたもので、サブアクティビティーのセットがいくつかの作業を行います。Androidからの返品

私は現在、これらのサブアクティビティをタイムアウトにして、何らかのランダムなウィンドウに永久に座るのを避けるためにMainActivityに戻ります。それは私が取り組んでいるKioskタイプのアプリのようなものなので、MainActivityに戻ることが必要です。

サブアクティビティクラスのHandler and Runnable()でこれを行うことができました。ハンドラがタイムアウトしてRunnable.run()が呼び出されたときに次のようにすると、動作します。

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

ただし、MainActivityはonCreateを再度実行します。 MainActivityはすでにバックグラウンドで実行されているので、新しいインスタンスを開始する代わりに、そのインスタンスに戻りたいと考えています。

私がやりたかったことは、Runnableでfinish()を呼び出し、アクティビティを閉じてメインに戻ることです。これは正しく機能しません。私はMainActivity onStart()が走っているのを見て、私が欲しいのはonCreate()ではありません。

しかし、実際にはLightsActivityクラスが実行されていないのに、画面にはLightsActivityデザインのレイアウトが表示されます。 LightsActivity.onCreate()で作成したタイマーがあり、毎秒フィールドが更新されていますが、finish()(やはり予期される)が呼び出された後に動作しなくなります。アクティビティクラスを停止し、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()を呼び出し、アクティビティを閉じてメインに戻ることです。これは正しく機能しません。 MainActivity onStart()が実行され、onCreate()は実行されないことがわかります。これは私が望むものです。

これは問題ありません。 Activity Lifecycleを確認してください。onResume

  • 一方、MainActivityが背景になり、>onCreateonStart - - あなたはLightsActivityを開始>onCreateonStartonResume
  • -

    1. あなたがMainActivityを開始> 、onStop
    2. フィニッシュLightsActivity - > ,onStop,onDestroy
    3. 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); 
    } 
    

    これは言う、ViewLightsActivityに移動するときMainActivityに、最初の(MainActivityのレイアウトをオーバーライドactivity_lightsのレイアウトにコンテンツビューを設定します)、LightsActivityにナビゲートします。

    アクティビティに戻ると、以前に設定した新しいレイアウトが適用されます。このメソッドでsetContentViewへの呼び出しを削除します。本当に正当な理由がない限り、onCreateにはsetContentViewと電話する必要があります。

  • +0

    私はそれには同意する必要がありますが、私は内部に他のコードなしで削除されたサンプルを投稿しましたが、それでも正しく動作しません。私はこれがATのバグかどうか疑問に思っていますが、AT Google+サイトで他の誰かがそれについて不満を感じることはありません。そのグループは多くのことについて不平を言っています。 –

    +0

    あなたのコードを見て、私の更新答えを見てください。 – dominicoder

    +0

    素晴らしいです、ありがとうございます。私は物事のためのGoogleのハウツからしばらく前にそれを得た。私は今それが理にかなっていない理由を見る。 –

    関連する問題