2014-08-28 126 views
1

我有活动,我有EditText供用户输入特定数据。用户写入一些文本并点击按钮后,他正在等待BroadcastReceiver的响应。问题是一切正常,用户收到回应,但如果用户没有退出活动并再次单击按钮,BroadcastReceiver不再发射。如果用户关闭活动并再次打开它,BroadcastReceiver将再次运行,但仅限于第一次。BroadcastReceiver只触发一次

这有点令人困惑。这里是我的代码:

public void onCreate(Bundle savedInstanceState) { 

    mReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context c, Intent in) { 
      switch (getResultCode()) { 

      case Activity.RESULT_OK: 

       mStatus = true; 
       break; 
      } 
     } 
    }; 

    getActivity().registerReceiver(mReceiver, 
      new IntentFilter(FLAG)); 

} 

当用户点击按钮:

Intent in = new Intent(FLAG); 
PendingIntent pIn = PendingIntent.getBroadcast(context, 1, in, 0); 
SmsManager.getDefault().sendTextMessage("123456789", null, "text", pIn, null); 

while(!mStatus){ 
} 

mStatus = false; 

注销接收器:

public void onPause() { 
    super.onPause(); 
    getActivity().unregisterReceiver(mReceiver); 
} 

你怎么想的?为什么它只在活动开始并且按钮被第一次点击时才起作用?

+0

您的意思是用户退出该活动,请返回并再次单击该按钮? – CChi 2014-08-28 22:17:58

+0

@CChi,这有效。如果用户存在活动并返回,它就会起作用。问题在于,如果用户停留在活动中,并且想要点击按钮例如6次,则只有当他第一次点击该按钮时才有效。其他五次它不会做任何事情。 – user3339562 2014-08-28 22:19:48

+1

不要在主线程上使用无限循环,即使使用了某人提出的“sleep()”。你不需要经常检查变量的状态。只要开始接收广播时从onReceive()中“等待”的任何代码即可。 – 2014-08-29 00:13:04

回答

0

试试这个:

public void onPause() { 
    super.onPause(); 
    // getActivity().unregisterReceiver(mReceiver); 
} 

public void onDestroy() { 
    super.onDestroy(); 
    getActivity().unregisterReceiver(mReceiver); 
} 

说明:您应该管理无论是在onCreate()/onDestroy()onResume()/onPause()(相当于生命周期事件)的接收器。

编辑:让这种变化也(第二行设置flag参数):

Intent in = new Intent(FLAG); 
PendingIntent pIn = PendingIntent.getBroadcast(context, 1, in, PendingIntent.FLAG_UPDATE_CURRENT); 
SmsManager.getDefault().sendTextMessage("123456789", null, "text", pIn, null); 

不知道这是否会修复它,因为我不知道什么是0就意味着你使用标志值。 FLAG_UPDATE_CURRENT似乎是正确的。

编辑2

while(!mStatus){ 
} 

你不应该这样做!

+0

这是一样的。我认为这不应该成为问题,因为onPause()或onDestroy()根本不会被调用,因为用户停留在活动中并单击该按钮。 – user3339562 2014-08-28 22:31:53

+0

编辑我的答案;顺便说一下,接收器只是将布尔值设置为true。你究竟怎么知道它是否运行? – 2014-08-28 22:53:06

+0

我有一个布尔标志,当'onReceive()'触发时我设置了一个布尔标志,并且我把记录器放在了任何地方。所有记录器首次记录动作并将标志设置为true。其他时间根本没有记录和标记未设置。 – user3339562 2014-08-28 23:22:13