android - 我的广播接收器未在多线程应用程序中注册

标签 android multithreading sockets

我正在尝试使用套接字输出流。我想从一个广泛的广播接收器内部启动它。...我相信套接字正在工作,因为客户端总是收到一个空值...。但是广播监听器似乎没有工作。我似乎甚至都没有注册,因为即使里面只有一个简单的Toast也无法正常工作。

我尝试使用广播接收器类,并通过 list 进行了注册。我曾工作过,但由于以下原因,我不希望这样做:

即使关闭了应用程序,通过 list 注册的

  • 广播仍然有效
  • 我需要使用一些Main UI类变量/方法/内部类(在这里,该类是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/

    相关文章:

    c++ - 使用 QUdpSocket 作为 QIODevice 的正确方法是什么?

    java - 哪种优化方式?

    java - LayoutResultCallback() 在 LayoutResultCallback 中不公开;生成pdf时无法从外部包错误访问

    android - Activity 泄露了 IntentReceiver

    java - 如何: Java Server Socket response and Client reading

    c - 需要帮助在 C 中获取 TCP 端口号和 IP 地址

    java - FireBase onDataChange() 不起作用

    c++ - 从 ui 线程显示窗口有时会阻塞主 ui 线程

    multithreading - 如何使用CRM Online 2015实现良好的导入性能

    windows - Windows 中信号量的发布顺序是什么?