1

アクティビティAndroidで関数自体を実行するタイミングと、関数を呼び出す必要があるタイミングを知りたいです。たとえば、ダウンロードした次のスクリプトでは、最初の4つのメソッドは呼び出さずに実行されますが、最後の1つは呼び出す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は、Androidがアクティビティに対して行ったコールバックとそれらが発生する正確な順序を文書化したアクティビティライフサイクルをすでに示しています。その他のイベントは、Receiver、ContentProvider、Listenerなどによって発生します。

この順序は時間ベースではなく(もちろん時間ベースのコードイベントを作成できますが)、次々に発生しないことに注意してください。これらは、アクティビティの状態が変化したとき、および状態が変化したときにのみ呼び出されます。

これらのコールバックのハンドラーでは、もちろん、独自の関数を呼び出したり、クラスのインスタンスを作成してそのメソッドを呼び出したり、上から下に順番に処理を実行したりできますが、ハンドラー内でのみ実行できます。

アプリの起動時に最初に発生するのは、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 に答える