Я начинаю разработку приложений для 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>
я cо(), чтобы проверить поведение, но это одно и то же. Таким образом, проблема не возникает из-за connectToServer().
Ниже эмулятор, который я использую в Android Studio, чтобы запустить это приложение Поскольку автоматический перезапуск деятельности не ожидается, что может быть здесь отсутствует. Пожалуйста, предложите.
Вместо того чтобы пытаться предотвратить автоматические перезагрузки, попробуйте посмотреть, как вы можете разместить автоматические перезагрузки, сохраняя состояния экземпляров и защитное кодирование. Android предоставляет вам объект «Bundle», используйте его как можно больше. – initramfs
Боли в попку, и хрупкой для загрузки. На самом деле гораздо безопаснее защищать код, отключив его - тогда вы не попадете в опасную ситуацию в первую очередь. Есть причина, почему почти все нетривиальные приложения отключают функциональность. Посмотрите даже на приложения с открытым исходным кодом Google. –
@GabeSechan Интересно, удастся ли им когда-нибудь убрать этот шаблон дизайна. Хотя изменения и вероятные проблемы совместимости, вероятно, слишком велики, чтобы сделать это возможным. – initramfs