我是Android應用程序開發的初學者。最近,開始開發一個聊天應用程序。我實現了客戶端服務器消息交換的基本功能。我面臨一個問題,即android活動會自動重新啓動。因此,創建了新的視圖實例,無法在列表視圖中看到消息。爲什麼我的活動會自動重新啓動?
從痕跡中,我可以看到活動已停止並自動創建。因此,再次創建MAIN活動的新實例。
12-21 14:47:50.744 1913-1913/? I/System.out﹕ **********MainActivity.onCreate()-->[email protected]
12-21 14:48:11.209 1913-1913/chat.com.android_client I/System.out﹕ ********onStop() app is killed!!!
12-21 14:48:11.216 1913-1913/chat.com.android_client I/System.out﹕ **********MainActivity.onCreate()-->[email protected]
[MainActivity.java]
package com.chat.client;
import android.app.Activity;
import android.database.DataSetObserver;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AbsListView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import com.chat.client.config.ChatProtocolConstants;
import com.chat.client.config.ServerUriConstants;
import com.chat.client.connect.ChatServerListener;
import com.chat.client.connect.ChatWebSocketHandler;
import com.chat.client.connect.ConnectionManager;
import chat.com.android_client.R;
import de.tavendo.autobahn.WebSocketHandler;
public class MainActivity extends Activity {
private ChatArrayAdapter chatArrayAdapter;
private ListView listView;
private EditText chatEditText;
private Button buttonSend;
private boolean side = false;
private ConnectionManager connectionManager;
private final String from = "Ramu", to = "Omkar";
@Override
protected void onCreate(Bundle savedInstanceState) {
System.out.println("**********MainActivity.onCreate()-->"+this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
buttonSend = (Button) findViewById(R.id.buttonSend);
listView = (ListView) findViewById(R.id.listView1);
chatArrayAdapter = new ChatArrayAdapter(getApplicationContext(), R.layout.activity_chat_singlemessage);
chatEditText = (EditText) findViewById(R.id.chatText);
chatEditText.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
ChatMessage chatMessage = new ChatMessage(false, chatEditText.getText().toString());
return sendChatMessage(chatMessage);
}
return false;
}
});
buttonSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ChatMessage chatMessage = new ChatMessage(false, chatEditText.getText().toString());
sendChatMessage(chatMessage);
}
});
listView.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
listView.setAdapter(chatArrayAdapter);
chatArrayAdapter.registerDataSetObserver(new DataSetObserver() {
@Override
public void onChanged() {
super.onChanged();
listView.setSelection(chatArrayAdapter.getCount() - 1);
}
});
// Connect to chat server
connectToServer();
}
@Override
protected void onStop() {
super.onStop();
System.out.println("********onStop() app is killed!!!");
}
private boolean sendChatMessage(ChatMessage chatMessage) {
connectionManager.sendMessage(from + ChatProtocolConstants.DELIMITER + to + ChatProtocolConstants.DELIMITER + chatMessage.message);
return updateChatList(chatMessage);
}
private boolean updateChatList(ChatMessage chatMessage) {
chatArrayAdapter.add(chatMessage);
chatEditText.setText("");
return true;
}
private void connectToServer() {
connectionManager = ConnectionManager.getInstance();
WebSocketHandler chatWebSocketHandler = new ChatWebSocketHandler(from);
((ChatWebSocketHandler) chatWebSocketHandler).setWebSocketListener(new ChatServerListener() {
@Override
public void messageReceived(String message) {
ChatMessage chatMessage = new ChatMessage(true, message);
System.out.println("Received message from web socket handler: " + message);
updateChatList(chatMessage);
}
}
);
connectionManager.connect(ServerUriConstants.serverUri + ServerUriConstants.connectEndPoint, chatWebSocketHandler);
}
}
[activity_main.xml中]
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<ListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="80dp"></ListView>
<RelativeLayout
android:id="@+id/form"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:orientation="vertical">
<EditText
android:id="@+id/chatText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_toLeftOf="@+id/buttonSend"
android:ems="10"
android:inputType="textMultiLine" />
<Button
android:id="@+id/buttonSend"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/chatText"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:text="@string/button_send" />
</RelativeLayout>
我共同通過調用connectToServer()來檢查行爲,但它是一樣的。所以不存在由connectToServer()引起的問題。
以下是我使用在Android Studio中來運行這個程序 由於活動的自動重啓預計不會,什麼可以在這裏失去了仿真器。請建議。
與其試圖阻止自動重新啓動發生,不如嘗試通過保存實例狀態和防禦性編碼來了解如何適應自動重新啓動。 Android爲你提供了一個'Bundle'對象,儘可能地使用它。 – initramfs
疼痛的屁股,脆弱的引導。它通過關閉防守代碼實際上更安全 - 那麼首先你不會陷入危險的境地。幾乎所有非平凡的應用都關閉了功能,這是有原因的。查看甚至Google的開源應用程序。 –
@GabeSechan不知道他們是否會退休這種設計模式。儘管這些變化和可能的兼容性問題可能太大而無法實現。 – initramfs