activityに対するいくつかの理解と用法の記録

4548 ワード

  • activityのonContentChangedメソッド:ソースコードを表示すると、onContentChangedメソッドはActivityでは空のメソッドであり、コンテンツは実装されていません.このメソッドはsetContentView()メソッドが実行されると、onContentChangedメソッドが呼び出されるので、findView ByIdなどの操作や他の初期化操作をこのメソッドに置くことができます.システムはsetContentViewメソッドの実行後に自動的に起動し、手動で呼び出す必要はありません.
  • Activityのfinish()メソッドが呼び出された後:Activityでサブスレッドを起動し、サブスレッドでHandlerを使用してメインスレッドに5秒遅延したメッセージを送信して実行し、サブスレッドを起動した後、現在のActivityをfinishが削除すると、ActivityのHandlerがサブスレッドから送信されたメッセージを受信できるかどうか、そしてhandlerMessageメソッドで処理しますか?答えは肯定的だ.ActivityのHandlerは確かにメッセージを受信しているので、分析してみましょう.送信メッセージはサブスレッドで実行され、5秒遅れて送信されるが、finish()メソッドはメインスレッドで実行されるので、finish()メソッドはサブスレッドがメッセージを送信する前に実行されるに違いない.通常、finish()メソッドはonDestory()メソッドを呼び出してActivityオブジェクトを破棄し、Activityオブジェクトが破棄されるとそのメンバー変数Handlerも存在しない.したがって、プライマリ・スレッドはメッセージを受信できないはずです.しかし、実際にActivityのHandlerはメッセージを受信しました.理由については、個人的にはまだ明らかではありません.以下はテストコードです.MainActivity:
  • package com.example.testthread;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.nfc.Tag;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Looper;
    import android.os.Message;
    import android.util.Log;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.widget.TextView;
    import android.widget.Toast;
    
    public class MainActivity extends Activity {
        private TextView mTextView;
    
        private Handler mHandler = new Handler() {
            public void handleMessage(android.os.Message msg) {
                if (msg.what == 0x123) {
                    Toast.makeText(MainActivity.this,
                            mTextView.getText().toString(), Toast.LENGTH_SHORT)
                            .show();
                    Intent intent = new Intent(MainActivity.this, OtherActivity.class);
                    MainActivity.this.startActivity(intent);
                }
    
            }
        };
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            new Thread(new Runnable() {
    
                @Override
                public void run() {
                    // Looper.prepare();
                    Message msg = Message.obtain();
                    msg.what = 0x123;
                    mHandler.sendMessageDelayed(msg, 5000);
    
                }
            }).start();
    
            finish();
    
        }
    
        @Override
        public void onContentChanged() {
            mTextView = (TextView) findViewById(R.id.id_text);
        }
    
        @Override
        protected void onDestroy() {
            Log.e("TAG", "onDestory");
            super.onDestroy();
        }
    
    }
    

    個人的な推測は、onDestoryメソッドがオブジェクトを本当に破壊するのではなく、Activityが占有するリソース(レイアウトファイルなど)を解放したためかもしれません.