저는 안드로이드 앱 개발에 초보자입니다. 최근에 채팅 앱을 개발하기 시작했습니다. 나는 클라이언트 서버 메시지 교환의 기본 기능을 달성했다. 안드로이드 활동이 자동으로 다시 시작되는 문제에 직면하고 있습니다. 이 때문에 새보기 인스턴스가 만들어지고 목록보기에서 메시지를 볼 수 없습니다.내 활동이 자동으로 다시 시작하는 이유는 무엇입니까?
추적에서 나는 활동이 중지되고 자동으로 생성 된 것을 볼 수 있습니다. 따라서 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>
I 공동 동작을 확인하기 위해 connectToServer()에 대한 mmented 호출은 동일하지만 동일합니다. 따라서 connectToServer()로 인한 문제는 없습니다.
다음
내가이 응용 프로그램을 여기에 누락 될 수있는 것을 활동의 자동 다시 시작이 예상되지 않기 때문에 을 실행하는 안드로이드 스튜디오에서 사용하고있는 에뮬레이터입니다. 제발 제안 해주세요.
자동 재시작을 방지하기보다는 인스턴스 상태 및 방어 코딩을 저장하여 자동 재시작을 조정하는 방법을 확인하십시오. 안드로이드는 당신을 위해'Bundle' 객체를 제공하며 최대한 많이 사용합니다. – initramfs
엉덩이에 통증이 있고, 부러지기 쉽지 않습니다. 방어 적으로 코드를 해제하는 것이 실제로는 훨씬 안전합니다. 그러면 처음에는 위험한 상황에 빠지지 않습니다. 거의 모든 사소한 응용 프로그램이 기능을 끄는 이유가 있습니다. Google의 오픈 소스 앱도보십시오. –
@GabeSechan 그들이이 디자인 패턴을 은퇴하게 될지 궁금합니다. 변경 가능성과 호환성 문제가 너무 커서 실현 가능성이 너무 높습니다. – initramfs