Android:在 Activity 中执行的函数

标签 android android-activity

我想知道 Android 何时进入 Activity 本身执行一个函数,以及何时需要调用一个函数。例如,在我下载的以下脚本中,前 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() ),哪些将等到它们被脚本的另一个方法调用。

非常感谢您的宝贵时间

最佳答案

首先要了解的是,这不是脚本,这是代码,这一点很重要。如果您将其视为脚本,您将不会“了解”代码在做什么。脚本从头到尾执行。它可能会分支成一个函数,但最终,事情会按顺序发生。

在 Java(以及 Android)中,一切 都是对事件或回调的响应。其中一些事件是由 Android 引发的,Nickolaus 已经向您指出了 Activity 生命周期,它记录了 Android 对您的 Activity 进行的回调以及它们发生的精确顺序。其他事件由 Receivers、ContentProviders、Listeners 等引发。

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

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

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

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

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

当有多个线程执行代码时,情况会变得更加复杂,但那是以后的事了。

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

关于Android:在 Activity 中执行的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14444124/

相关文章:

android - SD卡文件加密API

android - 安装 Android Studio - 未安装 SDK 组件

android - Jetpack Compose 上的可变 ImagePainter

android - 从聊天头服务启动 Activity 延迟

java - OnActivityResult不是调用内部fragment而是调用android中的Main Activity

java - 我如何从 Activity 中更改 fragment 的 TextView 文本

android - 如何将刚刚创建的对象从一个 Activity 传递到另一个 Activity ?

Android SQL 数据库 - 未找到 rawQuery() 源

android - IDE Android Studio错误开始创建新项目时

android - 如何获取actionbar的图标