我正在尝试使用套接字输出流。我想从一个广泛的广播接收器内部启动它。...我相信套接字正在工作,因为客户端总是收到一个空值...。但是广播监听器似乎没有工作。我似乎甚至都没有注册,因为即使里面只有一个简单的Toast
也无法正常工作。
我尝试使用广播接收器类,并通过 list 进行了注册。我曾工作过,但由于以下原因,我不希望这样做:
即使关闭了应用程序,通过 list 注册的
ServerReplyThread
)。因此,为广播接收器提供单独的类(class)不会对我有太大帮助... 下面是我的代码;你能帮我解决这个问题吗?
public class MainActivity extends AppCompatActivity {
public ServerSocket serverSocket;
public ServerSocket getServerSocket() {
return serverSocket;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnDemarrer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Thread socketServerThread = new Thread(new SocketServerThread());
socketServerThread.start();
}
});
}
@Override
public void onResume() {
super.onResume();
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
MainActivity.this.registerReceiver(smsReceived, filter);
sendBroadcast(new Intent("android.provider.Telephony.SMS_RECEIVED"));
}
@Override
public void onPause() {
MainActivity.this.unregisterReceiver(smsReceived);
super.onPause();
}
private class SocketServerThread extends Thread {
static final int SocketServerPORT = 7777;
@Override
public void run() {
try {
serverSocket = new ServerSocket(SocketServerPORT);
while (true) {
Socket socket = serverSocket.accept();
SocketServerReceiveThread socketServerReplyThread
= new SocketServerReceiveThread(socket);
socketServerReplyThread.run();
}
} catch (IOException e) {
e.printStackTrace();
}}}
private class SocketServerReceiveThread extends Thread {
private Socket hostThreadSocket;
SocketServerReceiveThread(Socket socket) {
hostThreadSocket = socket;
}
@Override
public void run() {
try{
InputStream is = hostThreadSocket.getInputStream();
ObjectInputStream ois = new ObjectInputStream(is);
//Launch USSD query
}catch(Exception e){
e.printStackTrace();
}}}
private class SocketServerReplyThread extends Thread {
private Socket hostThreadSocket;
private String sms;
SocketServerReplyThread(Socket socket, String sms) {
hostThreadSocket = socket;
this.sms = sms;
}
@Override
public void run() {
try{
OutputStream os = hostThreadSocket.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(os);
MyClass myclass = new MyClass();
myclass.setSms(sms);
oos.writeObject(dt2);
hostThreadSocket.close();
}catch(Exception e){
e.printStackTrace();
}}}
BroadcastReceiver smsReceived = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().
equals("android.provider.Telephony.SMS_RECEIVED")) {
StringBuilder sb = new StringBuilder();
Bundle bundle = intent.getExtras();
if (bundle != null) {
Object[] pdus = (Object[])
bundle.get("pdus");
for (Object pdu : pdus) {
SmsMessage smsMessage =
SmsMessage.createFromPdu
((byte[]) pdu);
sb.append("body - " + smsMessage.
getDisplayMessageBody());
}
Toast.makeText(context,sb.toString(),Toast.LENGTH_LONG); //This is not popping up
try {
Socket socket = getServerSocket().accept();
SocketServerReplyThread socketServerReplyThread = new SocketServerReplyThread(socket,sb.toString());
socketServerReplyThread.run();
} catch (IOException e) {
e.printStackTrace();
}}}}};
}
以下是我的 list 的权限
<!-- TELEPHONY SETTINGS-->
<uses-feature
android:name="android.hardware.telephony"
android:required="true" />
<!-- Permission needed to read TelephoneManager data -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- END -->
<!-- Permissions to dial -->
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<uses-permission android:name="android.permission.CALL_PRIVILEGED" />
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
<!-- END -->
<!-- SMS permissions -->
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.WRITE_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />
<!-- END -->
<!-- END OF TELEPHONY SETTINGS-->
最佳答案
当SMS发出时,您的应用在前台/对用户可见?如果不在前台/不可见,则要在onPause()中注销接收器时接收它。如果您想接收它,请务必在AndroidMainfes.xml文件中定义接收器。
您可以在 Activity 生命周期的onStart()和onStop()中进行注册/注销
关于android - 我的广播接收器未在多线程应用程序中注册,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47728863/