【问题标题】:Android Sms Receiver Result to Main ActivityAndroid Sms 接收器结果到主要活动
【发布时间】:2014-03-27 18:19:45
【问题描述】:

MainActivity.java

public class MainActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.anaekran);
        Thread t = new Thread(new Runnable() {
            public void run() {
                String smsMsj = getIntent().getStringExtra("sms");
                if(smsMsj != null){
                    Toast.makeText(getApplication(), smsMsj, 2).show();
                }
                try {
                    Thread.sleep(4000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        t.start();
    }
}

SmsReceiver.java

public class SmsReceiver extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent) {
        Bundle mesaj = intent.getExtras();
        SmsMessage[] smsMessage = null;
        String msj = "";

        if(mesaj!= null){
            Object[] pdus = (Object[])mesaj.get("pdus");
            smsMessage = new SmsMessage[pdus.length];
            for(int i = 0; i < pdus.length; i++){
                smsMessage[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
                msj = smsMessage[i].getMessageBody();
            }

            Intent mIntent = new Intent(context, SmsReceiver.class);
            mIntent.putExtra("sms", msj);
        }
    }
}

我的接收器工作正常,但是当我想在我的 MainAcitivty toast 上显示消息时遇到一个问题,所以我在接收器类中创建了 mIntent,然后我使用 putExtra 方法。

但不工作,对不起我的英语不好,谢谢:)

【问题讨论】:

  • 你不能显示来自非 UI 线程的 toast

标签: android


【解决方案1】:

也许使用明确的Intent 并启动它可以帮助你,嗯? :)

Intent mIntent = new Intent(context, MainActivity.class);
mIntent.putExtra("sms", msj);
context.startActivity(mIntent);

您的错误是您使用SmsReceiver.class 构建了新的Intent(但您需要启动MainActivity)并且您没有以这样的意图开始任何活动。

编辑 1: 另外,请注意 - 您正在尝试在工作线程中运行 toast。这是不可能的。删除您的匿名线程并将您的 toast 代码移动到您的onCreate(Bundle)

protected void onCreate(Bundle saveState){  
    ....
    String smsMsj = getIntent().getStringExtra("sms");
    if(smsMsj != null){
        Toast.makeText(getApplication(), smsMsj, 2).show();
    }
    ....
}

Edit 2:此外,Toast.makeText(..) 中的 duration 参数设置为 2。这不对应于Toast 类中的任何魔术常量。您必须使用以下常量之一:Toast.LENGTH_LONGToast.LENGTH_SHORT。因此,将您的代码重写为:

Toast.makeText(getApplication(), smsMsj, Toast.LENGTH_SHORT);

【讨论】:

  • 他仍然看不到 toast,因为他试图在非 ui 线程中显示 toast
  • 是的,你完全正确。我没有注意到他在他的工作线程中开始敬酒。我更正了我的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多