1

我想知道何时进入 Activity Android 执行函数本身以及何时需要调用函数。例如,在我下载的以下脚本中,前 4 个方法在没有调用的情况下执行,但最后一个sendMessage()需要调用:

public class BroadcastChat extends Activity {
    // Debugging
    private static final String TAG = "BcastChat";
    private static final boolean D = true;

    // Message types sent from the BluetoothChatService Handler
    public static final int MESSAGE_READ    = 1;
    public static final int MESSAGE_WRITE   = 2;
    public static final int MESSAGE_TOAST   = 3;

    // Key names received from the BroadcastChatService Handler
    public static final String TOAST = "toast";

    // Layout Views
    private ListView    mConversationView;
    private EditText    mOutEditText;
    private Button      mSendButton;

    // Array adapter for the conversation thread
    private ArrayAdapter<String> mConversationArrayAdapter;
    // String buffer for outgoing messages
    private StringBuffer mOutStringBuffer;
    // Member object for the chat services
    private BroadcastChatService mChatService = null;


    // The Handler that gets information back from the BluetoothChatService
    private final Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {

            if(D) Log.e(TAG, "[handleMessage !!!!!!!!!!!! ]");

            switch (msg.what) {

                case MESSAGE_WRITE:

                    byte[] writeBuf = (byte[]) msg.obj;
                    // construct a string from the buffer
                    String writeMessage = new String(writeBuf);
                    mConversationArrayAdapter.add("Me:  " + writeMessage);
                    break;
                case MESSAGE_READ:
                    String readBuf = (String) msg.obj;
                    mConversationArrayAdapter.add("You:  " + readBuf);
                    break;               
                case MESSAGE_TOAST:
                    Toast.makeText(getApplicationContext(), msg.getData().getString(TOAST),
                                   Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    };    


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(D) Log.e(TAG, "+++ ON CREATE +++");

        // Set up the window layout
        setContentView(R.layout.main);
    }


    public void onStart() {
        super.onStart();
        if(D) Log.e(TAG, "++ ON START ++");

        setupChat();
    }

    @Override
    public synchronized void onResume() {
        super.onResume();
        if(D) Log.e(TAG, "+ ON RESUME +");

        mChatService.start();
    }


    private void sendMessage(String message) {

    if(D) Log.e(TAG, "[sendMessage]");

    // Check that there's actually something to send
    if (message.length() > 0 ) {
        // Get the message bytes and tell the BluetoothChatService to write
        byte[] send = message.getBytes();
        mChatService.write(send);

        // Reset out string buffer to zero and clear the edit text field
        mOutStringBuffer.setLength(0);
        mOutEditText.setText(mOutStringBuffer);

    }
}

    ... Incomplete script, just a part shown for the question

}

所以我的问题是双重的:

1-Android Activity方法是从第一行到最后一行顺序调用的方法吗?,是否有一个循环使“指针”在到达最后一行后回到第一行?

2-您如何确定哪些方法将自动执行(如onCreate()),哪些方法将等到它们被脚本的另一个方法调用。

非常感谢您的宝贵时间

4

2 回答 2

3

首先要理解的,也是至关重要的一点,这不是脚本,而是代码。如果您将其视为脚本,您将无法“了解”代码在做什么。脚本从头到尾执行。它可能会扩展到一个功能,但最终,事情会按顺序发生。

在 Java(以及 Android)中,一切都是作为对事件或回调的响应而发生的。其中一些事件是由 Android 引发的,Nickolaus 已经向您指出了 Activity 生命周期,该生命周期记录了 Android 对您的 Activity 进行的回调以及它们发生的确切顺序。其他事件由接收者、内容提供者、监听者等引发。

请注意,此顺序不是基于时间的(尽管您当然可以创建基于时间的代码事件)并且不会一个接一个地发生。它们在 Activity 的状态发生变化时被调用,并且仅在状态发生变化时被调用。

在这些回调的处理程序中,您当然可以调用自己的函数,创建类的实例并调用它们的方法,并按顺序执行操作,从上到下 - 但只能在处理程序内部。

当您的应用程序启动时,首先发生的事情是 Android 实例化了 Application 类。每个应用程序都有一个 Application 类的实例,无论您是否知道,并且该 Application 类实例也具有类似于 Activity 的生命周期,因此 Application.onCreate() 是应用程序中要触发的第一个事件。一旦 Application 类实例被实例化,就会创建在您的 rmanifest 中定义的主要活动,并调用它的 onCreate() 方法。

之后,一切都会响应来自例如侦听器(onClick、onReceive 等)的回调或响应事件而发生。从 onCreate() 结束开始,您的代码仅在其他事件发生时执行。

您可以缩短所有这些并回答您的问题,方法是说 sendMessage 只能从回调处理程序内部的某个地方调用。

当有多个线程执行代码时,它会变得更加复杂,但那是另一天的事了。

我希望这会有所帮助,而不是让事情变得更加混乱!

于 2013-01-21T19:17:41.603 回答
1

这里看一下应该向您解释的活动生命周期。

于 2013-01-21T17:40:07.507 回答