- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用websocket client我的应用程序。在主 Activity 中,我连接到 websocket 客户端并像抽象方法一样执行所有 onMessage、onOpen 操作。我还有两个 Activity ,称为“登录”和“注册” Activity 。我将登录 Activity 中的用户详细信息发送到服务器以进行验证。从服务器我正在 onMessage 抽象方法中的 MainActivity 中接收消息。我需要在登录 Activity 中使用该消息。请解释一下我该如何实现这一目标?如果我在这里重复我的问题,请原谅我并引导我找到正确的答案。
这是我的主要 Activity :
package org.asperohgedgetws.a7.hgadgetws;
import android.app.Activity;
import android.app.Fragment;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.TextView;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
import java.net.URI;
import java.net.URISyntaxException;
import android.widget.Button;
import android.widget.Toast;
import android.content.Intent;
public class MainActivity extends Activity implements View.OnClickListener {
Button bLogout;
public static TextView tvReceived;
UserLocalStore userLocalStore;
public static WebSocketClient mWebSocketClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bLogout = (Button) findViewById(R.id.bLogout);
bLogout.setOnClickListener(this);
userLocalStore = new UserLocalStore(this);
tvReceived = (TextView) findViewById(R.id.tvRecieved);
connectWebSocket();
}
@Override
protected void onStart() {
super.onStart();
if (authenticate()){
displayUserDetails();
} else{
Toast.makeText(getApplicationContext(), "Not Registered User :(", Toast.LENGTH_SHORT).show();
startActivity(new Intent(MainActivity.this,Login.class));
}
}
private boolean authenticate(){
return userLocalStore.getUserLoggedIn();
}
private void displayUserDetails(){
User user = userLocalStore.getLoggedInUser();
}
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.bLogout:
startActivity(new Intent(this,Login.class));
userLocalStore.clearUserData();
userLocalStore.setUserLoggedIn(false);
Toast.makeText(getApplicationContext(), "Logout :)", Toast.LENGTH_SHORT).show();
break;
}
}
public void connectWebSocket() {
URI uri;
try {
uri = new URI("ws://xxx.xxx.xxx:xxxx");
} catch (URISyntaxException e) {
e.printStackTrace();
return;
}
mWebSocketClient = new WebSocketClient(uri) {
@Override
public void onOpen(ServerHandshake serverHandshake) {
Log.i("Websocket", "Opened");
//mWebSocketClient.send("Hello from " + Build.MANUFACTURER + " " + Build.MODEL);
//mWebSocketClient.send("{\"1512BD002\":\"SO@0\":\"2\"}");
}
@Override
public void onMessage(String s) {
//final String message = s;
final String WSmessage = s;
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), WSmessage, Toast.LENGTH_SHORT).show();
tvReceived.setText(WSmessage);
Log.i("Websocket_Message", WSmessage);
//TextView textView = (TextView)findViewById(R.id.messages);
//textView.setText(textView.getText() + "\n" + message);
}
});
}
@Override
public void onClose(int i, String s, boolean b) {
Log.i("Websocket", "Closed " + s);
}
@Override
public void onError(Exception e) {
Log.i("Websocket", "Error " + e.getMessage());
}
};
mWebSocketClient.connect();
}
public void sendMessage(View view) {
// EditText editText = (EditText)findViewById(R.id.message);
// mWebSocketClient.send(editText.getText().toString());
//editText.setText("");
}
}
和登录 Activity 包 org.asperohgedgetws.a7.hgadgetws;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Switch;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.gson.Gson;
import android.app.ProgressDialog;
import java.util.LinkedHashMap;
import java.util.Map;
public class Login extends AppCompatActivity implements View.OnClickListener {
Button bLogin;
EditText etUsername, etPassword;
TextView tvRegisterLink;
UserLocalStore userLocalStore;
/**
* ATTENTION: This was auto-generated to implement the App Indexing API.
* See https://g.co/AppIndexing/AndroidStudio for more information.
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
etUsername = (EditText) findViewById(R.id.etUsername);
etPassword = (EditText) findViewById(R.id.etPassword);
tvRegisterLink = (TextView) findViewById(R.id.tvRegisterLink);
bLogin = (Button) findViewById(R.id.bLogin);
bLogin.setOnClickListener(this);
userLocalStore = new UserLocalStore(this);
tvRegisterLink.setOnClickListener(this);
// ATTENTION: This was auto-generated to implement the App Indexing API.
// See https://g.co/AppIndexing/AndroidStudio for more information.
}
@Override
public void onBackPressed() {
new AlertDialog.Builder(this).setIcon(android.R.drawable.ic_dialog_alert).setTitle("Exit")
.setMessage("Are you sure?")
.setPositiveButton("yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();
}
}).setNegativeButton("no", null).show();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bLogin:
if ((Login.this.etUsername.getText().toString().trim().length() > 0) && (Login.this.etPassword.getText().toString().trim().length() > 0)) {
String username = etUsername.getText().toString();
String password = etPassword.getText().toString();
User user = new User(username, password);
userLocalStore.storeUserData(user);
Map obj = new LinkedHashMap();
obj.put("id", user.username);
obj.put("password", user.password);
obj.put("type", "signin");
obj.put("user.", "normal");
Gson gson = new Gson();
String json = gson.toJson(obj);
System.out.println(json);
Log.i("Ordered Json", json);
ProgressDialog pd = new ProgressDialog(Login.this);
pd.setMessage("loading");
pd.show();
MainActivity.mWebSocketClient.send(json);
//Here I want to use received Message from Server to Authenticate User.
return;
}
Log.i("Login ERROR", "Username OR Password Missing");
new AlertDialog.Builder(this).setIcon(android.R.drawable.ic_dialog_alert).setTitle("Error")
.setMessage("Email ID or Password Missing")
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) { }
}).show();
break;
case R.id.tvRegisterLink:
Toast.makeText(getApplicationContext(), "Register :)", Toast.LENGTH_SHORT).show();
startActivity(new Intent(this, Register.class));
break;
}
}
编辑:
大家好,我刚刚浏览了 Android 服务、单例和 Android 广播接收器示例。我只是想,如果我使用 Android 服务进行网络连接(Websocket)管理、数据传输和接收并使用 Android 广播来通知特定 Activity 有新的传入消息会怎样?
最佳答案
我认为使用 Activity 来处理服务器通信是错误的方法。虽然 LoginActivity 可见,但 MainActivity 位于后台,系统可能随时终止它,导致套接字连接消失。
这似乎是应该使用服务完成的任务的完美案例。实现所需的逻辑,例如设置套接字以及在服务中发送和接收消息,并将其绑定(bind)到 Activity 中的“onCreate”方法中。一旦服务绑定(bind),您就可以询问服务用户是否已登录或请求登录用户。因为服务随后会接收消息,所以您需要一种方法来向 Activity 报告。这可以通过广播或观察者来实现。对于后一种情况,您可能需要为观察者和服务创建 AIDL 接口(interface),这实际上并不难。
如果您不在应用程序中使用不同的进程,您也可以简单地创建一个单例而不是服务,并在不同的 Activity 中使用它。如果需要,您还可以稍后将单例放入服务中。
至于例子,除了 default Service documentation 我想不出任何例子。
关于java - 如何对 Android 中的所有 Activity 使用单一方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37538972/
我对 Android 很陌生,如果问题重复,请避免并发送链接。有三个 Activity A、B 和 C。 Activity A 获取一个用户名,我想在 Activity C 中显示该用户名,但我想先运
我正在尝试制作记事本应用程序,因此每次打开新笔记时,布局都会相同。另外, Activity 的数量(新注释)不应定义得尽可能多 最佳答案 如果 Activity 始终相同,您可能应该创建一个适配器,允
我有 3 个 Activity 。 主窗口 5 个按钮 在按钮的主窗口中按下此窗口打开(将其称为父窗口) 在父窗口按钮上按下此窗口打开调用它作为结束子窗口。 现在从子窗口我从父窗口获取值如下:
我遇到了一个 Activity backstack 问题。假设我的后台有 5 个 Activity :比如 Activity A、 Activity B、 Activity C、 Activity D
我正在寻找必须具有以下附加特征的 JMS 提供程序: 采用多代理,所有代理都必须处于事件状态(无单点故障) 仅在两台机器上进行扩展就足以满足我们的需求 能够保证订购(如果 1 个生产者 + 1 个消费
假设,我有一个由 TabHost 组成的选项卡 Activity 。 TabHost 包含 2 个选项卡,每两个选项卡都有一个 Activity 组。每个 Activity 组包含一项 Activit
我正在开发一个应用程序,我需要根据某些操作导航到特定 Activity 。这是一张图片 我的第一个 Activity 是 ReadingActivity。基于某些操作,用户将被带到 NewProjec
我创建了一个与服务器异步通信的应用程序。当应用程序发出服务器请求时,将创建一个带有“正在加载”通知的新对话框( Activity )。主要 Activity 实现了处理服务器响应的方法,我想在主要 A
我想在我的所有应用程序 Activity 中显示相同的选项菜单。我创建了一个实现菜单的通用 Activity ,并且我所有的进一步 Activity 都扩展了它。 问题:当我需要扩展其他特定 Acti
我有四个 Activity ,即 java 文件 - Activity1.java、activity2.java、activity3.java、activity4.java 和 xml 文件 - Ac
我有两个 Activity 。我想将数据从第二个 Activity 发送到上一个 Activity 。第一个 Activity 有自定义 ListView 和 bean 类。当我点击第二个 Activ
根 Activity 是堆栈中当前的第一个 Activity 还是 list 中指定为启动 Activity 的 Activity ? 支持应用程序 P 在启动时启动 Activity A。然后 A
你好 我想知道您在绘制 Activity 图选择“Activity ”时考虑了哪些关键点? 您如何从要建模的问题中选择 Activity ? 谢谢 最佳答案 Activity 图用于对正在开发的系统和
如何从主 Activity 启动 Activity 并在子 Activity 返回主 Activity 中退出操作后返回主 Activity ? 我已将子 Activity 作为启动器 Intent
我的工作流程如下: 登录 Activity -> ActivityB -> ActivityC -> ActivityD 我想将数据从LoginActivity传递到ActivityD,但不直接传递到
我之前曾尝试获得此问题的答案,但找不到可以解决我的问题的答案。我正在制作保存圆盘高尔夫球分数的应用程序。我的 MainActivity 有 4 个按钮。新比赛、恢复比赛、类(class)和球员。 At
我有一个 tts 非 UI 类和 Activity 类。现在在 Activity 类中,我有一个按钮,用户可以从中选择男声或女声,具体取决于我想要将字符串传递给 tts 类的选择,然后一次tts 类根
问题有点复杂,首先, Activity A 和 Activity B 的 list 中都有 android:noHistory = true 。我有一个自定义 serialized 类,假设 MyCl
在我的应用程序中,我有两个 Activity (AuthenticationActivity 和 MainActivity),每个 Activity 都有一个导航图和大量 fragment 。我创建了
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: How can i use compose email activity in tabView? 我想在选项
我是一名优秀的程序员,十分优秀!