gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:08:49 25 4
gpt4 key购买 nike

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

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com