1

すべてのデータがメモリから読み取られるか、新しいデータが設定されるとすぐに、onSaveInstanceState が呼び出されます。各関数の先頭に Log.e 呼び出しを配置し​​て、onSaveInstanceState が呼び出される直前に何が呼び出されるかを確認しました。

プログラムが終了する原因は何ですか? ロック解除ボタンを移動できるようにするために、電源ボタンをクリックする必要がある場合もあれば、電源ボタンを押さなくても移動する場合もあります。

Eclipseを使用してテストします。シミュレーターで動作し、電話でクラッシュします。

他に何を追加すればよいかわかりません。

GC_EXTERNAL_ALLOC 1K 解放、45% 解放 3339K /6023K、外部 5407K/6752K 、
一時
停止 87ms zlib を inflate に 初期化しています inflate状態を 初期化しています zlib を inflate に 初期化しています inflate 状態を初期化しています zlib を inflate に 初期化しています inflate 状態を 初期化しています zlib を inflateに初期化しています











GC_EXTERNAL_ALLOC解放 5K 、45% 解放 3344K / 6023K 、外部
7110K /7462K、 一時 停止 81ms zlib to inflate inflate 状態の 初期化 zlib の inflateの 初期化 inflate 状態の 初期化 zlib の inflateの 初期化 inflate 状態の 初期化 zlibの inflate の初期化














インフレ状態の初期化 インフレへの zlib の初期化 インフレ状態の初期化 インフレへの zlibの 初期化 インフレ 状態 への 初期化
zlib への 初期化 インフレ 状態への初期化 インフレへの zlibの初期化 インフレ 状態への初期化 インフレへの zlib の初期化/6023K、外部 7982K/8032K、一時停止 106ms インフレ状態の 初期 化 zlib を初期化してインフレート中 インフレ状態を初期化中 zlib を初期化してインフレート中














インフレ状態の
初期化 zlib をインフレートに 初期化中
インフレ状態を初期化中 zlib をインフレートに初期化中 インフレ状態を 初期化中 zlib をインフレートに初期化中 インフレ状態を初期化中 インフレ状態を初期化中 zlib をインフレートに初期化中 インフレ 状態を 初期化中 zlib をインフレートに 初期化中






私にはある種のループのように見えます

@Override  
    public void onSaveInstanceState(Bundle outState)
    {        
        //Store the game state  
        Log.e("onSaveInstanceState", " public void onSaveInstanceState");
        // ?? replace   
        // ?? is called when answer phone button is pushed    
        // ?? is called when red phone button is pushed   
        // ?? is called when house button is pushed   
        // ?? is called when power button is pushed
        // ?? "outState.putBundle" does not seem to do anything
        outState.putBundle(m_MyView.GetFileName(), 
                m_MyView.m_prRecord.SaveBundleData());


    }

{
/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        try
        {
            Log.e("onCreate", "onCreate");
            //Debug.startMethodTracing("calc");
            //System.gc();

            setContentView(R.layout.main_Layout);

            PopupWindow popup = new PopupWindow(
                    this.getLayoutInflater().inflate(R.layout.menu_layout, null));

            m_MyView = (CMyView) findViewById(R.id.main);  
            m_MyView.SetTextView((TextView) findViewById(R.id.text));  

            Log.e("onCreate", "savedInstanceState == null " + (savedInstanceState == null));


            m_MyView.SetPopup(popup);
            // [breaks code]
            //popup.setContentView((CMenu) findViewById(R.id.menuView)); 

            if(savedInstanceState != null)
            {
                LoadBundleData(savedInstanceState);
            }
            else
            {
                try
                {
                    // ?? check if we have a saved file
                    InputStream fis = new FileInputStream(m_MyView.GetFileName() );
                    Log.e("onCreate", "fis == null " + (fis == null));
                    // ?? if fis == null then exception is thrown
                    // ?? if statement is used to remove unused variable error
                    if(fis != null)
                    {
                        if(m_MyView.m_prRecord.LoadByteData(
                                m_MyView.GetFileName()) == false)
                        {
                            Log.e("onCreate", "new");
                            // ?? all data was not loaded
                            m_MyView.SetMode(CMyView.NEW);
                            return;
                        }
                        else
                        {
                            Log.e("onCreate", "got here");
                            m_MyView.SetMode(CMyView.READY);
                            return;
                        }
                    }
                    // ?? if(fis == null) is dead code
                    /*else
                    {
                        //Log.e("onCreate", "fis == null");
                        m_MyView.setMode(CMyView.NEW);
                    }
                    */
                }
                catch(Exception e)
                {
                    //Log.e("onCreate", "Exception 1");
                    // We were just launched -- set up a new game
                    // ?? which means we need to make a Stream file to write to
                    //Log.e("onCreate", "ERROR IN public void onCreate: " + 
                        //  e.toString());
                    e.printStackTrace();
                    m_MyView.SetMode(CMyView.NEW);
                }

            }
            //Debug.stopMethodTracing();
        }
        catch (Exception e)
        {
            //Log.e("onCreate", "Exception 2");
            // this is the line of code that sends a real error message to the log
            //Log.e("ERROR", "ERROR IN public void onCreate: " + e.toString());

            // this is the line that prints out the location in
            // the code where the error occurred.
            //e.printStackTrace();

        }
    }

}

今、私は完全に混乱しています。追加した:

 @Override
    public void onResume()
    public void onRestart()
     public void onRestoreInstanceState(Bundle savedInstanceState)
with this inside:
    {
        super.onResume();
        Log.e("onResume", "enter");
    }

onResume が呼び出されますが、onSaveInstanceState は呼び出されません。

?? 3つの関数をオーバーライドしてパススルーすると、別の関数が呼び出されないようにするにはどうすればよいですか?

?? さらに2回実行すると、onSaveInstanceStateがonResume後に表示されました。onResume -> onSaveInstanceState -> onPause -> onDraw

4

1 に答える 1

0

ドキュメントが言うように:

このメソッドは、アクティビティが強制終了される前に呼び出されるため、後で戻ってきたときにその状態を復元できます。

したがって、このメソッドが呼び出されても、アクティビティが常に強制終了されるわけではありません。そのためにonStop()onDestroy()メソッドがあるため、情報を保存onSaveInstanceState()して適切な方法で復元するようにしてください。

于 2013-07-29T07:36:58.573 に答える