对sms进行实时监视SMSReceiver,如果收到短消息,则立即向主线程报告,通知主线程刷新界面。
在这里,主线程如何接受这个通知呢? 

解决方案 »

  1.   

    刷新界面可以用,message handler来做
      

  2.   

    对 handler直接sendmessage就可以了。
      

  3.   

    我的代码大致是这样子的: public class SMSReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals(strAction)) { 

    // 有短信接收
    // 开始想主线程发送消息
    MainActivity mainActivity = new MainActivity();
    Handler hanlder = mainActivity.getSmsHandler();// 得到mainActivity中Handler实例
    Message message = new Message();
    message.what = 1;
    hanlder.sendMessage(message);//发送消息
    }
    }
    }

    public class MainActivity extends ListActivity { // 短信删除提示信息句柄
    public Handler smsHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
    super.handleMessage(msg);
    switch(msg.what) {
    case 1:// 在这里耍新界面 重新加载listview
    // 可是嘞  刷新不了啊
    break;
    }
    }

    };

    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    // .....
    }
    }
    请大家帮忙看下哪里 代码写的不合适哦  谢谢。
      

  4.   

    你刷新的动作是怎么做的?ListView.invadite()是不行的。如果你的adpater是继承BaseAdapter的那么调一次notifyDataSetChanged(),或者直接重新setAdapter一次。
      

  5.   


    case 1:
        我是在这个地方重新查询数据库,然后重新setAdapter,
       问题出在执行 myMessageDao = DaoFactory.getMessageDao(this);时出错
    错误提示:myMessageDao 为null
         break;
      

  6.   


    我觉得应该还是由SMSReceiver 发送消息的问题、,因为,我在显示界面上加一个刷新按钮,执行同样的代码, 操作数据库就米有问题啊、  
      

  7.   

    问题出现在这两句:                // 有短信接收
                    // 开始想主线程发送消息
                    MainActivity mainActivity = new MainActivity();
                    Handler hanlder = mainActivity.getSmsHandler();// 得到mainActivity中Handler实例你怎么能自己new一个MainActivity呢??这个新的MainActivity实例和你当前界面中显示的MainActivity根本不是一个东西,所以你更新的所有UI状态在界面上你都无法看到。正确的做法,在MainActivity中注册SMSReceiver,然后可以直接使用SMSReceiver 中的Handler来sendMessage。
      

  8.   

    楼上我的回复有无,最后一句更正如下:
    正确的做法,在MainActivity中注册SMSReceiver,然后可以直接使用MainActivity中的Handler来sendMessage。
      

  9.   

    LS说的对,都没有发现,这个的确有问题啊。
    acitivty不是这么用的啊
      

  10.   

    再更正一下吧,说得更准确一些:SMSReceiver写成MainActivity的内部类。
      

  11.   

    对,这才是正确的做法。
                  MainActivity mainActivity = new MainActivity();
                    Handler hanlder = mainActivity.getSmsHandler();// 得到mainActivity中Handler实例
     这里得到的handler 与你的  
    public class MainActivity extends ListActivity {        // 短信删除提示信息句柄
            public Handler smsHandler = new Handler() {
                @Override
                public void handleMessage(Message msg) {这里面的handler根本就不是同一个东西,怎么可能能够通信
      

  12.   


    SMSReceiver是一个BroadcastReceiver, 如果把 SMSReceiver定义成内部类的话,该如何注册和解除注册嘞,
    在此程序中,MainActivity只是一个普通的activity,如何用户关闭掉了,是不是就不能监听到收到的SMS喽、 因为SMSReceiver就是监听sms的  
      

  13.   


    SMSReceiver是一个BroadcastReceiver, 如果把 SMSReceiver定义成内部类的话,该如何注册和解除注册嘞,
    在此程序中,MainActivity只是一个普通的activity,如何用户关闭掉了,是不是就不能监听到收到的SMS喽、 因为SMSReceiver就是监听sms的  
      

  14.   

    context.registerReceiver()和context.unregisterReceiver()来在代码里面注册和解除receiver。
    这样写的话,当然是activity不在的时候,receiver就不工作了,本来你这儿reciver就是用来刷新UI的,activity不在了,UI也不用刷新了啊
      

  15.   


    首先 谢谢您 的 跟帖回答!我的本意是 当MainActivity存在的时候,自动刷新界面, 被销毁的时候就不刷新了。 
    而且 还要时刻监视sms,  所以 Receiver 和 MainActivity在这儿不能搭配使用了、  还得注册全局的Receiver,    所以,  只有在MainActivity中 使用TimerTask 和 Handler了,  问题解决了 哈哈、